diff --git a/tools/actions/commit-queue.sh b/tools/actions/commit-queue.sh deleted file mode 100755 index 0c3c70da89f..00000000000 --- a/tools/actions/commit-queue.sh +++ /dev/null @@ -1,186 +0,0 @@ -#!/bin/sh - -set -xe - -UPSTREAM=origin -DEFAULT_BRANCH=main - -COMMIT_QUEUE_LABEL="commit-queue" -COMMIT_QUEUE_FAILED_LABEL="commit-queue-failed" -LACKS_SECOND_APPROVAL_LABEL="lacks-second-approval" - -cqurl="${GITHUB_SERVER_URL:?}/${GITHUB_REPOSITORY:?}/actions/runs/${GITHUB_RUN_ID:?}" - -escape_code_block_or_line() { - case $1 in - *" -"*|'') fence='```' sep=' -' ;; - *[![:space:]]*) fence='`' sep=' ' ;; - *) fence='`' sep='' ;; - esac - while case $1 in *"$fence"*) ;; *) false ;; esac; do - fence=$fence'`' - done - printf '%s%s%s%s%s\n' "$fence" "$sep" "$1" "$sep" "$fence" -} - -edit_pr_labels() { - pr=$1 - failure_mode=$2 - shift 2 - if gh -R "$GITHUB_REPOSITORY" pr edit "$pr" "$@"; then - return - fi - if [ "$failure_mode" = warn ]; then - echo "::warning::Failed to update labels for PR $pr" - return - fi - return 1 -} - -remove_labels_if_present() { - pr=$1 - shift - labels= - for label in "$@"; do - if jq -e --arg label "$label" \ - 'map(.name) | index($label)' < labels.json > /dev/null; then - labels="${labels}${labels:+,}${label}" - fi - done - - if [ -n "$labels" ]; then - edit_pr_labels "$pr" warn --remove-label "$labels" - fi -} - -commit_queue_failed() { - pr=$1 - reported_failure=${2:-} - - edit_pr_labels "$pr" required --add-label "$COMMIT_QUEUE_FAILED_LABEL" \ - --remove-label "$COMMIT_QUEUE_LABEL" - remove_labels_if_present "$pr" "$LACKS_SECOND_APPROVAL_LABEL" - - last_output_line=$(awk 'NF { line = $0 } END { sub(/^[[:space:]]*/, "", line); print line }' output) - # shellcheck disable=SC2016 - missing_policy_message='ℹ Add `commit-queue-squash` label to land the PR as one commit, or `commit-queue-rebase` to land as separate commits.' - if [ "$last_output_line" = "$missing_policy_message" ]; then - failure_body='This pull request has multiple commits, but no landing policy was selected. - -Add https://github.com/nodejs/node/labels/commit-queue-squash to land it as one commit, or https://github.com/nodejs/node/labels/commit-queue-rebase to land the commits separately.' - else - if [ -z "$reported_failure" ]; then - reported_failure=$(grep -e '✘' -e '✖' -e '⚠' output | tail -n 10) - fi - if [ -z "$reported_failure" ]; then - reported_failure=$(tail -n 10 output) - fi - if [ -z "$reported_failure" ]; then - reported_failure='No failure reason was reported.' - fi - failure_body=$(escape_code_block_or_line "$reported_failure") - fi - - raw_output=$(cat output) - - body="### Commit Queue failed - -$failure_body - -The pull request was removed from the Commit Queue and labeled https://github.com/nodejs/node/labels/commit-queue-failed. After resolving the failure, remove that label and add https://github.com/nodejs/node/labels/commit-queue to retry. - -
-Full Commit Queue output - -$(escape_code_block_or_line "$raw_output") - -
- -[View workflow run]($cqurl)" - echo "$body" - - gh -R "$GITHUB_REPOSITORY" pr comment "$pr" --body "$body" - - rm output -} - -SHOULD_ABORT= - -for pr in "$@"; do - gh -R "$GITHUB_REPOSITORY" pr view "$pr" --json labels --jq ".labels" > labels.json - - if jq -e 'map(.name) | index("commit-queue-squash")' < labels.json; then - MULTIPLE_COMMIT_POLICY="--fixupAll" - elif jq -e 'map(.name) | index("commit-queue-rebase")' < labels.json; then - MULTIPLE_COMMIT_POLICY="" - else - MULTIPLE_COMMIT_POLICY="--oneCommitMax" - fi - - if [ -n "$SHOULD_ABORT" ]; then - # If `git node land --abort` fails, we're in unknown state. Better to stop - # the script here, current PR was removed from the queue so it shouldn't - # interfere again in the future. - git node land --abort --yes - SHOULD_ABORT= - fi - - git node land --autorebase --yes $MULTIPLE_COMMIT_POLICY "$pr" >output 2>&1 || echo "Failed to land #${pr}" - # cat here otherwise we'll be suppressing the output of git node land - cat output - - # TODO(mmarchini): workaround for ncu not returning the expected status code, - # if the "Landed in..." message was not on the output we assume land failed - if ! grep -q '. Post "Landed in .*/pull/'"${pr}" output; then - commit_queue_failed "$pr" - # Using a variable as there's no point in aborting if there are no PRs left in the queue. - SHOULD_ABORT=1 - continue - fi - - if [ -z "$MULTIPLE_COMMIT_POLICY" ]; then - start_sha=$(git rev-parse $UPSTREAM/$DEFAULT_BRANCH) - end_sha=$(git rev-parse HEAD) - commits="${start_sha}...${end_sha}" - - if ! git push $UPSTREAM $DEFAULT_BRANCH >> output 2>&1; then - commit_queue_failed "$pr" \ - "Failed to push the landed commits to ${UPSTREAM}/${DEFAULT_BRANCH}." - continue - fi - else - # If there's only one commit, we can use the Squash and Merge feature from GitHub. - # TODO: use `gh pr merge` when the GitHub CLI allows to customize the commit title (https://github.com/cli/cli/issues/1023). - commit_title=$(git log -1 --pretty='format:%s') - commit_body=$(git log -1 --pretty='format:%b') - commit_head=$(grep 'Fetched commits as' output | cut -d. -f3 | xargs git rev-parse) - - if ! commits="$( - jq -cn \ - --arg title "${commit_title}" \ - --arg body "${commit_body}" \ - --arg head "${commit_head}" \ - '{merge_method:"squash",commit_title:$title,commit_message:$body,sha:$head}' |\ - gh api -X PUT "repos/${GITHUB_REPOSITORY}/pulls/${pr}/merge" --input -\ - --jq 'if .merged then .sha else halt_error end' 2>> output - )"; then - commit_queue_failed "$pr" \ - 'GitHub failed to squash and merge this pull request.' - continue - fi - fi - - rm output - - gh -R "$GITHUB_REPOSITORY" pr comment "$pr" --body "Landed in $commits" - - [ -z "$MULTIPLE_COMMIT_POLICY" ] && gh -R "$GITHUB_REPOSITORY" pr close "$pr" - - # Delete the commit queue labels (but ignore errors, it's no big deal if a closed PR still has them) - remove_labels_if_present "$pr" "$COMMIT_QUEUE_LABEL" \ - "$LACKS_SECOND_APPROVAL_LABEL" -done - -rm -f labels.json diff --git a/tools/actions/create-release-proposal.sh b/tools/actions/create-release-proposal.sh deleted file mode 100755 index 9240fa2ad7f..00000000000 --- a/tools/actions/create-release-proposal.sh +++ /dev/null @@ -1,139 +0,0 @@ -#!/bin/sh - -GITHUB_REPOSITORY=${GITHUB_REPOSITORY:-nodejs/node} -BOT_TOKEN=${BOT_TOKEN:-} - -RELEASE_DATE=$1 -RELEASE_LINE=$2 -RELEASER=$3 - -if [ -z "$RELEASE_DATE" ] || [ -z "$RELEASE_LINE" ]; then - echo "Usage: $0 " - exit 1 -fi - -if [ -z "$GITHUB_REPOSITORY" ] || [ -z "$BOT_TOKEN" ]; then - echo "Invalid value in env for GITHUB_REPOSITORY and BOT_TOKEN" - exit 1 -fi - -HAS_MISSING_DEPS= -for dep in node gh git git-node awk; do - command -v "$dep" > /dev/null || { - echo "Required dependency $dep is missing" >&2 - HAS_MISSING_DEPS=1 - } -done -[ -z "$HAS_MISSING_DEPS" ] || exit 1 - -set -xe - -git node release --prepare --skipBranchDiff --yes --releaseDate "$RELEASE_DATE" - -HEAD_BRANCH="$(git rev-parse --abbrev-ref HEAD)" -HEAD_SHA="$(git rev-parse HEAD^)" - -TITLE="$(git log -1 --format=%s)" - -# GH rest API has an undocumented limit of 65536 char for the body, setting it -# to 65534 to account for the ellipsis and the final EOL. -TEMP_BODY="$(awk -v MAX_BODY_LENGTH="65534" \ - "/^## ${RELEASE_DATE}/,/^ MAX_BODY_LENGTH) {exit 1;} - print - }" "doc/changelogs/CHANGELOG_V${RELEASE_LINE}.md" || echo "…")" - -# Create the proposal branch -gh api \ - --method POST \ - -H "Accept: application/vnd.github+json" \ - -H "X-GitHub-Api-Version: 2022-11-28" \ - "/repos/${GITHUB_REPOSITORY}/git/refs" \ - -f "ref=refs/heads/$HEAD_BRANCH" -f "sha=$HEAD_SHA" - -# Create the proposal PR -PR_URL="$(gh api \ - --method POST \ - --jq .html_url \ - -H "Accept: application/vnd.github+json" \ - -H "X-GitHub-Api-Version: 2022-11-28" \ - "/repos/${GITHUB_REPOSITORY}/pulls" \ - -f "title=$TITLE" -f "body=$TEMP_BODY" -f "head=$HEAD_BRANCH" -f "base=v$RELEASE_LINE.x" -f draft=true)" - -# Push the release commit to the proposal branch using `BOT_TOKEN` from the env -node --input-type=module - \ - "$GITHUB_REPOSITORY" \ - "$HEAD_BRANCH" \ - "$HEAD_SHA" \ - "$TITLE" \ - "$(git log -1 HEAD --format=%b | awk -v PR_URL="$PR_URL" '{sub(/^PR-URL: TODO$/, "PR-URL: " PR_URL)} 1' || true)" \ - "$(git show HEAD --diff-filter=d --name-only --format= || true)" \ - "$(git show HEAD --diff-filter=D --name-only --format= || true)" \ -<<'EOF' -const [,, - repo, - branch, - parentCommitSha, - commit_title, - commit_body, - modifiedOrAddedFiles, - deletedFiles, -] = process.argv; - -import { readFileSync } from 'node:fs'; -import util from 'node:util'; - -const query = ` -mutation ($repo: String! $branch: String!, $parentCommitSha: GitObjectID!, $changes: FileChanges!, $commit_title: String!, $commit_body: String) { - createCommitOnBranch(input: { - branch: { - repositoryNameWithOwner: $repo, - branchName: $branch - }, - message: { - headline: $commit_title, - body: $commit_body - }, - expectedHeadOid: $parentCommitSha, - fileChanges: $changes - }) { - commit { - url - } - } -} -`; -const response = await fetch('https://api.github.com/graphql', { - method: 'POST', - headers: { - 'Authorization': `bearer ${process.env.BOT_TOKEN}`, - }, - body: JSON.stringify({ - query, - variables: { - repo, - branch, - parentCommitSha, - commit_title, - commit_body, - changes: { - additions: modifiedOrAddedFiles.split('\n').filter(Boolean) - .map(path => ({ path, contents: readFileSync(path).toString('base64') })), - deletions: deletedFiles.split('\n').filter(Boolean), - } - }, - }) -}); -if (!response.ok) { - console.log({statusCode: response.status, statusText: response.statusText}); - process.exitCode ||= 1; -} -const data = await response.json(); -if (data.errors?.length) { - throw new Error('Endpoint returned an error', { cause: data }); -} -console.log(util.inspect(data, { depth: Infinity })); -EOF - -gh pr edit "$PR_URL" --add-label release --add-label "v$RELEASE_LINE.x" --add-assignee "$RELEASER" diff --git a/tools/actions/lint-release-proposal-commit-list.mjs b/tools/actions/lint-release-proposal-commit-list.mjs deleted file mode 100755 index a51f0c59002..00000000000 --- a/tools/actions/lint-release-proposal-commit-list.mjs +++ /dev/null @@ -1,93 +0,0 @@ -#!/usr/bin/env node - -// Takes a stream of JSON objects as inputs, validates the CHANGELOG contains a -// line corresponding, then outputs the prURL value. -// -// Example: -// $ git log upstream/vXX.x...upstream/vX.X.X-proposal \ -// --reverse --format='{"prURL":"%(trailers:key=PR-URL,valueonly,separator=)","title":"%s","smallSha":"%h"}' \ -// --abbrev=10 \ -// | sed 's/,"title":"Revert "\([^"]\+\)""/,"title":"Revert \\"\1\\""/g' \ -// | ./lint-release-proposal-commit-list.mjs "path/to/CHANGELOG.md" "$(git rev-parse upstream/vX.X.X-proposal)" - -const [,, CHANGELOG_PATH, RELEASE_COMMIT_SHA] = process.argv; - -import assert from 'node:assert'; -import { readFile } from 'node:fs/promises'; -import { createInterface } from 'node:readline'; - -// Creating the iterator early to avoid missing any data: -const stdinLineByLine = createInterface(process.stdin)[Symbol.asyncIterator](); - -const changelog = await readFile(CHANGELOG_PATH, 'utf-8'); -const commitListingStart = changelog.indexOf('\n### Commits\n'); -let commitList; -if (commitListingStart === -1) { - // We're preparing a semver-major release. - assert.match(changelog, /\n### Semver-Major Commits\n/); - // The proposal should contain only the release commit. - commitList = ''; -} else { - // We can't assume the Commits section is the one for this release in case of - // a release to transition to LTS (i.e. with no commits). - const releaseStart = /\n<\/a>\n\n## \d+-\d+-\d+, Version \1/.exec(changelog); - assert.ok(releaseStart, 'Could not determine the start of the release section'); - const releaseEnd = changelog.indexOf('\n\n lineStart, `Changelog entry doesn't match for ${smallSha}`); - } catch (e) { - if (e?.code === 'ERR_ASSERTION') { - e.operator = 'includes'; - e.expected = expectedCommitTitle; - e.actual = commitList.slice(lineStart + 1, lineEnd); - } - throw e; - } - assert.strictEqual(commitList.slice(lineEnd - prURL.length - 2, lineEnd), `(${prURL})`, `when checking ${smallSha} ${title}`); - - } catch (e) { - if (e?.code !== 'ERR_ASSERTION') { - throw e; - } - let line = 1; - for (let i = 0; i < lineStart + commitListingStart; i = changelog.indexOf('\n', i + 1)) { - line++; - } - console.error(`::error file=${CHANGELOG_PATH},line=${line},title=Release proposal linter::${e.message}`); - console.error(e); - process.exitCode ||= 1; - } - expectedNumberOfCommitsLeft--; - console.log(prURL); -} -assert.strictEqual(expectedNumberOfCommitsLeft, 0, 'Release commit is not the last commit in the proposal'); diff --git a/tools/actions/merge.sh b/tools/actions/merge.sh deleted file mode 100755 index b811c18eb2c..00000000000 --- a/tools/actions/merge.sh +++ /dev/null @@ -1,73 +0,0 @@ -#!/bin/sh - -# Requires [gh](https://cli.github.com/), [jq](https://jqlang.github.io), git, and grep. Also awk if you pass a URL. - -# This script can be used to "purple-merge" PRs that are supposed to land as a single commit, using the "Squash and Merge" feature of GitHub. -# To land a PR with this tool: -# 1. Run `git node land --fixupAll` -# 2. Copy the hash of the commit at the top of the PR branch. -# 3. Run `tools/actions/merge.sh ` or `tools/actions/merge.sh `. - -set -xe - -pr=$1 -commit_head=$2 - -OWNER=nodejs -REPOSITORY=node - -if expr "X$pr" : 'Xhttps://github.com/[^/]\{1,\}/[^/]\{1,\}/pull/[0-9]\{1,\}' >/dev/null; then - OWNER="$(echo "$pr" | awk 'BEGIN { FS = "/" } ; { print $4 }')" - REPOSITORY="$(echo "$pr" | awk 'BEGIN { FS = "/" } ; { print $5 }')" - [ -n "$commit_head" ] || commit_head="$(echo "$pr" | awk 'BEGIN { FS = "/" } ; { print $9 }')" - pr="$(echo "$pr" | awk 'BEGIN { FS = "/" } ; { print $7 }')" -fi - -validation_error= -if ! expr "X${pr}X" : 'X[0-9]\{1,\}X' >/dev/null; then - set +x - echo "Invalid PR ID: $pr" - validation_error=1 -fi -if ! expr "X${commit_head}X" : 'X[a-f0-9]\{40\}X' >/dev/null; then - set +x - echo "Invalid PR head: $commit_head" - validation_error=1 -fi -[ -z "$validation_error" ] || { - echo 'Usage:' - printf '\t%s \n' "$0" - echo 'or:' - printf '\t%s \n' "$0" - echo 'Examples:' - printf '\t%s 12345 aaaaabbbbbcccccdddddeeeeefffff1111122222\n' "$0" - printf '\t%s https://github.com/%s/pull/12345 aaaaabbbbbcccccdddddeeeeefffff1111122222\n' "$0" "$OWNER/$REPOSITORY" - printf '\t%s https://github.com/%s/pull/12345/commits/aaaaabbbbbcccccdddddeeeeefffff1111122222\n' "$0" "$OWNER/$REPOSITORY" - exit 1 -} - -git log -1 HEAD --pretty='format:%B' | git interpret-trailers --parse --no-divider | \ - grep -q -x "^PR-URL: https://github.com/$OWNER/$REPOSITORY/pull/$pr$" || { - echo "Invalid PR-URL trailer - have you run 'git node land' to add it?" - exit 1 - } -git log -1 HEAD^ --pretty='format:%B' | git interpret-trailers --parse --no-divider | \ - grep -q -x "^PR-URL: https://github.com/$OWNER/$REPOSITORY/pull/$pr$" && { - echo "Refuse to squash and merge a PR landing in more than one commit" - exit 1 - } - -commit_title=$(git log -1 --pretty='format:%s') -commit_body=$(git log -1 --pretty='format:%b') - -commitSHA="$( - jq -cn \ - --arg title "${commit_title}" \ - --arg body "${commit_body}" \ - --arg head "${commit_head}" \ - '{merge_method:"squash",commit_title:$title,commit_message:$body,sha:$head}' |\ - gh api -X PUT "repos/${OWNER}/${REPOSITORY}/pulls/${pr}/merge" --input -\ - --jq 'if .merged then .sha else halt_error end' -)" - -gh pr comment "$pr" --repo "$OWNER/$REPOSITORY" --body "Landed in $commitSHA" diff --git a/tools/actions/rebase.sh b/tools/actions/rebase.sh deleted file mode 100755 index 6fdf07af0b8..00000000000 --- a/tools/actions/rebase.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh - -set -xe - -# shellcheck disable=SC2016 -gh api graphql -F "prID=$(gh pr view "$1" --json id --jq .id || true)" -f query=' -mutation RebasePR($prID: ID!) { - updatePullRequestBranch(input:{pullRequestId:$prID,updateMethod:REBASE}) { - clientMutationId - } -}' diff --git a/tools/actions/review_backport.sh b/tools/actions/review_backport.sh deleted file mode 100755 index 57b46c799e6..00000000000 --- a/tools/actions/review_backport.sh +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/sh - -BACKPORT_PR=$1 - -[ -x "$(command -v gh || true)" ] || { - # shellcheck disable=SC2016 - echo 'Missing required `gh` dependency' >&2 - exit 1 -} -[ -n "$BACKPORT_PR" ] || { - echo "Usage:" >&2 - echo 'tools/actions/review_backport.sh https://github.com/nodejs/node/pull/ | less' >&2 - echo 'DIFF_CMD="codium --wait --diff" tools/actions/review_backport.sh https://github.com/nodejs/node/pull/' >&2 - echo "Limitations: This tools only supports PRs that landed as single commit, e.g. with 'commit-queue-squash' label." >&2 - - exit 1 -} - -SED_CMD='s/^index [a-f0-9]\+..[a-f0-9]\+ \([0-7]\{6\}\)$/index eeeeeeeeee..eeeeeeeeee \1/g;s/^@@ -[0-9]\+,[0-9]\+ +[0-9]\+,[0-9]\+ @@/@@ -111,1 +111,1 @@/' - -set -ex - -BACKPORT_PR_URL=$(gh pr view "$BACKPORT_PR" --json url --jq .url) - -ORIGINAL=$(mktemp) -BACKPORT=$(mktemp) -trap 'set -x; rm -f "$ORIGINAL" "$BACKPORT"; set +x; trap - EXIT; exit' EXIT INT HUP - -gh pr view "$BACKPORT_PR" --json commits --jq '.[] | map([ .oid, (.messageBody | match("(?:^|\\n)PR-URL: (https?://.+/pull/\\d+)(?:\\n|$)", "g") | .captures | last | .string)] | @tsv) | .[]' \ -| while read -r LINE; do - COMMIT_SHA=$(echo "$LINE" | cut -f1) - PR_URL=$(echo "$LINE" | cut -f2) - - curl -fsL "$PR_URL.diff" | sed "$SED_CMD" >> "$ORIGINAL" - curl -fsL "$BACKPORT_PR_URL/commits/$COMMIT_SHA.diff" | sed "$SED_CMD" >> "$BACKPORT" -done - -${DIFF_CMD:-diff} "$ORIGINAL" "$BACKPORT" || echo "diff command exited with $?" >&2 - -set +x - -printf "Approve the PR using gh? [y/N] " -read -r r -[ "$r" != "y" ] || { - set -x - gh pr review "$BACKPORT_PR" --approve -} diff --git a/tools/actions/start-ci.sh b/tools/actions/start-ci.sh deleted file mode 100755 index a9ae07a365e..00000000000 --- a/tools/actions/start-ci.sh +++ /dev/null @@ -1,63 +0,0 @@ -#!/bin/sh - -set -xe - -REQUEST_CI_LABEL="request-ci" -REQUEST_CI_FAILED_LABEL="request-ci-failed" -cqurl="${GITHUB_SERVER_URL:?}/${GITHUB_REPOSITORY:?}/actions/runs/${GITHUB_RUN_ID:?}" - -escape_code_block_or_line() { - case $1 in - *" -"*|'') fence='```' sep=' -' ;; - *[![:space:]]*) fence='`' sep=' ' ;; - *) fence='`' sep='' ;; - esac - while case $1 in *"$fence"*) ;; *) false ;; esac; do - fence=$fence'`' - done - printf '%s%s%s%s%s\n' "$fence" "$sep" "$1" "$sep" "$fence" -} - -for pr in "$@"; do - gh -R "$GITHUB_REPOSITORY" pr edit "$pr" --remove-label "$REQUEST_CI_LABEL" - - ci_started=yes - rm -f output; - ncu-ci run --check-for-duplicates "$pr" >output 2>&1 || ci_started=no - cat output - - if [ "$ci_started" = "no" ]; then - # Do we need to reset? - gh -R "$GITHUB_REPOSITORY" pr edit "$pr" --add-label "$REQUEST_CI_FAILED_LABEL" - - reported_failure=$(grep -e '✘' -e '✖' -e '⚠' -e 'ℹ' output | tail -n 10) - if [ -z "$reported_failure" ]; then - reported_failure=$(tail -n 10 output) - fi - if [ -z "$reported_failure" ]; then - reported_failure='No failure reason was reported.' - fi - failure_body=$(escape_code_block_or_line "$reported_failure") - raw_output=$(cat output) - - body="### Failed to start CI - -$failure_body - -
-Full Auto Start CI output - -$(escape_code_block_or_line "$raw_output") - -
- -[View workflow run]($cqurl)" - echo "$body" - - gh -R "$GITHUB_REPOSITORY" pr comment "$pr" --body "$body" - - rm output - fi -done; diff --git a/tools/build_addons.py b/tools/build_addons.py deleted file mode 100755 index e985d6f67a4..00000000000 --- a/tools/build_addons.py +++ /dev/null @@ -1,151 +0,0 @@ -#!/usr/bin/env python3 - -import argparse -import os -import shutil -import subprocess -import sys -import tempfile -from concurrent.futures import ThreadPoolExecutor - -ROOT_DIR = os.path.abspath(os.path.join(__file__, '..', '..')) - -# Run install.py to install headers. -def generate_headers(headers_dir, install_args): - print('Generating headers') - subprocess.check_call([ - sys.executable, - os.path.join(ROOT_DIR, 'tools/install.py'), - 'install', - '--silent', - '--headers-only', - '--prefix', '/', - '--dest-dir', headers_dir, - ] + install_args) - -# Rebuild addons in parallel. -def rebuild_addons(args): - headers_dir = os.path.abspath(args.headers_dir) - out_dir = os.path.abspath(args.out_dir) - node_bin = os.path.join(out_dir, 'node') - if args.is_win: - node_bin += '.exe' - - if os.path.isabs(args.node_gyp): - node_gyp = args.node_gyp - else: - node_gyp = os.path.join(ROOT_DIR, args.node_gyp) - - # Copy node.lib. - if args.is_win: - node_lib_dir = os.path.join(headers_dir, args.config) - os.makedirs(node_lib_dir) - shutil.copy2(os.path.join(args.out_dir, 'node.lib'), - os.path.join(node_lib_dir, 'node.lib')) - - def node_gyp_rebuild(test_dir): - print('Building addon in', test_dir) - try: - process = subprocess.Popen([ - node_bin, - node_gyp, - 'rebuild', - '--directory', test_dir, - '--nodedir', headers_dir, - '--python', sys.executable, - '--loglevel', args.loglevel, - ], stdout=subprocess.PIPE, stderr=subprocess.PIPE) - - # We buffer the output and print it out once the process is done in order - # to avoid interleaved output from multiple builds running at once. - stdout, stderr = process.communicate() - return_code = process.returncode - if return_code != 0: - print(f'Failed to build addon in {test_dir}:') - if stdout: - print(stdout.decode()) - if stderr: - print(stderr.decode()) - return return_code - - except Exception as e: - print(f'Unexpected error when building addon in {test_dir}. Error: {e}') - - test_dirs = [] - skip_tests = args.skip_tests.split(',') - only_tests = args.only_tests.split(',') if args.only_tests else None - for child_dir in os.listdir(args.target): - full_path = os.path.join(args.target, child_dir) - if not os.path.isdir(full_path): - continue - if 'binding.gyp' not in os.listdir(full_path): - continue - if child_dir in skip_tests: - continue - if only_tests and child_dir not in only_tests: - continue - test_dirs.append(full_path) - - with ThreadPoolExecutor() as executor: - codes = executor.map(node_gyp_rebuild, test_dirs) - return 0 if all(code == 0 for code in codes) else 1 - -def get_default_out_dir(args): - default_out_dir = os.path.join('out', args.config) - if not args.is_win: - # POSIX platforms only have one out dir. - return default_out_dir - # On Windows depending on the args of GYP and configure script, the out dir - # could be 'out/Release', 'out/Debug' or just 'Release' or 'Debug'. - if os.path.exists(default_out_dir): - return default_out_dir - if os.path.exists(args.config): - return args.config - raise RuntimeError('Cannot find out dir, did you run build?') - -def main(): - if sys.platform == 'cygwin': - raise RuntimeError('This script does not support running with cygwin python.') - - parser = argparse.ArgumentParser( - description='Install headers and rebuild child directories') - parser.add_argument('target', help='target directory to build addons') - parser.add_argument('--headers-dir', - help='path to node headers directory, if not specified ' - 'new headers will be generated for building', - default=None) - parser.add_argument('--out-dir', help='path to the output directory', - default=None) - parser.add_argument('--loglevel', help='loglevel of node-gyp', - default='silent') - parser.add_argument('--skip-tests', help='skip building tests', - default='') - parser.add_argument('--only-tests', help='only build tests in the list', - default='') - parser.add_argument('--node-gyp', help='path to node-gyp script', - default='deps/npm/node_modules/node-gyp/bin/node-gyp.js') - parser.add_argument('--is-win', help='build for Windows target', - action='store_true', default=(sys.platform == 'win32')) - parser.add_argument('--config', help='build config (Release or Debug)', - default='Release') - args, unknown_args = parser.parse_known_args() - - if not args.out_dir: - args.out_dir = get_default_out_dir(args) - - exit_code = 1 - if args.headers_dir: - exit_code = rebuild_addons(args) - else: - # When --headers-dir is not specified, generate headers into a temp dir and - # build with the new headers. - try: - args.headers_dir = tempfile.mkdtemp() - generate_headers(args.headers_dir, unknown_args) - exit_code = rebuild_addons(args) - finally: - shutil.rmtree(args.headers_dir) - return exit_code - -if __name__ == '__main__': - sys.exit(main()) diff --git a/tools/certdata.txt b/tools/certdata.txt deleted file mode 100644 index f2f8edc685a..00000000000 --- a/tools/certdata.txt +++ /dev/null @@ -1,25600 +0,0 @@ -# -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - -# -# certdata.txt -# -# This file contains the object definitions for the certs and other -# information "built into" NSS. -# -# Object definitions: -# -# Certificates -# -# -- Attribute -- -- type -- -- value -- -# CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -# CKA_TOKEN CK_BBOOL CK_TRUE -# CKA_PRIVATE CK_BBOOL CK_FALSE -# CKA_MODIFIABLE CK_BBOOL CK_FALSE -# CKA_LABEL UTF8 (varies) -# CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -# CKA_SUBJECT DER+base64 (varies) -# CKA_ID byte array (varies) -# CKA_ISSUER DER+base64 (varies) -# CKA_SERIAL_NUMBER DER+base64 (varies) -# CKA_VALUE DER+base64 (varies) -# CKA_NSS_EMAIL ASCII7 (unused here) -# CKA_NSS_SERVER_DISTRUST_AFTER DER+base64 (varies) -# CKA_NSS_EMAIL_DISTRUST_AFTER DER+base64 (varies) -# -# Trust -# -# -- Attribute -- -- type -- -- value -- -# CKA_CLASS CK_OBJECT_CLASS CKO_TRUST -# CKA_TOKEN CK_BBOOL CK_TRUE -# CKA_PRIVATE CK_BBOOL CK_FALSE -# CKA_MODIFIABLE CK_BBOOL CK_FALSE -# CKA_LABEL UTF8 (varies) -# CKA_ISSUER DER+base64 (varies) -# CKA_SERIAL_NUMBER DER+base64 (varies) -# CKA_CERT_HASH binary+base64 (varies) -# CKA_EXPIRES CK_DATE (not used here) -# CKA_TRUST_DIGITAL_SIGNATURE CK_TRUST (varies) -# CKA_TRUST_NON_REPUDIATION CK_TRUST (varies) -# CKA_TRUST_KEY_ENCIPHERMENT CK_TRUST (varies) -# CKA_TRUST_DATA_ENCIPHERMENT CK_TRUST (varies) -# CKA_TRUST_KEY_AGREEMENT CK_TRUST (varies) -# CKA_TRUST_KEY_CERT_SIGN CK_TRUST (varies) -# CKA_TRUST_CRL_SIGN CK_TRUST (varies) -# CKA_TRUST_SERVER_AUTH CK_TRUST (varies) -# CKA_TRUST_CLIENT_AUTH CK_TRUST (varies) -# CKA_TRUST_CODE_SIGNING CK_TRUST (varies) -# CKA_TRUST_EMAIL_PROTECTION CK_TRUST (varies) -# CKA_TRUST_IPSEC_END_SYSTEM CK_TRUST (varies) -# CKA_TRUST_IPSEC_TUNNEL CK_TRUST (varies) -# CKA_TRUST_IPSEC_USER CK_TRUST (varies) -# CKA_TRUST_TIME_STAMPING CK_TRUST (varies) -# CKA_TRUST_STEP_UP_APPROVED CK_BBOOL (varies) -# (other trust attributes can be defined) -# - -# -# The object to tell NSS that this is a root list and we don't -# have to go looking for others. -# -BEGINDATA -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_BUILTIN_ROOT_LIST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Mozilla Builtin Roots" - -# -# Certificate "GlobalSign Root CA" -# -# Issuer: CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE -# Serial Number:04:00:00:00:00:01:15:4b:5a:c3:94 -# Subject: CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE -# Not Valid Before: Tue Sep 01 12:00:00 1998 -# Not Valid After : Fri Jan 28 12:00:00 2028 -# Fingerprint (SHA-256): EB:D4:10:40:E4:BB:3E:C7:42:C9:E3:81:D3:1E:F2:A4:1A:48:B6:68:5C:96:E7:CE:F3:C1:DF:6C:D4:33:1C:99 -# Fingerprint (SHA1): B1:BC:96:8B:D4:F4:9D:62:2A:A8:9A:81:F2:15:01:52:A4:1D:82:9C -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "GlobalSign Root CA" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\127\061\013\060\011\006\003\125\004\006\023\002\102\105\061 -\031\060\027\006\003\125\004\012\023\020\107\154\157\142\141\154 -\123\151\147\156\040\156\166\055\163\141\061\020\060\016\006\003 -\125\004\013\023\007\122\157\157\164\040\103\101\061\033\060\031 -\006\003\125\004\003\023\022\107\154\157\142\141\154\123\151\147 -\156\040\122\157\157\164\040\103\101 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\127\061\013\060\011\006\003\125\004\006\023\002\102\105\061 -\031\060\027\006\003\125\004\012\023\020\107\154\157\142\141\154 -\123\151\147\156\040\156\166\055\163\141\061\020\060\016\006\003 -\125\004\013\023\007\122\157\157\164\040\103\101\061\033\060\031 -\006\003\125\004\003\023\022\107\154\157\142\141\154\123\151\147 -\156\040\122\157\157\164\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\013\004\000\000\000\000\001\025\113\132\303\224 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\003\165\060\202\002\135\240\003\002\001\002\002\013\004 -\000\000\000\000\001\025\113\132\303\224\060\015\006\011\052\206 -\110\206\367\015\001\001\005\005\000\060\127\061\013\060\011\006 -\003\125\004\006\023\002\102\105\061\031\060\027\006\003\125\004 -\012\023\020\107\154\157\142\141\154\123\151\147\156\040\156\166 -\055\163\141\061\020\060\016\006\003\125\004\013\023\007\122\157 -\157\164\040\103\101\061\033\060\031\006\003\125\004\003\023\022 -\107\154\157\142\141\154\123\151\147\156\040\122\157\157\164\040 -\103\101\060\036\027\015\071\070\060\071\060\061\061\062\060\060 -\060\060\132\027\015\062\070\060\061\062\070\061\062\060\060\060 -\060\132\060\127\061\013\060\011\006\003\125\004\006\023\002\102 -\105\061\031\060\027\006\003\125\004\012\023\020\107\154\157\142 -\141\154\123\151\147\156\040\156\166\055\163\141\061\020\060\016 -\006\003\125\004\013\023\007\122\157\157\164\040\103\101\061\033 -\060\031\006\003\125\004\003\023\022\107\154\157\142\141\154\123 -\151\147\156\040\122\157\157\164\040\103\101\060\202\001\042\060 -\015\006\011\052\206\110\206\367\015\001\001\001\005\000\003\202 -\001\017\000\060\202\001\012\002\202\001\001\000\332\016\346\231 -\215\316\243\343\117\212\176\373\361\213\203\045\153\352\110\037 -\361\052\260\271\225\021\004\275\360\143\321\342\147\146\317\034 -\335\317\033\110\053\356\215\211\216\232\257\051\200\145\253\351 -\307\055\022\313\253\034\114\160\007\241\075\012\060\315\025\215 -\117\370\335\324\214\120\025\034\357\120\356\304\056\367\374\351 -\122\362\221\175\340\155\325\065\060\216\136\103\163\362\101\351 -\325\152\343\262\211\072\126\071\070\157\006\074\210\151\133\052 -\115\305\247\124\270\154\211\314\233\371\074\312\345\375\211\365 -\022\074\222\170\226\326\334\164\156\223\104\141\321\215\307\106 -\262\165\016\206\350\031\212\325\155\154\325\170\026\225\242\351 -\310\012\070\353\362\044\023\117\163\124\223\023\205\072\033\274 -\036\064\265\213\005\214\271\167\213\261\333\037\040\221\253\011 -\123\156\220\316\173\067\164\271\160\107\221\042\121\143\026\171 -\256\261\256\101\046\010\310\031\053\321\106\252\110\326\144\052 -\327\203\064\377\054\052\301\154\031\103\112\007\205\347\323\174 -\366\041\150\357\352\362\122\237\177\223\220\317\002\003\001\000 -\001\243\102\060\100\060\016\006\003\125\035\017\001\001\377\004 -\004\003\002\001\006\060\017\006\003\125\035\023\001\001\377\004 -\005\060\003\001\001\377\060\035\006\003\125\035\016\004\026\004 -\024\140\173\146\032\105\015\227\312\211\120\057\175\004\315\064 -\250\377\374\375\113\060\015\006\011\052\206\110\206\367\015\001 -\001\005\005\000\003\202\001\001\000\326\163\347\174\117\166\320 -\215\277\354\272\242\276\064\305\050\062\265\174\374\154\234\054 -\053\275\011\236\123\277\153\136\252\021\110\266\345\010\243\263 -\312\075\141\115\323\106\011\263\076\303\240\343\143\125\033\362 -\272\357\255\071\341\103\271\070\243\346\057\212\046\073\357\240 -\120\126\371\306\012\375\070\315\304\013\160\121\224\227\230\004 -\337\303\137\224\325\025\311\024\101\234\304\135\165\144\025\015 -\377\125\060\354\206\217\377\015\357\054\271\143\106\366\252\374 -\337\274\151\375\056\022\110\144\232\340\225\360\246\357\051\217 -\001\261\025\265\014\035\245\376\151\054\151\044\170\036\263\247 -\034\161\142\356\312\310\227\254\027\135\212\302\370\107\206\156 -\052\304\126\061\225\320\147\211\205\053\371\154\246\135\106\235 -\014\252\202\344\231\121\335\160\267\333\126\075\141\344\152\341 -\134\326\366\376\075\336\101\314\007\256\143\122\277\123\123\364 -\053\351\307\375\266\367\202\137\205\322\101\030\333\201\263\004 -\034\305\037\244\200\157\025\040\311\336\014\210\012\035\326\146 -\125\342\374\110\311\051\046\151\340 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "GlobalSign Root CA" -# Issuer: CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE -# Serial Number:04:00:00:00:00:01:15:4b:5a:c3:94 -# Subject: CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE -# Not Valid Before: Tue Sep 01 12:00:00 1998 -# Not Valid After : Fri Jan 28 12:00:00 2028 -# Fingerprint (SHA-256): EB:D4:10:40:E4:BB:3E:C7:42:C9:E3:81:D3:1E:F2:A4:1A:48:B6:68:5C:96:E7:CE:F3:C1:DF:6C:D4:33:1C:99 -# Fingerprint (SHA1): B1:BC:96:8B:D4:F4:9D:62:2A:A8:9A:81:F2:15:01:52:A4:1D:82:9C -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "GlobalSign Root CA" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\261\274\226\213\324\364\235\142\052\250\232\201\362\025\001\122 -\244\035\202\234 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\076\105\122\025\011\121\222\341\267\135\067\237\261\207\051\212 -END -CKA_ISSUER MULTILINE_OCTAL -\060\127\061\013\060\011\006\003\125\004\006\023\002\102\105\061 -\031\060\027\006\003\125\004\012\023\020\107\154\157\142\141\154 -\123\151\147\156\040\156\166\055\163\141\061\020\060\016\006\003 -\125\004\013\023\007\122\157\157\164\040\103\101\061\033\060\031 -\006\003\125\004\003\023\022\107\154\157\142\141\154\123\151\147 -\156\040\122\157\157\164\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\013\004\000\000\000\000\001\025\113\132\303\224 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Entrust.net Premium 2048 Secure Server CA" -# -# Issuer: CN=Entrust.net Certification Authority (2048),OU=(c) 1999 Entrust.net Limited,OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.),O=Entrust.net -# Serial Number: 946069240 (0x3863def8) -# Subject: CN=Entrust.net Certification Authority (2048),OU=(c) 1999 Entrust.net Limited,OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.),O=Entrust.net -# Not Valid Before: Fri Dec 24 17:50:51 1999 -# Not Valid After : Tue Jul 24 14:15:12 2029 -# Fingerprint (SHA-256): 6D:C4:71:72:E0:1C:BC:B0:BF:62:58:0D:89:5F:E2:B8:AC:9A:D4:F8:73:80:1E:0C:10:B9:C8:37:D2:1E:B1:77 -# Fingerprint (SHA1): 50:30:06:09:1D:97:D4:F5:AE:39:F7:CB:E7:92:7D:7D:65:2D:34:31 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Entrust.net Premium 2048 Secure Server CA" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\201\264\061\024\060\022\006\003\125\004\012\023\013\105\156 -\164\162\165\163\164\056\156\145\164\061\100\060\076\006\003\125 -\004\013\024\067\167\167\167\056\145\156\164\162\165\163\164\056 -\156\145\164\057\103\120\123\137\062\060\064\070\040\151\156\143 -\157\162\160\056\040\142\171\040\162\145\146\056\040\050\154\151 -\155\151\164\163\040\154\151\141\142\056\051\061\045\060\043\006 -\003\125\004\013\023\034\050\143\051\040\061\071\071\071\040\105 -\156\164\162\165\163\164\056\156\145\164\040\114\151\155\151\164 -\145\144\061\063\060\061\006\003\125\004\003\023\052\105\156\164 -\162\165\163\164\056\156\145\164\040\103\145\162\164\151\146\151 -\143\141\164\151\157\156\040\101\165\164\150\157\162\151\164\171 -\040\050\062\060\064\070\051 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\201\264\061\024\060\022\006\003\125\004\012\023\013\105\156 -\164\162\165\163\164\056\156\145\164\061\100\060\076\006\003\125 -\004\013\024\067\167\167\167\056\145\156\164\162\165\163\164\056 -\156\145\164\057\103\120\123\137\062\060\064\070\040\151\156\143 -\157\162\160\056\040\142\171\040\162\145\146\056\040\050\154\151 -\155\151\164\163\040\154\151\141\142\056\051\061\045\060\043\006 -\003\125\004\013\023\034\050\143\051\040\061\071\071\071\040\105 -\156\164\162\165\163\164\056\156\145\164\040\114\151\155\151\164 -\145\144\061\063\060\061\006\003\125\004\003\023\052\105\156\164 -\162\165\163\164\056\156\145\164\040\103\145\162\164\151\146\151 -\143\141\164\151\157\156\040\101\165\164\150\157\162\151\164\171 -\040\050\062\060\064\070\051 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\004\070\143\336\370 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\004\052\060\202\003\022\240\003\002\001\002\002\004\070 -\143\336\370\060\015\006\011\052\206\110\206\367\015\001\001\005 -\005\000\060\201\264\061\024\060\022\006\003\125\004\012\023\013 -\105\156\164\162\165\163\164\056\156\145\164\061\100\060\076\006 -\003\125\004\013\024\067\167\167\167\056\145\156\164\162\165\163 -\164\056\156\145\164\057\103\120\123\137\062\060\064\070\040\151 -\156\143\157\162\160\056\040\142\171\040\162\145\146\056\040\050 -\154\151\155\151\164\163\040\154\151\141\142\056\051\061\045\060 -\043\006\003\125\004\013\023\034\050\143\051\040\061\071\071\071 -\040\105\156\164\162\165\163\164\056\156\145\164\040\114\151\155 -\151\164\145\144\061\063\060\061\006\003\125\004\003\023\052\105 -\156\164\162\165\163\164\056\156\145\164\040\103\145\162\164\151 -\146\151\143\141\164\151\157\156\040\101\165\164\150\157\162\151 -\164\171\040\050\062\060\064\070\051\060\036\027\015\071\071\061 -\062\062\064\061\067\065\060\065\061\132\027\015\062\071\060\067 -\062\064\061\064\061\065\061\062\132\060\201\264\061\024\060\022 -\006\003\125\004\012\023\013\105\156\164\162\165\163\164\056\156 -\145\164\061\100\060\076\006\003\125\004\013\024\067\167\167\167 -\056\145\156\164\162\165\163\164\056\156\145\164\057\103\120\123 -\137\062\060\064\070\040\151\156\143\157\162\160\056\040\142\171 -\040\162\145\146\056\040\050\154\151\155\151\164\163\040\154\151 -\141\142\056\051\061\045\060\043\006\003\125\004\013\023\034\050 -\143\051\040\061\071\071\071\040\105\156\164\162\165\163\164\056 -\156\145\164\040\114\151\155\151\164\145\144\061\063\060\061\006 -\003\125\004\003\023\052\105\156\164\162\165\163\164\056\156\145 -\164\040\103\145\162\164\151\146\151\143\141\164\151\157\156\040 -\101\165\164\150\157\162\151\164\171\040\050\062\060\064\070\051 -\060\202\001\042\060\015\006\011\052\206\110\206\367\015\001\001 -\001\005\000\003\202\001\017\000\060\202\001\012\002\202\001\001 -\000\255\115\113\251\022\206\262\352\243\040\007\025\026\144\052 -\053\113\321\277\013\112\115\216\355\200\166\245\147\267\170\100 -\300\163\102\310\150\300\333\123\053\335\136\270\166\230\065\223 -\213\032\235\174\023\072\016\037\133\267\036\317\345\044\024\036 -\261\201\251\215\175\270\314\153\113\003\361\002\014\334\253\245 -\100\044\000\177\164\224\241\235\010\051\263\210\013\365\207\167 -\235\125\315\344\303\176\327\152\144\253\205\024\206\225\133\227 -\062\120\157\075\310\272\146\014\343\374\275\270\111\301\166\211 -\111\031\375\300\250\275\211\243\147\057\306\237\274\161\031\140 -\270\055\351\054\311\220\166\146\173\224\342\257\170\326\145\123 -\135\074\326\234\262\317\051\003\371\057\244\120\262\324\110\316 -\005\062\125\212\375\262\144\114\016\344\230\007\165\333\177\337 -\271\010\125\140\205\060\051\371\173\110\244\151\206\343\065\077 -\036\206\135\172\172\025\275\357\000\216\025\042\124\027\000\220 -\046\223\274\016\111\150\221\277\370\107\323\235\225\102\301\016 -\115\337\157\046\317\303\030\041\142\146\103\160\326\325\300\007 -\341\002\003\001\000\001\243\102\060\100\060\016\006\003\125\035 -\017\001\001\377\004\004\003\002\001\006\060\017\006\003\125\035 -\023\001\001\377\004\005\060\003\001\001\377\060\035\006\003\125 -\035\016\004\026\004\024\125\344\201\321\021\200\276\330\211\271 -\010\243\061\371\241\044\011\026\271\160\060\015\006\011\052\206 -\110\206\367\015\001\001\005\005\000\003\202\001\001\000\073\233 -\217\126\233\060\347\123\231\174\172\171\247\115\227\327\031\225 -\220\373\006\037\312\063\174\106\143\217\226\146\044\372\100\033 -\041\047\312\346\162\163\362\117\376\061\231\375\310\014\114\150 -\123\306\200\202\023\230\372\266\255\332\135\075\361\316\156\366 -\025\021\224\202\014\356\077\225\257\021\253\017\327\057\336\037 -\003\217\127\054\036\311\273\232\032\104\225\353\030\117\246\037 -\315\175\127\020\057\233\004\011\132\204\265\156\330\035\072\341 -\326\236\321\154\171\136\171\034\024\305\343\320\114\223\073\145 -\074\355\337\075\276\246\345\225\032\303\265\031\303\275\136\133 -\273\377\043\357\150\031\313\022\223\047\134\003\055\157\060\320 -\036\266\032\254\336\132\367\321\252\250\047\246\376\171\201\304 -\171\231\063\127\272\022\260\251\340\102\154\223\312\126\336\376 -\155\204\013\010\213\176\215\352\327\230\041\306\363\347\074\171 -\057\136\234\321\114\025\215\341\354\042\067\314\232\103\013\227 -\334\200\220\215\263\147\233\157\110\010\025\126\317\277\361\053 -\174\136\232\166\351\131\220\305\174\203\065\021\145\121 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -# For Server Distrust After: Sat Nov 30 23:59:59 2024 -CKA_NSS_SERVER_DISTRUST_AFTER MULTILINE_OCTAL -\062\064\061\061\063\060\062\063\065\071\065\071\132 -END -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Entrust.net Premium 2048 Secure Server CA" -# Issuer: CN=Entrust.net Certification Authority (2048),OU=(c) 1999 Entrust.net Limited,OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.),O=Entrust.net -# Serial Number: 946069240 (0x3863def8) -# Subject: CN=Entrust.net Certification Authority (2048),OU=(c) 1999 Entrust.net Limited,OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.),O=Entrust.net -# Not Valid Before: Fri Dec 24 17:50:51 1999 -# Not Valid After : Tue Jul 24 14:15:12 2029 -# Fingerprint (SHA-256): 6D:C4:71:72:E0:1C:BC:B0:BF:62:58:0D:89:5F:E2:B8:AC:9A:D4:F8:73:80:1E:0C:10:B9:C8:37:D2:1E:B1:77 -# Fingerprint (SHA1): 50:30:06:09:1D:97:D4:F5:AE:39:F7:CB:E7:92:7D:7D:65:2D:34:31 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Entrust.net Premium 2048 Secure Server CA" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\120\060\006\011\035\227\324\365\256\071\367\313\347\222\175\175 -\145\055\064\061 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\356\051\061\274\062\176\232\346\350\265\367\121\264\064\161\220 -END -CKA_ISSUER MULTILINE_OCTAL -\060\201\264\061\024\060\022\006\003\125\004\012\023\013\105\156 -\164\162\165\163\164\056\156\145\164\061\100\060\076\006\003\125 -\004\013\024\067\167\167\167\056\145\156\164\162\165\163\164\056 -\156\145\164\057\103\120\123\137\062\060\064\070\040\151\156\143 -\157\162\160\056\040\142\171\040\162\145\146\056\040\050\154\151 -\155\151\164\163\040\154\151\141\142\056\051\061\045\060\043\006 -\003\125\004\013\023\034\050\143\051\040\061\071\071\071\040\105 -\156\164\162\165\163\164\056\156\145\164\040\114\151\155\151\164 -\145\144\061\063\060\061\006\003\125\004\003\023\052\105\156\164 -\162\165\163\164\056\156\145\164\040\103\145\162\164\151\146\151 -\143\141\164\151\157\156\040\101\165\164\150\157\162\151\164\171 -\040\050\062\060\064\070\051 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\004\070\143\336\370 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Certum Root CA" -# -# Issuer: CN=Certum CA,O=Unizeto Sp. z o.o.,C=PL -# Serial Number: 65568 (0x10020) -# Subject: CN=Certum CA,O=Unizeto Sp. z o.o.,C=PL -# Not Valid Before: Tue Jun 11 10:46:39 2002 -# Not Valid After : Fri Jun 11 10:46:39 2027 -# Fingerprint (SHA-256): D8:E0:FE:BC:1D:B2:E3:8D:00:94:0F:37:D2:7D:41:34:4D:99:3E:73:4B:99:D5:65:6D:97:78:D4:D8:14:36:24 -# Fingerprint (SHA1): 62:52:DC:40:F7:11:43:A2:2F:DE:9E:F7:34:8E:06:42:51:B1:81:18 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Certum Root CA" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\076\061\013\060\011\006\003\125\004\006\023\002\120\114\061 -\033\060\031\006\003\125\004\012\023\022\125\156\151\172\145\164 -\157\040\123\160\056\040\172\040\157\056\157\056\061\022\060\020 -\006\003\125\004\003\023\011\103\145\162\164\165\155\040\103\101 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\076\061\013\060\011\006\003\125\004\006\023\002\120\114\061 -\033\060\031\006\003\125\004\012\023\022\125\156\151\172\145\164 -\157\040\123\160\056\040\172\040\157\056\157\056\061\022\060\020 -\006\003\125\004\003\023\011\103\145\162\164\165\155\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\003\001\000\040 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\003\014\060\202\001\364\240\003\002\001\002\002\003\001 -\000\040\060\015\006\011\052\206\110\206\367\015\001\001\005\005 -\000\060\076\061\013\060\011\006\003\125\004\006\023\002\120\114 -\061\033\060\031\006\003\125\004\012\023\022\125\156\151\172\145 -\164\157\040\123\160\056\040\172\040\157\056\157\056\061\022\060 -\020\006\003\125\004\003\023\011\103\145\162\164\165\155\040\103 -\101\060\036\027\015\060\062\060\066\061\061\061\060\064\066\063 -\071\132\027\015\062\067\060\066\061\061\061\060\064\066\063\071 -\132\060\076\061\013\060\011\006\003\125\004\006\023\002\120\114 -\061\033\060\031\006\003\125\004\012\023\022\125\156\151\172\145 -\164\157\040\123\160\056\040\172\040\157\056\157\056\061\022\060 -\020\006\003\125\004\003\023\011\103\145\162\164\165\155\040\103 -\101\060\202\001\042\060\015\006\011\052\206\110\206\367\015\001 -\001\001\005\000\003\202\001\017\000\060\202\001\012\002\202\001 -\001\000\316\261\301\056\323\117\174\315\045\316\030\076\117\304 -\214\157\200\152\163\310\133\121\370\233\322\334\273\000\134\261 -\240\374\165\003\356\201\360\210\356\043\122\351\346\025\063\215 -\254\055\011\305\166\371\053\071\200\211\344\227\113\220\245\250 -\170\370\163\103\173\244\141\260\330\130\314\341\154\146\176\234 -\363\011\136\125\143\204\325\250\357\363\261\056\060\150\263\304 -\074\330\254\156\215\231\132\220\116\064\334\066\232\217\201\210 -\120\267\155\226\102\011\363\327\225\203\015\101\113\260\152\153 -\370\374\017\176\142\237\147\304\355\046\137\020\046\017\010\117 -\360\244\127\050\316\217\270\355\105\366\156\356\045\135\252\156 -\071\276\344\223\057\331\107\240\162\353\372\246\133\257\312\123 -\077\342\016\306\226\126\021\156\367\351\146\251\046\330\177\225 -\123\355\012\205\210\272\117\051\245\102\214\136\266\374\205\040 -\000\252\150\013\241\032\205\001\234\304\106\143\202\210\266\042 -\261\356\376\252\106\131\176\317\065\054\325\266\332\135\367\110 -\063\024\124\266\353\331\157\316\315\210\326\253\033\332\226\073 -\035\131\002\003\001\000\001\243\023\060\021\060\017\006\003\125 -\035\023\001\001\377\004\005\060\003\001\001\377\060\015\006\011 -\052\206\110\206\367\015\001\001\005\005\000\003\202\001\001\000 -\270\215\316\357\347\024\272\317\356\260\104\222\154\264\071\076 -\242\204\156\255\270\041\167\322\324\167\202\207\346\040\101\201 -\356\342\370\021\267\143\321\027\067\276\031\166\044\034\004\032 -\114\353\075\252\147\157\055\324\315\376\145\061\160\305\033\246 -\002\012\272\140\173\155\130\302\232\111\376\143\062\013\153\343 -\072\300\254\253\073\260\350\323\011\121\214\020\203\306\064\340 -\305\053\340\032\266\140\024\047\154\062\167\214\274\262\162\230 -\317\315\314\077\271\310\044\102\024\326\127\374\346\046\103\251 -\035\345\200\220\316\003\124\050\076\367\077\323\370\115\355\152 -\012\072\223\023\233\073\024\043\023\143\234\077\321\207\047\171 -\345\114\121\343\001\255\205\135\032\073\261\325\163\020\244\323 -\362\274\156\144\365\132\126\220\250\307\016\114\164\017\056\161 -\073\367\310\107\364\151\157\025\362\021\136\203\036\234\174\122 -\256\375\002\332\022\250\131\147\030\333\274\160\335\233\261\151 -\355\200\316\211\100\110\152\016\065\312\051\146\025\041\224\054 -\350\140\052\233\205\112\100\363\153\212\044\354\006\026\054\163 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Certum Root CA" -# Issuer: CN=Certum CA,O=Unizeto Sp. z o.o.,C=PL -# Serial Number: 65568 (0x10020) -# Subject: CN=Certum CA,O=Unizeto Sp. z o.o.,C=PL -# Not Valid Before: Tue Jun 11 10:46:39 2002 -# Not Valid After : Fri Jun 11 10:46:39 2027 -# Fingerprint (SHA-256): D8:E0:FE:BC:1D:B2:E3:8D:00:94:0F:37:D2:7D:41:34:4D:99:3E:73:4B:99:D5:65:6D:97:78:D4:D8:14:36:24 -# Fingerprint (SHA1): 62:52:DC:40:F7:11:43:A2:2F:DE:9E:F7:34:8E:06:42:51:B1:81:18 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Certum Root CA" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\142\122\334\100\367\021\103\242\057\336\236\367\064\216\006\102 -\121\261\201\030 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\054\217\237\146\035\030\220\261\107\046\235\216\206\202\214\251 -END -CKA_ISSUER MULTILINE_OCTAL -\060\076\061\013\060\011\006\003\125\004\006\023\002\120\114\061 -\033\060\031\006\003\125\004\012\023\022\125\156\151\172\145\164 -\157\040\123\160\056\040\172\040\157\056\157\056\061\022\060\020 -\006\003\125\004\003\023\011\103\145\162\164\165\155\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\003\001\000\040 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Comodo AAA Services root" -# -# Issuer: CN=AAA Certificate Services,O=Comodo CA Limited,L=Salford,ST=Greater Manchester,C=GB -# Serial Number: 1 (0x1) -# Subject: CN=AAA Certificate Services,O=Comodo CA Limited,L=Salford,ST=Greater Manchester,C=GB -# Not Valid Before: Thu Jan 01 00:00:00 2004 -# Not Valid After : Sun Dec 31 23:59:59 2028 -# Fingerprint (SHA-256): D7:A7:A0:FB:5D:7E:27:31:D7:71:E9:48:4E:BC:DE:F7:1D:5F:0C:3E:0A:29:48:78:2B:C8:3E:E0:EA:69:9E:F4 -# Fingerprint (SHA1): D1:EB:23:A4:6D:17:D6:8F:D9:25:64:C2:F1:F1:60:17:64:D8:E3:49 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Comodo AAA Services root" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\173\061\013\060\011\006\003\125\004\006\023\002\107\102\061 -\033\060\031\006\003\125\004\010\014\022\107\162\145\141\164\145 -\162\040\115\141\156\143\150\145\163\164\145\162\061\020\060\016 -\006\003\125\004\007\014\007\123\141\154\146\157\162\144\061\032 -\060\030\006\003\125\004\012\014\021\103\157\155\157\144\157\040 -\103\101\040\114\151\155\151\164\145\144\061\041\060\037\006\003 -\125\004\003\014\030\101\101\101\040\103\145\162\164\151\146\151 -\143\141\164\145\040\123\145\162\166\151\143\145\163 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\173\061\013\060\011\006\003\125\004\006\023\002\107\102\061 -\033\060\031\006\003\125\004\010\014\022\107\162\145\141\164\145 -\162\040\115\141\156\143\150\145\163\164\145\162\061\020\060\016 -\006\003\125\004\007\014\007\123\141\154\146\157\162\144\061\032 -\060\030\006\003\125\004\012\014\021\103\157\155\157\144\157\040 -\103\101\040\114\151\155\151\164\145\144\061\041\060\037\006\003 -\125\004\003\014\030\101\101\101\040\103\145\162\164\151\146\151 -\143\141\164\145\040\123\145\162\166\151\143\145\163 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\001 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\004\062\060\202\003\032\240\003\002\001\002\002\001\001 -\060\015\006\011\052\206\110\206\367\015\001\001\005\005\000\060 -\173\061\013\060\011\006\003\125\004\006\023\002\107\102\061\033 -\060\031\006\003\125\004\010\014\022\107\162\145\141\164\145\162 -\040\115\141\156\143\150\145\163\164\145\162\061\020\060\016\006 -\003\125\004\007\014\007\123\141\154\146\157\162\144\061\032\060 -\030\006\003\125\004\012\014\021\103\157\155\157\144\157\040\103 -\101\040\114\151\155\151\164\145\144\061\041\060\037\006\003\125 -\004\003\014\030\101\101\101\040\103\145\162\164\151\146\151\143 -\141\164\145\040\123\145\162\166\151\143\145\163\060\036\027\015 -\060\064\060\061\060\061\060\060\060\060\060\060\132\027\015\062 -\070\061\062\063\061\062\063\065\071\065\071\132\060\173\061\013 -\060\011\006\003\125\004\006\023\002\107\102\061\033\060\031\006 -\003\125\004\010\014\022\107\162\145\141\164\145\162\040\115\141 -\156\143\150\145\163\164\145\162\061\020\060\016\006\003\125\004 -\007\014\007\123\141\154\146\157\162\144\061\032\060\030\006\003 -\125\004\012\014\021\103\157\155\157\144\157\040\103\101\040\114 -\151\155\151\164\145\144\061\041\060\037\006\003\125\004\003\014 -\030\101\101\101\040\103\145\162\164\151\146\151\143\141\164\145 -\040\123\145\162\166\151\143\145\163\060\202\001\042\060\015\006 -\011\052\206\110\206\367\015\001\001\001\005\000\003\202\001\017 -\000\060\202\001\012\002\202\001\001\000\276\100\235\364\156\341 -\352\166\207\034\115\105\104\216\276\106\310\203\006\235\301\052 -\376\030\037\216\344\002\372\363\253\135\120\212\026\061\013\232 -\006\320\305\160\042\315\111\055\124\143\314\266\156\150\106\013 -\123\352\313\114\044\300\274\162\116\352\361\025\256\364\124\232 -\022\012\303\172\262\063\140\342\332\211\125\363\042\130\363\336 -\334\317\357\203\206\242\214\224\117\237\150\362\230\220\106\204 -\047\307\166\277\343\314\065\054\213\136\007\144\145\202\300\110 -\260\250\221\371\141\237\166\040\120\250\221\307\146\265\353\170 -\142\003\126\360\212\032\023\352\061\243\036\240\231\375\070\366 -\366\047\062\130\157\007\365\153\270\373\024\053\257\267\252\314 -\326\143\137\163\214\332\005\231\250\070\250\313\027\170\066\121 -\254\351\236\364\170\072\215\317\017\331\102\342\230\014\253\057 -\237\016\001\336\357\237\231\111\361\055\337\254\164\115\033\230 -\265\107\305\345\051\321\371\220\030\307\142\234\276\203\307\046 -\173\076\212\045\307\300\335\235\346\065\150\020\040\235\217\330 -\336\322\303\204\234\015\136\350\057\311\002\003\001\000\001\243 -\201\300\060\201\275\060\035\006\003\125\035\016\004\026\004\024 -\240\021\012\043\076\226\361\007\354\342\257\051\357\202\245\177 -\320\060\244\264\060\016\006\003\125\035\017\001\001\377\004\004 -\003\002\001\006\060\017\006\003\125\035\023\001\001\377\004\005 -\060\003\001\001\377\060\173\006\003\125\035\037\004\164\060\162 -\060\070\240\066\240\064\206\062\150\164\164\160\072\057\057\143 -\162\154\056\143\157\155\157\144\157\143\141\056\143\157\155\057 -\101\101\101\103\145\162\164\151\146\151\143\141\164\145\123\145 -\162\166\151\143\145\163\056\143\162\154\060\066\240\064\240\062 -\206\060\150\164\164\160\072\057\057\143\162\154\056\143\157\155 -\157\144\157\056\156\145\164\057\101\101\101\103\145\162\164\151 -\146\151\143\141\164\145\123\145\162\166\151\143\145\163\056\143 -\162\154\060\015\006\011\052\206\110\206\367\015\001\001\005\005 -\000\003\202\001\001\000\010\126\374\002\360\233\350\377\244\372 -\326\173\306\104\200\316\117\304\305\366\000\130\314\246\266\274 -\024\111\150\004\166\350\346\356\135\354\002\017\140\326\215\120 -\030\117\046\116\001\343\346\260\245\356\277\274\164\124\101\277 -\375\374\022\270\307\117\132\364\211\140\005\177\140\267\005\112 -\363\366\361\302\277\304\271\164\206\266\055\175\153\314\322\363 -\106\335\057\306\340\152\303\303\064\003\054\175\226\335\132\302 -\016\247\012\231\301\005\213\253\014\057\363\134\072\317\154\067 -\125\011\207\336\123\100\154\130\357\374\266\253\145\156\004\366 -\033\334\074\340\132\025\306\236\331\361\131\110\060\041\145\003 -\154\354\351\041\163\354\233\003\241\340\067\255\240\025\030\217 -\372\272\002\316\247\054\251\020\023\054\324\345\010\046\253\042 -\227\140\370\220\136\164\324\242\232\123\275\362\251\150\340\242 -\156\302\327\154\261\243\017\236\277\353\150\347\126\362\256\362 -\343\053\070\072\011\201\265\153\205\327\276\055\355\077\032\267 -\262\143\342\365\142\054\202\324\152\000\101\120\361\071\203\237 -\225\351\066\226\230\156 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Comodo AAA Services root" -# Issuer: CN=AAA Certificate Services,O=Comodo CA Limited,L=Salford,ST=Greater Manchester,C=GB -# Serial Number: 1 (0x1) -# Subject: CN=AAA Certificate Services,O=Comodo CA Limited,L=Salford,ST=Greater Manchester,C=GB -# Not Valid Before: Thu Jan 01 00:00:00 2004 -# Not Valid After : Sun Dec 31 23:59:59 2028 -# Fingerprint (SHA-256): D7:A7:A0:FB:5D:7E:27:31:D7:71:E9:48:4E:BC:DE:F7:1D:5F:0C:3E:0A:29:48:78:2B:C8:3E:E0:EA:69:9E:F4 -# Fingerprint (SHA1): D1:EB:23:A4:6D:17:D6:8F:D9:25:64:C2:F1:F1:60:17:64:D8:E3:49 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Comodo AAA Services root" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\321\353\043\244\155\027\326\217\331\045\144\302\361\361\140\027 -\144\330\343\111 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\111\171\004\260\353\207\031\254\107\260\274\021\121\233\164\320 -END -CKA_ISSUER MULTILINE_OCTAL -\060\173\061\013\060\011\006\003\125\004\006\023\002\107\102\061 -\033\060\031\006\003\125\004\010\014\022\107\162\145\141\164\145 -\162\040\115\141\156\143\150\145\163\164\145\162\061\020\060\016 -\006\003\125\004\007\014\007\123\141\154\146\157\162\144\061\032 -\060\030\006\003\125\004\012\014\021\103\157\155\157\144\157\040 -\103\101\040\114\151\155\151\164\145\144\061\041\060\037\006\003 -\125\004\003\014\030\101\101\101\040\103\145\162\164\151\146\151 -\143\141\164\145\040\123\145\162\166\151\143\145\163 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\001 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "QuoVadis Root CA 2" -# -# Issuer: CN=QuoVadis Root CA 2,O=QuoVadis Limited,C=BM -# Serial Number: 1289 (0x509) -# Subject: CN=QuoVadis Root CA 2,O=QuoVadis Limited,C=BM -# Not Valid Before: Fri Nov 24 18:27:00 2006 -# Not Valid After : Mon Nov 24 18:23:33 2031 -# Fingerprint (SHA-256): 85:A0:DD:7D:D7:20:AD:B7:FF:05:F8:3D:54:2B:20:9D:C7:FF:45:28:F7:D6:77:B1:83:89:FE:A5:E5:C4:9E:86 -# Fingerprint (SHA1): CA:3A:FB:CF:12:40:36:4B:44:B2:16:20:88:80:48:39:19:93:7C:F7 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "QuoVadis Root CA 2" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\105\061\013\060\011\006\003\125\004\006\023\002\102\115\061 -\031\060\027\006\003\125\004\012\023\020\121\165\157\126\141\144 -\151\163\040\114\151\155\151\164\145\144\061\033\060\031\006\003 -\125\004\003\023\022\121\165\157\126\141\144\151\163\040\122\157 -\157\164\040\103\101\040\062 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\105\061\013\060\011\006\003\125\004\006\023\002\102\115\061 -\031\060\027\006\003\125\004\012\023\020\121\165\157\126\141\144 -\151\163\040\114\151\155\151\164\145\144\061\033\060\031\006\003 -\125\004\003\023\022\121\165\157\126\141\144\151\163\040\122\157 -\157\164\040\103\101\040\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\002\005\011 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\267\060\202\003\237\240\003\002\001\002\002\002\005 -\011\060\015\006\011\052\206\110\206\367\015\001\001\005\005\000 -\060\105\061\013\060\011\006\003\125\004\006\023\002\102\115\061 -\031\060\027\006\003\125\004\012\023\020\121\165\157\126\141\144 -\151\163\040\114\151\155\151\164\145\144\061\033\060\031\006\003 -\125\004\003\023\022\121\165\157\126\141\144\151\163\040\122\157 -\157\164\040\103\101\040\062\060\036\027\015\060\066\061\061\062 -\064\061\070\062\067\060\060\132\027\015\063\061\061\061\062\064 -\061\070\062\063\063\063\132\060\105\061\013\060\011\006\003\125 -\004\006\023\002\102\115\061\031\060\027\006\003\125\004\012\023 -\020\121\165\157\126\141\144\151\163\040\114\151\155\151\164\145 -\144\061\033\060\031\006\003\125\004\003\023\022\121\165\157\126 -\141\144\151\163\040\122\157\157\164\040\103\101\040\062\060\202 -\002\042\060\015\006\011\052\206\110\206\367\015\001\001\001\005 -\000\003\202\002\017\000\060\202\002\012\002\202\002\001\000\232 -\030\312\113\224\015\000\055\257\003\051\212\360\017\201\310\256 -\114\031\205\035\010\237\253\051\104\205\363\057\201\255\062\036 -\220\106\277\243\206\046\032\036\376\176\034\030\072\134\234\140 -\027\052\072\164\203\063\060\175\141\124\021\313\355\253\340\346 -\322\242\176\365\153\157\030\267\012\013\055\375\351\076\357\012 -\306\263\020\351\334\302\106\027\370\135\375\244\332\377\236\111 -\132\234\346\063\346\044\226\367\077\272\133\053\034\172\065\302 -\326\147\376\253\146\120\213\155\050\140\053\357\327\140\303\307 -\223\274\215\066\221\363\177\370\333\021\023\304\234\167\166\301 -\256\267\002\152\201\172\251\105\203\342\005\346\271\126\301\224 -\067\217\110\161\143\042\354\027\145\007\225\212\113\337\217\306 -\132\012\345\260\343\137\136\153\021\253\014\371\205\353\104\351 -\370\004\163\362\351\376\134\230\214\365\163\257\153\264\176\315 -\324\134\002\053\114\071\341\262\225\225\055\102\207\327\325\263 -\220\103\267\154\023\361\336\335\366\304\370\211\077\321\165\365 -\222\303\221\325\212\210\320\220\354\334\155\336\211\302\145\161 -\226\213\015\003\375\234\277\133\026\254\222\333\352\376\171\174 -\255\353\257\367\026\313\333\315\045\053\345\037\373\232\237\342 -\121\314\072\123\014\110\346\016\275\311\264\166\006\122\346\021 -\023\205\162\143\003\004\340\004\066\053\040\031\002\350\164\247 -\037\266\311\126\146\360\165\045\334\147\301\016\141\140\210\263 -\076\321\250\374\243\332\035\260\321\261\043\124\337\104\166\155 -\355\101\330\301\262\042\266\123\034\337\065\035\334\241\167\052 -\061\344\055\365\345\345\333\310\340\377\345\200\327\013\143\240 -\377\063\241\017\272\054\025\025\352\227\263\322\242\265\276\362 -\214\226\036\032\217\035\154\244\141\067\271\206\163\063\327\227 -\226\236\043\175\202\244\114\201\342\241\321\272\147\137\225\007 -\243\047\021\356\026\020\173\274\105\112\114\262\004\322\253\357 -\325\375\014\121\316\120\152\010\061\371\221\332\014\217\144\134 -\003\303\072\213\040\077\156\215\147\075\072\326\376\175\133\210 -\311\136\373\314\141\334\213\063\167\323\104\062\065\011\142\004 -\222\026\020\330\236\047\107\373\073\041\343\370\353\035\133\002 -\003\001\000\001\243\201\260\060\201\255\060\017\006\003\125\035 -\023\001\001\377\004\005\060\003\001\001\377\060\013\006\003\125 -\035\017\004\004\003\002\001\006\060\035\006\003\125\035\016\004 -\026\004\024\032\204\142\274\110\114\063\045\004\324\356\320\366 -\003\304\031\106\321\224\153\060\156\006\003\125\035\043\004\147 -\060\145\200\024\032\204\142\274\110\114\063\045\004\324\356\320 -\366\003\304\031\106\321\224\153\241\111\244\107\060\105\061\013 -\060\011\006\003\125\004\006\023\002\102\115\061\031\060\027\006 -\003\125\004\012\023\020\121\165\157\126\141\144\151\163\040\114 -\151\155\151\164\145\144\061\033\060\031\006\003\125\004\003\023 -\022\121\165\157\126\141\144\151\163\040\122\157\157\164\040\103 -\101\040\062\202\002\005\011\060\015\006\011\052\206\110\206\367 -\015\001\001\005\005\000\003\202\002\001\000\076\012\026\115\237 -\006\133\250\256\161\135\057\005\057\147\346\023\105\203\304\066 -\366\363\300\046\014\015\265\107\144\135\370\264\162\311\106\245 -\003\030\047\125\211\170\175\166\352\226\064\200\027\040\334\347 -\203\370\215\374\007\270\332\137\115\056\147\262\204\375\331\104 -\374\167\120\201\346\174\264\311\015\013\162\123\370\166\007\007 -\101\107\226\014\373\340\202\046\223\125\214\376\042\037\140\145 -\174\137\347\046\263\367\062\220\230\120\324\067\161\125\366\222 -\041\170\367\225\171\372\370\055\046\207\146\126\060\167\246\067 -\170\063\122\020\130\256\077\141\216\362\152\261\357\030\176\112 -\131\143\312\215\242\126\325\247\057\274\126\037\317\071\301\342 -\373\012\250\025\054\175\115\172\143\306\154\227\104\074\322\157 -\303\112\027\012\370\220\322\127\242\031\121\245\055\227\101\332 -\007\117\251\120\332\220\215\224\106\341\076\360\224\375\020\000 -\070\365\073\350\100\341\264\156\126\032\040\314\157\130\215\355 -\056\105\217\326\351\223\077\347\261\054\337\072\326\042\214\334 -\204\273\042\157\320\370\344\306\071\351\004\210\074\303\272\353 -\125\172\155\200\231\044\365\154\001\373\370\227\260\224\133\353 -\375\322\157\361\167\150\015\065\144\043\254\270\125\241\003\321 -\115\102\031\334\370\165\131\126\243\371\250\111\171\370\257\016 -\271\021\240\174\267\152\355\064\320\266\046\142\070\032\207\014 -\370\350\375\056\323\220\177\007\221\052\035\326\176\134\205\203 -\231\260\070\010\077\351\136\371\065\007\344\311\142\156\127\177 -\247\120\225\367\272\310\233\346\216\242\001\305\326\146\277\171 -\141\363\074\034\341\271\202\134\135\240\303\351\330\110\275\031 -\242\021\024\031\156\262\206\033\150\076\110\067\032\210\267\135 -\226\136\234\307\357\047\142\010\342\221\031\134\322\361\041\335 -\272\027\102\202\227\161\201\123\061\251\237\366\175\142\277\162 -\341\243\223\035\314\212\046\132\011\070\320\316\327\015\200\026 -\264\170\245\072\207\114\215\212\245\325\106\227\362\054\020\271 -\274\124\042\300\001\120\151\103\236\364\262\357\155\370\354\332 -\361\343\261\357\337\221\217\124\052\013\045\301\046\031\304\122 -\020\005\145\325\202\020\352\302\061\315\056 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "QuoVadis Root CA 2" -# Issuer: CN=QuoVadis Root CA 2,O=QuoVadis Limited,C=BM -# Serial Number: 1289 (0x509) -# Subject: CN=QuoVadis Root CA 2,O=QuoVadis Limited,C=BM -# Not Valid Before: Fri Nov 24 18:27:00 2006 -# Not Valid After : Mon Nov 24 18:23:33 2031 -# Fingerprint (SHA-256): 85:A0:DD:7D:D7:20:AD:B7:FF:05:F8:3D:54:2B:20:9D:C7:FF:45:28:F7:D6:77:B1:83:89:FE:A5:E5:C4:9E:86 -# Fingerprint (SHA1): CA:3A:FB:CF:12:40:36:4B:44:B2:16:20:88:80:48:39:19:93:7C:F7 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "QuoVadis Root CA 2" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\312\072\373\317\022\100\066\113\104\262\026\040\210\200\110\071 -\031\223\174\367 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\136\071\173\335\370\272\354\202\351\254\142\272\014\124\000\053 -END -CKA_ISSUER MULTILINE_OCTAL -\060\105\061\013\060\011\006\003\125\004\006\023\002\102\115\061 -\031\060\027\006\003\125\004\012\023\020\121\165\157\126\141\144 -\151\163\040\114\151\155\151\164\145\144\061\033\060\031\006\003 -\125\004\003\023\022\121\165\157\126\141\144\151\163\040\122\157 -\157\164\040\103\101\040\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\002\005\011 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "QuoVadis Root CA 3" -# -# Issuer: CN=QuoVadis Root CA 3,O=QuoVadis Limited,C=BM -# Serial Number: 1478 (0x5c6) -# Subject: CN=QuoVadis Root CA 3,O=QuoVadis Limited,C=BM -# Not Valid Before: Fri Nov 24 19:11:23 2006 -# Not Valid After : Mon Nov 24 19:06:44 2031 -# Fingerprint (SHA-256): 18:F1:FC:7F:20:5D:F8:AD:DD:EB:7F:E0:07:DD:57:E3:AF:37:5A:9C:4D:8D:73:54:6B:F4:F1:FE:D1:E1:8D:35 -# Fingerprint (SHA1): 1F:49:14:F7:D8:74:95:1D:DD:AE:02:C0:BE:FD:3A:2D:82:75:51:85 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "QuoVadis Root CA 3" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\105\061\013\060\011\006\003\125\004\006\023\002\102\115\061 -\031\060\027\006\003\125\004\012\023\020\121\165\157\126\141\144 -\151\163\040\114\151\155\151\164\145\144\061\033\060\031\006\003 -\125\004\003\023\022\121\165\157\126\141\144\151\163\040\122\157 -\157\164\040\103\101\040\063 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\105\061\013\060\011\006\003\125\004\006\023\002\102\115\061 -\031\060\027\006\003\125\004\012\023\020\121\165\157\126\141\144 -\151\163\040\114\151\155\151\164\145\144\061\033\060\031\006\003 -\125\004\003\023\022\121\165\157\126\141\144\151\163\040\122\157 -\157\164\040\103\101\040\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\002\005\306 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\006\235\060\202\004\205\240\003\002\001\002\002\002\005 -\306\060\015\006\011\052\206\110\206\367\015\001\001\005\005\000 -\060\105\061\013\060\011\006\003\125\004\006\023\002\102\115\061 -\031\060\027\006\003\125\004\012\023\020\121\165\157\126\141\144 -\151\163\040\114\151\155\151\164\145\144\061\033\060\031\006\003 -\125\004\003\023\022\121\165\157\126\141\144\151\163\040\122\157 -\157\164\040\103\101\040\063\060\036\027\015\060\066\061\061\062 -\064\061\071\061\061\062\063\132\027\015\063\061\061\061\062\064 -\061\071\060\066\064\064\132\060\105\061\013\060\011\006\003\125 -\004\006\023\002\102\115\061\031\060\027\006\003\125\004\012\023 -\020\121\165\157\126\141\144\151\163\040\114\151\155\151\164\145 -\144\061\033\060\031\006\003\125\004\003\023\022\121\165\157\126 -\141\144\151\163\040\122\157\157\164\040\103\101\040\063\060\202 -\002\042\060\015\006\011\052\206\110\206\367\015\001\001\001\005 -\000\003\202\002\017\000\060\202\002\012\002\202\002\001\000\314 -\127\102\026\124\234\346\230\323\323\115\356\376\355\307\237\103 -\071\112\145\263\350\026\210\064\333\015\131\221\164\317\222\270 -\004\100\255\002\113\061\253\274\215\221\150\330\040\016\032\001 -\342\032\173\116\027\135\342\212\267\077\231\032\315\353\141\253 -\302\145\246\037\267\267\275\267\217\374\375\160\217\013\240\147 -\276\001\242\131\317\161\346\017\051\166\377\261\126\171\105\053 -\037\236\172\124\350\243\051\065\150\244\001\117\017\244\056\067 -\357\033\277\343\217\020\250\162\253\130\127\347\124\206\310\311 -\363\133\332\054\332\135\216\156\074\243\076\332\373\202\345\335 -\362\134\262\005\063\157\212\066\316\320\023\116\377\277\112\014 -\064\114\246\303\041\275\120\004\125\353\261\273\235\373\105\036 -\144\025\336\125\001\214\002\166\265\313\241\077\102\151\274\057 -\275\150\103\026\126\211\052\067\141\221\375\246\256\116\300\313 -\024\145\224\067\113\222\006\357\004\320\310\234\210\333\013\173 -\201\257\261\075\052\304\145\072\170\266\356\334\200\261\322\323 -\231\234\072\356\153\132\153\263\215\267\325\316\234\302\276\245 -\113\057\026\261\236\150\073\006\157\256\175\237\370\336\354\314 -\051\247\230\243\045\103\057\357\361\137\046\341\210\115\370\136 -\156\327\331\024\156\031\063\151\247\073\204\211\223\304\123\125 -\023\241\121\170\100\370\270\311\242\356\173\272\122\102\203\236 -\024\355\005\122\132\131\126\247\227\374\235\077\012\051\330\334 -\117\221\016\023\274\336\225\244\337\213\231\276\254\233\063\210 -\357\265\201\257\033\306\042\123\310\366\307\356\227\024\260\305 -\174\170\122\310\360\316\156\167\140\204\246\351\052\166\040\355 -\130\001\027\060\223\351\032\213\340\163\143\331\152\222\224\111 -\116\264\255\112\205\304\243\042\060\374\011\355\150\042\163\246 -\210\014\125\041\130\305\341\072\237\052\335\312\341\220\340\331 -\163\253\154\200\270\350\013\144\223\240\234\214\031\377\263\322 -\014\354\221\046\207\212\263\242\341\160\217\054\012\345\315\155 -\150\121\353\332\077\005\177\213\062\346\023\134\153\376\137\100 -\342\042\310\264\264\144\117\326\272\175\110\076\250\151\014\327 -\273\206\161\311\163\270\077\073\235\045\113\332\377\100\353\002 -\003\001\000\001\243\202\001\225\060\202\001\221\060\017\006\003 -\125\035\023\001\001\377\004\005\060\003\001\001\377\060\201\341 -\006\003\125\035\040\004\201\331\060\201\326\060\201\323\006\011 -\053\006\001\004\001\276\130\000\003\060\201\305\060\201\223\006 -\010\053\006\001\005\005\007\002\002\060\201\206\032\201\203\101 -\156\171\040\165\163\145\040\157\146\040\164\150\151\163\040\103 -\145\162\164\151\146\151\143\141\164\145\040\143\157\156\163\164 -\151\164\165\164\145\163\040\141\143\143\145\160\164\141\156\143 -\145\040\157\146\040\164\150\145\040\121\165\157\126\141\144\151 -\163\040\122\157\157\164\040\103\101\040\063\040\103\145\162\164 -\151\146\151\143\141\164\145\040\120\157\154\151\143\171\040\057 -\040\103\145\162\164\151\146\151\143\141\164\151\157\156\040\120 -\162\141\143\164\151\143\145\040\123\164\141\164\145\155\145\156 -\164\056\060\055\006\010\053\006\001\005\005\007\002\001\026\041 -\150\164\164\160\072\057\057\167\167\167\056\161\165\157\166\141 -\144\151\163\147\154\157\142\141\154\056\143\157\155\057\143\160 -\163\060\013\006\003\125\035\017\004\004\003\002\001\006\060\035 -\006\003\125\035\016\004\026\004\024\362\300\023\340\202\103\076 -\373\356\057\147\062\226\065\134\333\270\313\002\320\060\156\006 -\003\125\035\043\004\147\060\145\200\024\362\300\023\340\202\103 -\076\373\356\057\147\062\226\065\134\333\270\313\002\320\241\111 -\244\107\060\105\061\013\060\011\006\003\125\004\006\023\002\102 -\115\061\031\060\027\006\003\125\004\012\023\020\121\165\157\126 -\141\144\151\163\040\114\151\155\151\164\145\144\061\033\060\031 -\006\003\125\004\003\023\022\121\165\157\126\141\144\151\163\040 -\122\157\157\164\040\103\101\040\063\202\002\005\306\060\015\006 -\011\052\206\110\206\367\015\001\001\005\005\000\003\202\002\001 -\000\117\255\240\054\114\372\300\362\157\367\146\125\253\043\064 -\356\347\051\332\303\133\266\260\203\331\320\320\342\041\373\363 -\140\247\073\135\140\123\047\242\233\366\010\042\052\347\277\240 -\162\345\234\044\152\061\261\220\172\047\333\204\021\211\047\246 -\167\132\070\327\277\254\206\374\356\135\203\274\006\306\321\167 -\153\017\155\044\057\113\172\154\247\007\226\312\343\204\237\255 -\210\213\035\253\026\215\133\146\027\331\026\364\213\200\322\335 -\370\262\166\303\374\070\023\252\014\336\102\151\053\156\363\074 -\353\200\047\333\365\246\104\015\237\132\125\131\013\325\015\122 -\110\305\256\237\362\057\200\305\352\062\120\065\022\227\056\301 -\341\377\361\043\210\121\070\237\362\146\126\166\347\017\121\227 -\245\122\014\115\111\121\225\066\075\277\242\113\014\020\035\206 -\231\114\252\363\162\021\223\344\352\366\233\332\250\135\247\115 -\267\236\002\256\163\000\310\332\043\003\350\371\352\031\164\142 -\000\224\313\042\040\276\224\247\131\265\202\152\276\231\171\172 -\251\362\112\044\122\367\164\375\272\116\346\250\035\002\156\261 -\015\200\104\301\256\323\043\067\137\273\205\174\053\222\056\350 -\176\245\213\335\231\341\277\047\157\055\135\252\173\207\376\012 -\335\113\374\216\365\046\344\156\160\102\156\063\354\061\236\173 -\223\301\344\311\151\032\075\300\153\116\042\155\356\253\130\115 -\306\320\101\301\053\352\117\022\207\136\353\105\330\154\365\230 -\002\323\240\330\125\212\006\231\031\242\240\167\321\060\236\254 -\314\165\356\203\365\260\142\071\317\154\127\342\114\322\221\013 -\016\165\050\033\232\277\375\032\103\361\312\167\373\073\217\141 -\270\151\050\026\102\004\136\160\052\034\041\330\217\341\275\043 -\133\055\164\100\222\331\143\031\015\163\335\151\274\142\107\274 -\340\164\053\262\353\175\276\101\033\265\300\106\305\241\042\313 -\137\116\301\050\222\336\030\272\325\052\050\273\021\213\027\223 -\230\231\140\224\134\043\317\132\047\227\136\013\005\006\223\067 -\036\073\151\066\353\251\236\141\035\217\062\332\216\014\326\164 -\076\173\011\044\332\001\167\107\304\073\315\064\214\231\365\312 -\341\045\141\063\262\131\033\342\156\327\067\127\266\015\251\022 -\332 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "QuoVadis Root CA 3" -# Issuer: CN=QuoVadis Root CA 3,O=QuoVadis Limited,C=BM -# Serial Number: 1478 (0x5c6) -# Subject: CN=QuoVadis Root CA 3,O=QuoVadis Limited,C=BM -# Not Valid Before: Fri Nov 24 19:11:23 2006 -# Not Valid After : Mon Nov 24 19:06:44 2031 -# Fingerprint (SHA-256): 18:F1:FC:7F:20:5D:F8:AD:DD:EB:7F:E0:07:DD:57:E3:AF:37:5A:9C:4D:8D:73:54:6B:F4:F1:FE:D1:E1:8D:35 -# Fingerprint (SHA1): 1F:49:14:F7:D8:74:95:1D:DD:AE:02:C0:BE:FD:3A:2D:82:75:51:85 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "QuoVadis Root CA 3" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\037\111\024\367\330\164\225\035\335\256\002\300\276\375\072\055 -\202\165\121\205 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\061\205\074\142\224\227\143\271\252\375\211\116\257\157\340\317 -END -CKA_ISSUER MULTILINE_OCTAL -\060\105\061\013\060\011\006\003\125\004\006\023\002\102\115\061 -\031\060\027\006\003\125\004\012\023\020\121\165\157\126\141\144 -\151\163\040\114\151\155\151\164\145\144\061\033\060\031\006\003 -\125\004\003\023\022\121\165\157\126\141\144\151\163\040\122\157 -\157\164\040\103\101\040\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\002\005\306 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Go Daddy Class 2 CA" -# -# Issuer: OU=Go Daddy Class 2 Certification Authority,O="The Go Daddy Group, Inc.",C=US -# Serial Number: 0 (0x0) -# Subject: OU=Go Daddy Class 2 Certification Authority,O="The Go Daddy Group, Inc.",C=US -# Not Valid Before: Tue Jun 29 17:06:20 2004 -# Not Valid After : Thu Jun 29 17:06:20 2034 -# Fingerprint (SHA-256): C3:84:6B:F2:4B:9E:93:CA:64:27:4C:0E:C6:7C:1E:CC:5E:02:4F:FC:AC:D2:D7:40:19:35:0E:81:FE:54:6A:E4 -# Fingerprint (SHA1): 27:96:BA:E6:3F:18:01:E2:77:26:1B:A0:D7:77:70:02:8F:20:EE:E4 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Go Daddy Class 2 CA" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\143\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\041\060\037\006\003\125\004\012\023\030\124\150\145\040\107\157 -\040\104\141\144\144\171\040\107\162\157\165\160\054\040\111\156 -\143\056\061\061\060\057\006\003\125\004\013\023\050\107\157\040 -\104\141\144\144\171\040\103\154\141\163\163\040\062\040\103\145 -\162\164\151\146\151\143\141\164\151\157\156\040\101\165\164\150 -\157\162\151\164\171 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\143\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\041\060\037\006\003\125\004\012\023\030\124\150\145\040\107\157 -\040\104\141\144\144\171\040\107\162\157\165\160\054\040\111\156 -\143\056\061\061\060\057\006\003\125\004\013\023\050\107\157\040 -\104\141\144\144\171\040\103\154\141\163\163\040\062\040\103\145 -\162\164\151\146\151\143\141\164\151\157\156\040\101\165\164\150 -\157\162\151\164\171 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\000 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\004\000\060\202\002\350\240\003\002\001\002\002\001\000 -\060\015\006\011\052\206\110\206\367\015\001\001\005\005\000\060 -\143\061\013\060\011\006\003\125\004\006\023\002\125\123\061\041 -\060\037\006\003\125\004\012\023\030\124\150\145\040\107\157\040 -\104\141\144\144\171\040\107\162\157\165\160\054\040\111\156\143 -\056\061\061\060\057\006\003\125\004\013\023\050\107\157\040\104 -\141\144\144\171\040\103\154\141\163\163\040\062\040\103\145\162 -\164\151\146\151\143\141\164\151\157\156\040\101\165\164\150\157 -\162\151\164\171\060\036\027\015\060\064\060\066\062\071\061\067 -\060\066\062\060\132\027\015\063\064\060\066\062\071\061\067\060 -\066\062\060\132\060\143\061\013\060\011\006\003\125\004\006\023 -\002\125\123\061\041\060\037\006\003\125\004\012\023\030\124\150 -\145\040\107\157\040\104\141\144\144\171\040\107\162\157\165\160 -\054\040\111\156\143\056\061\061\060\057\006\003\125\004\013\023 -\050\107\157\040\104\141\144\144\171\040\103\154\141\163\163\040 -\062\040\103\145\162\164\151\146\151\143\141\164\151\157\156\040 -\101\165\164\150\157\162\151\164\171\060\202\001\040\060\015\006 -\011\052\206\110\206\367\015\001\001\001\005\000\003\202\001\015 -\000\060\202\001\010\002\202\001\001\000\336\235\327\352\127\030 -\111\241\133\353\327\137\110\206\352\276\335\377\344\357\147\034 -\364\145\150\263\127\161\240\136\167\273\355\233\111\351\160\200 -\075\126\030\143\010\157\332\362\314\320\077\177\002\124\042\124 -\020\330\262\201\324\300\165\075\113\177\307\167\303\076\170\253 -\032\003\265\040\153\057\152\053\261\305\210\176\304\273\036\260 -\301\330\105\047\157\252\067\130\367\207\046\327\330\055\366\251 -\027\267\037\162\066\116\246\027\077\145\230\222\333\052\156\135 -\242\376\210\340\013\336\177\345\215\025\341\353\313\072\325\342 -\022\242\023\055\330\216\257\137\022\075\240\010\005\010\266\134 -\245\145\070\004\105\231\036\243\140\140\164\305\101\245\162\142 -\033\142\305\037\157\137\032\102\276\002\121\145\250\256\043\030 -\152\374\170\003\251\115\177\200\303\372\253\132\374\241\100\244 -\312\031\026\376\262\310\357\136\163\015\356\167\275\232\366\171 -\230\274\261\007\147\242\025\015\335\240\130\306\104\173\012\076 -\142\050\137\272\101\007\123\130\317\021\176\070\164\305\370\377 -\265\151\220\217\204\164\352\227\033\257\002\001\003\243\201\300 -\060\201\275\060\035\006\003\125\035\016\004\026\004\024\322\304 -\260\322\221\324\114\021\161\263\141\313\075\241\376\335\250\152 -\324\343\060\201\215\006\003\125\035\043\004\201\205\060\201\202 -\200\024\322\304\260\322\221\324\114\021\161\263\141\313\075\241 -\376\335\250\152\324\343\241\147\244\145\060\143\061\013\060\011 -\006\003\125\004\006\023\002\125\123\061\041\060\037\006\003\125 -\004\012\023\030\124\150\145\040\107\157\040\104\141\144\144\171 -\040\107\162\157\165\160\054\040\111\156\143\056\061\061\060\057 -\006\003\125\004\013\023\050\107\157\040\104\141\144\144\171\040 -\103\154\141\163\163\040\062\040\103\145\162\164\151\146\151\143 -\141\164\151\157\156\040\101\165\164\150\157\162\151\164\171\202 -\001\000\060\014\006\003\125\035\023\004\005\060\003\001\001\377 -\060\015\006\011\052\206\110\206\367\015\001\001\005\005\000\003 -\202\001\001\000\062\113\363\262\312\076\221\374\022\306\241\007 -\214\216\167\240\063\006\024\134\220\036\030\367\010\246\075\012 -\031\371\207\200\021\156\151\344\226\027\060\377\064\221\143\162 -\070\356\314\034\001\243\035\224\050\244\061\366\172\304\124\327 -\366\345\061\130\003\242\314\316\142\333\224\105\163\265\277\105 -\311\044\265\325\202\002\255\043\171\151\215\270\266\115\316\317 -\114\312\063\043\350\034\210\252\235\213\101\156\026\311\040\345 -\211\236\315\073\332\160\367\176\231\046\040\024\124\045\253\156 -\163\205\346\233\041\235\012\154\202\016\250\370\302\014\372\020 -\036\154\226\357\207\015\304\017\141\213\255\356\203\053\225\370 -\216\222\204\162\071\353\040\352\203\355\203\315\227\156\010\274 -\353\116\046\266\163\053\344\323\366\114\376\046\161\342\141\021 -\164\112\377\127\032\207\017\165\110\056\317\121\151\027\240\002 -\022\141\225\325\321\100\262\020\114\356\304\254\020\103\246\245 -\236\012\325\225\142\232\015\317\210\202\305\062\014\344\053\237 -\105\346\015\237\050\234\261\271\052\132\127\255\067\017\257\035 -\177\333\275\237 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Go Daddy Class 2 CA" -# Issuer: OU=Go Daddy Class 2 Certification Authority,O="The Go Daddy Group, Inc.",C=US -# Serial Number: 0 (0x0) -# Subject: OU=Go Daddy Class 2 Certification Authority,O="The Go Daddy Group, Inc.",C=US -# Not Valid Before: Tue Jun 29 17:06:20 2004 -# Not Valid After : Thu Jun 29 17:06:20 2034 -# Fingerprint (SHA-256): C3:84:6B:F2:4B:9E:93:CA:64:27:4C:0E:C6:7C:1E:CC:5E:02:4F:FC:AC:D2:D7:40:19:35:0E:81:FE:54:6A:E4 -# Fingerprint (SHA1): 27:96:BA:E6:3F:18:01:E2:77:26:1B:A0:D7:77:70:02:8F:20:EE:E4 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Go Daddy Class 2 CA" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\047\226\272\346\077\030\001\342\167\046\033\240\327\167\160\002 -\217\040\356\344 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\221\336\006\045\253\332\375\062\027\014\273\045\027\052\204\147 -END -CKA_ISSUER MULTILINE_OCTAL -\060\143\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\041\060\037\006\003\125\004\012\023\030\124\150\145\040\107\157 -\040\104\141\144\144\171\040\107\162\157\165\160\054\040\111\156 -\143\056\061\061\060\057\006\003\125\004\013\023\050\107\157\040 -\104\141\144\144\171\040\103\154\141\163\163\040\062\040\103\145 -\162\164\151\146\151\143\141\164\151\157\156\040\101\165\164\150 -\157\162\151\164\171 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\000 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Starfield Class 2 CA" -# -# Issuer: OU=Starfield Class 2 Certification Authority,O="Starfield Technologies, Inc.",C=US -# Serial Number: 0 (0x0) -# Subject: OU=Starfield Class 2 Certification Authority,O="Starfield Technologies, Inc.",C=US -# Not Valid Before: Tue Jun 29 17:39:16 2004 -# Not Valid After : Thu Jun 29 17:39:16 2034 -# Fingerprint (SHA-256): 14:65:FA:20:53:97:B8:76:FA:A6:F0:A9:95:8E:55:90:E4:0F:CC:7F:AA:4F:B7:C2:C8:67:75:21:FB:5F:B6:58 -# Fingerprint (SHA1): AD:7E:1C:28:B0:64:EF:8F:60:03:40:20:14:C3:D0:E3:37:0E:B5:8A -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Starfield Class 2 CA" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\150\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\045\060\043\006\003\125\004\012\023\034\123\164\141\162\146\151 -\145\154\144\040\124\145\143\150\156\157\154\157\147\151\145\163 -\054\040\111\156\143\056\061\062\060\060\006\003\125\004\013\023 -\051\123\164\141\162\146\151\145\154\144\040\103\154\141\163\163 -\040\062\040\103\145\162\164\151\146\151\143\141\164\151\157\156 -\040\101\165\164\150\157\162\151\164\171 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\150\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\045\060\043\006\003\125\004\012\023\034\123\164\141\162\146\151 -\145\154\144\040\124\145\143\150\156\157\154\157\147\151\145\163 -\054\040\111\156\143\056\061\062\060\060\006\003\125\004\013\023 -\051\123\164\141\162\146\151\145\154\144\040\103\154\141\163\163 -\040\062\040\103\145\162\164\151\146\151\143\141\164\151\157\156 -\040\101\165\164\150\157\162\151\164\171 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\000 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\004\017\060\202\002\367\240\003\002\001\002\002\001\000 -\060\015\006\011\052\206\110\206\367\015\001\001\005\005\000\060 -\150\061\013\060\011\006\003\125\004\006\023\002\125\123\061\045 -\060\043\006\003\125\004\012\023\034\123\164\141\162\146\151\145 -\154\144\040\124\145\143\150\156\157\154\157\147\151\145\163\054 -\040\111\156\143\056\061\062\060\060\006\003\125\004\013\023\051 -\123\164\141\162\146\151\145\154\144\040\103\154\141\163\163\040 -\062\040\103\145\162\164\151\146\151\143\141\164\151\157\156\040 -\101\165\164\150\157\162\151\164\171\060\036\027\015\060\064\060 -\066\062\071\061\067\063\071\061\066\132\027\015\063\064\060\066 -\062\071\061\067\063\071\061\066\132\060\150\061\013\060\011\006 -\003\125\004\006\023\002\125\123\061\045\060\043\006\003\125\004 -\012\023\034\123\164\141\162\146\151\145\154\144\040\124\145\143 -\150\156\157\154\157\147\151\145\163\054\040\111\156\143\056\061 -\062\060\060\006\003\125\004\013\023\051\123\164\141\162\146\151 -\145\154\144\040\103\154\141\163\163\040\062\040\103\145\162\164 -\151\146\151\143\141\164\151\157\156\040\101\165\164\150\157\162 -\151\164\171\060\202\001\040\060\015\006\011\052\206\110\206\367 -\015\001\001\001\005\000\003\202\001\015\000\060\202\001\010\002 -\202\001\001\000\267\062\310\376\351\161\246\004\205\255\014\021 -\144\337\316\115\357\310\003\030\207\077\241\253\373\074\246\237 -\360\303\241\332\324\330\156\053\123\220\373\044\244\076\204\360 -\236\350\137\354\345\047\104\365\050\246\077\173\336\340\052\360 -\310\257\123\057\236\312\005\001\223\036\217\146\034\071\247\115 -\372\132\266\163\004\045\146\353\167\177\347\131\306\112\231\045 -\024\124\353\046\307\363\177\031\325\060\160\217\257\260\106\052 -\377\255\353\051\355\327\237\252\004\207\243\324\371\211\245\064 -\137\333\103\221\202\066\331\146\074\261\270\271\202\375\234\072 -\076\020\310\073\357\006\145\146\172\233\031\030\075\377\161\121 -\074\060\056\137\276\075\167\163\262\135\006\154\303\043\126\232 -\053\205\046\222\034\247\002\263\344\077\015\257\010\171\202\270 -\066\075\352\234\323\065\263\274\151\312\365\314\235\350\375\144 -\215\027\200\063\156\136\112\135\231\311\036\207\264\235\032\300 -\325\156\023\065\043\136\337\233\137\075\357\326\367\166\302\352 -\076\273\170\015\034\102\147\153\004\330\370\326\332\157\213\362 -\104\240\001\253\002\001\003\243\201\305\060\201\302\060\035\006 -\003\125\035\016\004\026\004\024\277\137\267\321\316\335\037\206 -\364\133\125\254\334\327\020\302\016\251\210\347\060\201\222\006 -\003\125\035\043\004\201\212\060\201\207\200\024\277\137\267\321 -\316\335\037\206\364\133\125\254\334\327\020\302\016\251\210\347 -\241\154\244\152\060\150\061\013\060\011\006\003\125\004\006\023 -\002\125\123\061\045\060\043\006\003\125\004\012\023\034\123\164 -\141\162\146\151\145\154\144\040\124\145\143\150\156\157\154\157 -\147\151\145\163\054\040\111\156\143\056\061\062\060\060\006\003 -\125\004\013\023\051\123\164\141\162\146\151\145\154\144\040\103 -\154\141\163\163\040\062\040\103\145\162\164\151\146\151\143\141 -\164\151\157\156\040\101\165\164\150\157\162\151\164\171\202\001 -\000\060\014\006\003\125\035\023\004\005\060\003\001\001\377\060 -\015\006\011\052\206\110\206\367\015\001\001\005\005\000\003\202 -\001\001\000\005\235\077\210\235\321\311\032\125\241\254\151\363 -\363\131\332\233\001\207\032\117\127\251\241\171\011\052\333\367 -\057\262\036\314\307\136\152\330\203\207\241\227\357\111\065\076 -\167\006\101\130\142\277\216\130\270\012\147\077\354\263\335\041 -\146\037\311\124\372\162\314\075\114\100\330\201\257\167\236\203 -\172\273\242\307\365\064\027\216\331\021\100\364\374\054\052\115 -\025\177\247\142\135\056\045\323\000\013\040\032\035\150\371\027 -\270\364\275\213\355\050\131\335\115\026\213\027\203\310\262\145 -\307\055\172\245\252\274\123\206\155\335\127\244\312\370\040\101 -\013\150\360\364\373\164\276\126\135\172\171\365\371\035\205\343 -\055\225\276\365\161\220\103\314\215\037\232\000\012\207\051\351 -\125\042\130\000\043\352\343\022\103\051\133\107\010\335\214\101 -\152\145\006\250\345\041\252\101\264\225\041\225\271\175\321\064 -\253\023\326\255\274\334\342\075\071\315\275\076\165\160\241\030 -\131\003\311\042\264\217\234\325\136\052\327\245\266\324\012\155 -\370\267\100\021\106\232\037\171\016\142\277\017\227\354\340\057 -\037\027\224 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Starfield Class 2 CA" -# Issuer: OU=Starfield Class 2 Certification Authority,O="Starfield Technologies, Inc.",C=US -# Serial Number: 0 (0x0) -# Subject: OU=Starfield Class 2 Certification Authority,O="Starfield Technologies, Inc.",C=US -# Not Valid Before: Tue Jun 29 17:39:16 2004 -# Not Valid After : Thu Jun 29 17:39:16 2034 -# Fingerprint (SHA-256): 14:65:FA:20:53:97:B8:76:FA:A6:F0:A9:95:8E:55:90:E4:0F:CC:7F:AA:4F:B7:C2:C8:67:75:21:FB:5F:B6:58 -# Fingerprint (SHA1): AD:7E:1C:28:B0:64:EF:8F:60:03:40:20:14:C3:D0:E3:37:0E:B5:8A -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Starfield Class 2 CA" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\255\176\034\050\260\144\357\217\140\003\100\040\024\303\320\343 -\067\016\265\212 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\062\112\113\273\310\143\151\233\276\164\232\306\335\035\106\044 -END -CKA_ISSUER MULTILINE_OCTAL -\060\150\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\045\060\043\006\003\125\004\012\023\034\123\164\141\162\146\151 -\145\154\144\040\124\145\143\150\156\157\154\157\147\151\145\163 -\054\040\111\156\143\056\061\062\060\060\006\003\125\004\013\023 -\051\123\164\141\162\146\151\145\154\144\040\103\154\141\163\163 -\040\062\040\103\145\162\164\151\146\151\143\141\164\151\157\156 -\040\101\165\164\150\157\162\151\164\171 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\000 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "DigiCert Assured ID Root CA" -# -# Issuer: CN=DigiCert Assured ID Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US -# Serial Number:0c:e7:e0:e5:17:d8:46:fe:8f:e5:60:fc:1b:f0:30:39 -# Subject: CN=DigiCert Assured ID Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US -# Not Valid Before: Fri Nov 10 00:00:00 2006 -# Not Valid After : Mon Nov 10 00:00:00 2031 -# Fingerprint (SHA-256): 3E:90:99:B5:01:5E:8F:48:6C:00:BC:EA:9D:11:1E:E7:21:FA:BA:35:5A:89:BC:F1:DF:69:56:1E:3D:C6:32:5C -# Fingerprint (SHA1): 05:63:B8:63:0D:62:D7:5A:BB:C8:AB:1E:4B:DF:B5:A8:99:B2:4D:43 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "DigiCert Assured ID Root CA" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\145\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\025\060\023\006\003\125\004\012\023\014\104\151\147\151\103\145 -\162\164\040\111\156\143\061\031\060\027\006\003\125\004\013\023 -\020\167\167\167\056\144\151\147\151\143\145\162\164\056\143\157 -\155\061\044\060\042\006\003\125\004\003\023\033\104\151\147\151 -\103\145\162\164\040\101\163\163\165\162\145\144\040\111\104\040 -\122\157\157\164\040\103\101 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\145\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\025\060\023\006\003\125\004\012\023\014\104\151\147\151\103\145 -\162\164\040\111\156\143\061\031\060\027\006\003\125\004\013\023 -\020\167\167\167\056\144\151\147\151\143\145\162\164\056\143\157 -\155\061\044\060\042\006\003\125\004\003\023\033\104\151\147\151 -\103\145\162\164\040\101\163\163\165\162\145\144\040\111\104\040 -\122\157\157\164\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\014\347\340\345\027\330\106\376\217\345\140\374\033\360 -\060\071 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\003\267\060\202\002\237\240\003\002\001\002\002\020\014 -\347\340\345\027\330\106\376\217\345\140\374\033\360\060\071\060 -\015\006\011\052\206\110\206\367\015\001\001\005\005\000\060\145 -\061\013\060\011\006\003\125\004\006\023\002\125\123\061\025\060 -\023\006\003\125\004\012\023\014\104\151\147\151\103\145\162\164 -\040\111\156\143\061\031\060\027\006\003\125\004\013\023\020\167 -\167\167\056\144\151\147\151\143\145\162\164\056\143\157\155\061 -\044\060\042\006\003\125\004\003\023\033\104\151\147\151\103\145 -\162\164\040\101\163\163\165\162\145\144\040\111\104\040\122\157 -\157\164\040\103\101\060\036\027\015\060\066\061\061\061\060\060 -\060\060\060\060\060\132\027\015\063\061\061\061\061\060\060\060 -\060\060\060\060\132\060\145\061\013\060\011\006\003\125\004\006 -\023\002\125\123\061\025\060\023\006\003\125\004\012\023\014\104 -\151\147\151\103\145\162\164\040\111\156\143\061\031\060\027\006 -\003\125\004\013\023\020\167\167\167\056\144\151\147\151\143\145 -\162\164\056\143\157\155\061\044\060\042\006\003\125\004\003\023 -\033\104\151\147\151\103\145\162\164\040\101\163\163\165\162\145 -\144\040\111\104\040\122\157\157\164\040\103\101\060\202\001\042 -\060\015\006\011\052\206\110\206\367\015\001\001\001\005\000\003 -\202\001\017\000\060\202\001\012\002\202\001\001\000\255\016\025 -\316\344\103\200\134\261\207\363\267\140\371\161\022\245\256\334 -\046\224\210\252\364\316\365\040\071\050\130\140\014\370\200\332 -\251\025\225\062\141\074\265\261\050\204\212\212\334\237\012\014 -\203\027\172\217\220\254\212\347\171\123\134\061\204\052\366\017 -\230\062\066\166\314\336\335\074\250\242\357\152\373\041\362\122 -\141\337\237\040\327\037\342\261\331\376\030\144\322\022\133\137 -\371\130\030\065\274\107\315\241\066\371\153\177\324\260\070\076 -\301\033\303\214\063\331\330\057\030\376\050\017\263\247\203\326 -\303\156\104\300\141\065\226\026\376\131\234\213\166\155\327\361 -\242\113\015\053\377\013\162\332\236\140\320\216\220\065\306\170 -\125\207\040\241\317\345\155\012\310\111\174\061\230\063\154\042 -\351\207\320\062\132\242\272\023\202\021\355\071\027\235\231\072 -\162\241\346\372\244\331\325\027\061\165\256\205\175\042\256\077 -\001\106\206\366\050\171\310\261\332\344\127\027\304\176\034\016 -\260\264\222\246\126\263\275\262\227\355\252\247\360\267\305\250 -\077\225\026\320\377\241\226\353\010\137\030\167\117\002\003\001 -\000\001\243\143\060\141\060\016\006\003\125\035\017\001\001\377 -\004\004\003\002\001\206\060\017\006\003\125\035\023\001\001\377 -\004\005\060\003\001\001\377\060\035\006\003\125\035\016\004\026 -\004\024\105\353\242\257\364\222\313\202\061\055\121\213\247\247 -\041\235\363\155\310\017\060\037\006\003\125\035\043\004\030\060 -\026\200\024\105\353\242\257\364\222\313\202\061\055\121\213\247 -\247\041\235\363\155\310\017\060\015\006\011\052\206\110\206\367 -\015\001\001\005\005\000\003\202\001\001\000\242\016\274\337\342 -\355\360\343\162\163\172\144\224\277\367\162\146\330\062\344\102 -\165\142\256\207\353\362\325\331\336\126\263\237\314\316\024\050 -\271\015\227\140\134\022\114\130\344\323\075\203\111\105\130\227 -\065\151\032\250\107\352\126\306\171\253\022\330\147\201\204\337 -\177\011\074\224\346\270\046\054\040\275\075\263\050\211\367\137 -\377\042\342\227\204\037\351\145\357\207\340\337\301\147\111\263 -\135\353\262\011\052\353\046\355\170\276\175\077\053\363\267\046 -\065\155\137\211\001\266\111\133\237\001\005\233\253\075\045\301 -\314\266\177\302\361\157\206\306\372\144\150\353\201\055\224\353 -\102\267\372\214\036\335\142\361\276\120\147\267\154\275\363\361 -\037\153\014\066\007\026\177\067\174\251\133\155\172\361\022\106 -\140\203\327\047\004\276\113\316\227\276\303\147\052\150\021\337 -\200\347\014\063\146\277\023\015\024\156\363\177\037\143\020\036 -\372\215\033\045\155\154\217\245\267\141\001\261\322\243\046\241 -\020\161\235\255\342\303\371\303\231\121\267\053\007\010\316\056 -\346\120\262\247\372\012\105\057\242\360\362 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "DigiCert Assured ID Root CA" -# Issuer: CN=DigiCert Assured ID Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US -# Serial Number:0c:e7:e0:e5:17:d8:46:fe:8f:e5:60:fc:1b:f0:30:39 -# Subject: CN=DigiCert Assured ID Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US -# Not Valid Before: Fri Nov 10 00:00:00 2006 -# Not Valid After : Mon Nov 10 00:00:00 2031 -# Fingerprint (SHA-256): 3E:90:99:B5:01:5E:8F:48:6C:00:BC:EA:9D:11:1E:E7:21:FA:BA:35:5A:89:BC:F1:DF:69:56:1E:3D:C6:32:5C -# Fingerprint (SHA1): 05:63:B8:63:0D:62:D7:5A:BB:C8:AB:1E:4B:DF:B5:A8:99:B2:4D:43 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "DigiCert Assured ID Root CA" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\005\143\270\143\015\142\327\132\273\310\253\036\113\337\265\250 -\231\262\115\103 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\207\316\013\173\052\016\111\000\341\130\161\233\067\250\223\162 -END -CKA_ISSUER MULTILINE_OCTAL -\060\145\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\025\060\023\006\003\125\004\012\023\014\104\151\147\151\103\145 -\162\164\040\111\156\143\061\031\060\027\006\003\125\004\013\023 -\020\167\167\167\056\144\151\147\151\143\145\162\164\056\143\157 -\155\061\044\060\042\006\003\125\004\003\023\033\104\151\147\151 -\103\145\162\164\040\101\163\163\165\162\145\144\040\111\104\040 -\122\157\157\164\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\014\347\340\345\027\330\106\376\217\345\140\374\033\360 -\060\071 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "DigiCert Global Root CA" -# -# Issuer: CN=DigiCert Global Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US -# Serial Number:08:3b:e0:56:90:42:46:b1:a1:75:6a:c9:59:91:c7:4a -# Subject: CN=DigiCert Global Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US -# Not Valid Before: Fri Nov 10 00:00:00 2006 -# Not Valid After : Mon Nov 10 00:00:00 2031 -# Fingerprint (SHA-256): 43:48:A0:E9:44:4C:78:CB:26:5E:05:8D:5E:89:44:B4:D8:4F:96:62:BD:26:DB:25:7F:89:34:A4:43:C7:01:61 -# Fingerprint (SHA1): A8:98:5D:3A:65:E5:E5:C4:B2:D7:D6:6D:40:C6:DD:2F:B1:9C:54:36 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "DigiCert Global Root CA" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\141\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\025\060\023\006\003\125\004\012\023\014\104\151\147\151\103\145 -\162\164\040\111\156\143\061\031\060\027\006\003\125\004\013\023 -\020\167\167\167\056\144\151\147\151\143\145\162\164\056\143\157 -\155\061\040\060\036\006\003\125\004\003\023\027\104\151\147\151 -\103\145\162\164\040\107\154\157\142\141\154\040\122\157\157\164 -\040\103\101 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\141\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\025\060\023\006\003\125\004\012\023\014\104\151\147\151\103\145 -\162\164\040\111\156\143\061\031\060\027\006\003\125\004\013\023 -\020\167\167\167\056\144\151\147\151\143\145\162\164\056\143\157 -\155\061\040\060\036\006\003\125\004\003\023\027\104\151\147\151 -\103\145\162\164\040\107\154\157\142\141\154\040\122\157\157\164 -\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\010\073\340\126\220\102\106\261\241\165\152\311\131\221 -\307\112 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\003\257\060\202\002\227\240\003\002\001\002\002\020\010 -\073\340\126\220\102\106\261\241\165\152\311\131\221\307\112\060 -\015\006\011\052\206\110\206\367\015\001\001\005\005\000\060\141 -\061\013\060\011\006\003\125\004\006\023\002\125\123\061\025\060 -\023\006\003\125\004\012\023\014\104\151\147\151\103\145\162\164 -\040\111\156\143\061\031\060\027\006\003\125\004\013\023\020\167 -\167\167\056\144\151\147\151\143\145\162\164\056\143\157\155\061 -\040\060\036\006\003\125\004\003\023\027\104\151\147\151\103\145 -\162\164\040\107\154\157\142\141\154\040\122\157\157\164\040\103 -\101\060\036\027\015\060\066\061\061\061\060\060\060\060\060\060 -\060\132\027\015\063\061\061\061\061\060\060\060\060\060\060\060 -\132\060\141\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\025\060\023\006\003\125\004\012\023\014\104\151\147\151\103 -\145\162\164\040\111\156\143\061\031\060\027\006\003\125\004\013 -\023\020\167\167\167\056\144\151\147\151\143\145\162\164\056\143 -\157\155\061\040\060\036\006\003\125\004\003\023\027\104\151\147 -\151\103\145\162\164\040\107\154\157\142\141\154\040\122\157\157 -\164\040\103\101\060\202\001\042\060\015\006\011\052\206\110\206 -\367\015\001\001\001\005\000\003\202\001\017\000\060\202\001\012 -\002\202\001\001\000\342\073\341\021\162\336\250\244\323\243\127 -\252\120\242\217\013\167\220\311\242\245\356\022\316\226\133\001 -\011\040\314\001\223\247\116\060\267\123\367\103\304\151\000\127 -\235\342\215\042\335\207\006\100\000\201\011\316\316\033\203\277 -\337\315\073\161\106\342\326\146\307\005\263\166\047\026\217\173 -\236\036\225\175\356\267\110\243\010\332\326\257\172\014\071\006 -\145\177\112\135\037\274\027\370\253\276\356\050\327\164\177\172 -\170\231\131\205\150\156\134\043\062\113\277\116\300\350\132\155 -\343\160\277\167\020\277\374\001\366\205\331\250\104\020\130\062 -\251\165\030\325\321\242\276\107\342\047\152\364\232\063\370\111 -\010\140\213\324\137\264\072\204\277\241\252\112\114\175\076\317 -\117\137\154\166\136\240\113\067\221\236\334\042\346\155\316\024 -\032\216\152\313\376\315\263\024\144\027\307\133\051\236\062\277 -\362\356\372\323\013\102\324\253\267\101\062\332\014\324\357\370 -\201\325\273\215\130\077\265\033\350\111\050\242\160\332\061\004 -\335\367\262\026\362\114\012\116\007\250\355\112\075\136\265\177 -\243\220\303\257\047\002\003\001\000\001\243\143\060\141\060\016 -\006\003\125\035\017\001\001\377\004\004\003\002\001\206\060\017 -\006\003\125\035\023\001\001\377\004\005\060\003\001\001\377\060 -\035\006\003\125\035\016\004\026\004\024\003\336\120\065\126\321 -\114\273\146\360\243\342\033\033\303\227\262\075\321\125\060\037 -\006\003\125\035\043\004\030\060\026\200\024\003\336\120\065\126 -\321\114\273\146\360\243\342\033\033\303\227\262\075\321\125\060 -\015\006\011\052\206\110\206\367\015\001\001\005\005\000\003\202 -\001\001\000\313\234\067\252\110\023\022\012\372\335\104\234\117 -\122\260\364\337\256\004\365\171\171\010\243\044\030\374\113\053 -\204\300\055\271\325\307\376\364\301\037\130\313\270\155\234\172 -\164\347\230\051\253\021\265\343\160\240\241\315\114\210\231\223 -\214\221\160\342\253\017\034\276\223\251\377\143\325\344\007\140 -\323\243\277\235\133\011\361\325\216\343\123\364\216\143\372\077 -\247\333\264\146\337\142\146\326\321\156\101\215\362\055\265\352 -\167\112\237\235\130\342\053\131\300\100\043\355\055\050\202\105 -\076\171\124\222\046\230\340\200\110\250\067\357\360\326\171\140 -\026\336\254\350\016\315\156\254\104\027\070\057\111\332\341\105 -\076\052\271\066\123\317\072\120\006\367\056\350\304\127\111\154 -\141\041\030\325\004\255\170\074\054\072\200\153\247\353\257\025 -\024\351\330\211\301\271\070\154\342\221\154\212\377\144\271\167 -\045\127\060\300\033\044\243\341\334\351\337\107\174\265\264\044 -\010\005\060\354\055\275\013\277\105\277\120\271\251\363\353\230 -\001\022\255\310\210\306\230\064\137\215\012\074\306\351\325\225 -\225\155\336 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "DigiCert Global Root CA" -# Issuer: CN=DigiCert Global Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US -# Serial Number:08:3b:e0:56:90:42:46:b1:a1:75:6a:c9:59:91:c7:4a -# Subject: CN=DigiCert Global Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US -# Not Valid Before: Fri Nov 10 00:00:00 2006 -# Not Valid After : Mon Nov 10 00:00:00 2031 -# Fingerprint (SHA-256): 43:48:A0:E9:44:4C:78:CB:26:5E:05:8D:5E:89:44:B4:D8:4F:96:62:BD:26:DB:25:7F:89:34:A4:43:C7:01:61 -# Fingerprint (SHA1): A8:98:5D:3A:65:E5:E5:C4:B2:D7:D6:6D:40:C6:DD:2F:B1:9C:54:36 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "DigiCert Global Root CA" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\250\230\135\072\145\345\345\304\262\327\326\155\100\306\335\057 -\261\234\124\066 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\171\344\251\204\015\175\072\226\327\300\117\342\103\114\211\056 -END -CKA_ISSUER MULTILINE_OCTAL -\060\141\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\025\060\023\006\003\125\004\012\023\014\104\151\147\151\103\145 -\162\164\040\111\156\143\061\031\060\027\006\003\125\004\013\023 -\020\167\167\167\056\144\151\147\151\143\145\162\164\056\143\157 -\155\061\040\060\036\006\003\125\004\003\023\027\104\151\147\151 -\103\145\162\164\040\107\154\157\142\141\154\040\122\157\157\164 -\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\010\073\340\126\220\102\106\261\241\165\152\311\131\221 -\307\112 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "DigiCert High Assurance EV Root CA" -# -# Issuer: CN=DigiCert High Assurance EV Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US -# Serial Number:02:ac:5c:26:6a:0b:40:9b:8f:0b:79:f2:ae:46:25:77 -# Subject: CN=DigiCert High Assurance EV Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US -# Not Valid Before: Fri Nov 10 00:00:00 2006 -# Not Valid After : Mon Nov 10 00:00:00 2031 -# Fingerprint (SHA-256): 74:31:E5:F4:C3:C1:CE:46:90:77:4F:0B:61:E0:54:40:88:3B:A9:A0:1E:D0:0B:A6:AB:D7:80:6E:D3:B1:18:CF -# Fingerprint (SHA1): 5F:B7:EE:06:33:E2:59:DB:AD:0C:4C:9A:E6:D3:8F:1A:61:C7:DC:25 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "DigiCert High Assurance EV Root CA" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\154\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\025\060\023\006\003\125\004\012\023\014\104\151\147\151\103\145 -\162\164\040\111\156\143\061\031\060\027\006\003\125\004\013\023 -\020\167\167\167\056\144\151\147\151\143\145\162\164\056\143\157 -\155\061\053\060\051\006\003\125\004\003\023\042\104\151\147\151 -\103\145\162\164\040\110\151\147\150\040\101\163\163\165\162\141 -\156\143\145\040\105\126\040\122\157\157\164\040\103\101 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\154\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\025\060\023\006\003\125\004\012\023\014\104\151\147\151\103\145 -\162\164\040\111\156\143\061\031\060\027\006\003\125\004\013\023 -\020\167\167\167\056\144\151\147\151\143\145\162\164\056\143\157 -\155\061\053\060\051\006\003\125\004\003\023\042\104\151\147\151 -\103\145\162\164\040\110\151\147\150\040\101\163\163\165\162\141 -\156\143\145\040\105\126\040\122\157\157\164\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\002\254\134\046\152\013\100\233\217\013\171\362\256\106 -\045\167 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\003\305\060\202\002\255\240\003\002\001\002\002\020\002 -\254\134\046\152\013\100\233\217\013\171\362\256\106\045\167\060 -\015\006\011\052\206\110\206\367\015\001\001\005\005\000\060\154 -\061\013\060\011\006\003\125\004\006\023\002\125\123\061\025\060 -\023\006\003\125\004\012\023\014\104\151\147\151\103\145\162\164 -\040\111\156\143\061\031\060\027\006\003\125\004\013\023\020\167 -\167\167\056\144\151\147\151\143\145\162\164\056\143\157\155\061 -\053\060\051\006\003\125\004\003\023\042\104\151\147\151\103\145 -\162\164\040\110\151\147\150\040\101\163\163\165\162\141\156\143 -\145\040\105\126\040\122\157\157\164\040\103\101\060\036\027\015 -\060\066\061\061\061\060\060\060\060\060\060\060\132\027\015\063 -\061\061\061\061\060\060\060\060\060\060\060\132\060\154\061\013 -\060\011\006\003\125\004\006\023\002\125\123\061\025\060\023\006 -\003\125\004\012\023\014\104\151\147\151\103\145\162\164\040\111 -\156\143\061\031\060\027\006\003\125\004\013\023\020\167\167\167 -\056\144\151\147\151\143\145\162\164\056\143\157\155\061\053\060 -\051\006\003\125\004\003\023\042\104\151\147\151\103\145\162\164 -\040\110\151\147\150\040\101\163\163\165\162\141\156\143\145\040 -\105\126\040\122\157\157\164\040\103\101\060\202\001\042\060\015 -\006\011\052\206\110\206\367\015\001\001\001\005\000\003\202\001 -\017\000\060\202\001\012\002\202\001\001\000\306\314\345\163\346 -\373\324\273\345\055\055\062\246\337\345\201\077\311\315\045\111 -\266\161\052\303\325\224\064\147\242\012\034\260\137\151\246\100 -\261\304\267\262\217\320\230\244\251\101\131\072\323\334\224\326 -\074\333\164\070\244\112\314\115\045\202\367\112\245\123\022\070 -\356\363\111\155\161\221\176\143\266\253\246\137\303\244\204\370 -\117\142\121\276\370\305\354\333\070\222\343\006\345\010\221\014 -\304\050\101\125\373\313\132\211\025\176\161\350\065\277\115\162 -\011\075\276\072\070\120\133\167\061\033\215\263\307\044\105\232 -\247\254\155\000\024\132\004\267\272\023\353\121\012\230\101\101 -\042\116\145\141\207\201\101\120\246\171\134\211\336\031\112\127 -\325\056\346\135\034\123\054\176\230\315\032\006\026\244\150\163 -\320\064\004\023\134\241\161\323\132\174\125\333\136\144\341\067 -\207\060\126\004\345\021\264\051\200\022\361\171\071\210\242\002 -\021\174\047\146\267\210\267\170\362\312\012\250\070\253\012\144 -\302\277\146\135\225\204\301\241\045\036\207\135\032\120\013\040 -\022\314\101\273\156\013\121\070\270\113\313\002\003\001\000\001 -\243\143\060\141\060\016\006\003\125\035\017\001\001\377\004\004 -\003\002\001\206\060\017\006\003\125\035\023\001\001\377\004\005 -\060\003\001\001\377\060\035\006\003\125\035\016\004\026\004\024 -\261\076\303\151\003\370\277\107\001\324\230\046\032\010\002\357 -\143\144\053\303\060\037\006\003\125\035\043\004\030\060\026\200 -\024\261\076\303\151\003\370\277\107\001\324\230\046\032\010\002 -\357\143\144\053\303\060\015\006\011\052\206\110\206\367\015\001 -\001\005\005\000\003\202\001\001\000\034\032\006\227\334\327\234 -\237\074\210\146\006\010\127\041\333\041\107\370\052\147\252\277 -\030\062\166\100\020\127\301\212\363\172\331\021\145\216\065\372 -\236\374\105\265\236\331\114\061\113\270\221\350\103\054\216\263 -\170\316\333\343\123\171\161\326\345\041\224\001\332\125\207\232 -\044\144\366\212\146\314\336\234\067\315\250\064\261\151\233\043 -\310\236\170\042\053\160\103\343\125\107\061\141\031\357\130\305 -\205\057\116\060\366\240\061\026\043\310\347\342\145\026\063\313 -\277\032\033\240\075\370\312\136\213\061\213\140\010\211\055\014 -\006\134\122\267\304\371\012\230\321\025\137\237\022\276\174\066 -\143\070\275\104\244\177\344\046\053\012\304\227\151\015\351\214 -\342\300\020\127\270\310\166\022\221\125\362\110\151\330\274\052 -\002\133\017\104\324\040\061\333\364\272\160\046\135\220\140\236 -\274\113\027\011\057\264\313\036\103\150\311\007\047\301\322\134 -\367\352\041\271\150\022\234\074\234\277\236\374\200\134\233\143 -\315\354\107\252\045\047\147\240\067\363\000\202\175\124\327\251 -\370\351\056\023\243\167\350\037\112 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "DigiCert High Assurance EV Root CA" -# Issuer: CN=DigiCert High Assurance EV Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US -# Serial Number:02:ac:5c:26:6a:0b:40:9b:8f:0b:79:f2:ae:46:25:77 -# Subject: CN=DigiCert High Assurance EV Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US -# Not Valid Before: Fri Nov 10 00:00:00 2006 -# Not Valid After : Mon Nov 10 00:00:00 2031 -# Fingerprint (SHA-256): 74:31:E5:F4:C3:C1:CE:46:90:77:4F:0B:61:E0:54:40:88:3B:A9:A0:1E:D0:0B:A6:AB:D7:80:6E:D3:B1:18:CF -# Fingerprint (SHA1): 5F:B7:EE:06:33:E2:59:DB:AD:0C:4C:9A:E6:D3:8F:1A:61:C7:DC:25 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "DigiCert High Assurance EV Root CA" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\137\267\356\006\063\342\131\333\255\014\114\232\346\323\217\032 -\141\307\334\045 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\324\164\336\127\134\071\262\323\234\205\203\305\300\145\111\212 -END -CKA_ISSUER MULTILINE_OCTAL -\060\154\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\025\060\023\006\003\125\004\012\023\014\104\151\147\151\103\145 -\162\164\040\111\156\143\061\031\060\027\006\003\125\004\013\023 -\020\167\167\167\056\144\151\147\151\143\145\162\164\056\143\157 -\155\061\053\060\051\006\003\125\004\003\023\042\104\151\147\151 -\103\145\162\164\040\110\151\147\150\040\101\163\163\165\162\141 -\156\143\145\040\105\126\040\122\157\157\164\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\002\254\134\046\152\013\100\233\217\013\171\362\256\106 -\045\167 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "SwissSign Gold CA - G2" -# -# Issuer: CN=SwissSign Gold CA - G2,O=SwissSign AG,C=CH -# Serial Number:00:bb:40:1c:43:f5:5e:4f:b0 -# Subject: CN=SwissSign Gold CA - G2,O=SwissSign AG,C=CH -# Not Valid Before: Wed Oct 25 08:30:35 2006 -# Not Valid After : Sat Oct 25 08:30:35 2036 -# Fingerprint (SHA-256): 62:DD:0B:E9:B9:F5:0A:16:3E:A0:F8:E7:5C:05:3B:1E:CA:57:EA:55:C8:68:8F:64:7C:68:81:F2:C8:35:7B:95 -# Fingerprint (SHA1): D8:C5:38:8A:B7:30:1B:1B:6E:D4:7A:E6:45:25:3A:6F:9F:1A:27:61 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "SwissSign Gold CA - G2" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\105\061\013\060\011\006\003\125\004\006\023\002\103\110\061 -\025\060\023\006\003\125\004\012\023\014\123\167\151\163\163\123 -\151\147\156\040\101\107\061\037\060\035\006\003\125\004\003\023 -\026\123\167\151\163\163\123\151\147\156\040\107\157\154\144\040 -\103\101\040\055\040\107\062 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\105\061\013\060\011\006\003\125\004\006\023\002\103\110\061 -\025\060\023\006\003\125\004\012\023\014\123\167\151\163\163\123 -\151\147\156\040\101\107\061\037\060\035\006\003\125\004\003\023 -\026\123\167\151\163\163\123\151\147\156\040\107\157\154\144\040 -\103\101\040\055\040\107\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\011\000\273\100\034\103\365\136\117\260 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\272\060\202\003\242\240\003\002\001\002\002\011\000 -\273\100\034\103\365\136\117\260\060\015\006\011\052\206\110\206 -\367\015\001\001\005\005\000\060\105\061\013\060\011\006\003\125 -\004\006\023\002\103\110\061\025\060\023\006\003\125\004\012\023 -\014\123\167\151\163\163\123\151\147\156\040\101\107\061\037\060 -\035\006\003\125\004\003\023\026\123\167\151\163\163\123\151\147 -\156\040\107\157\154\144\040\103\101\040\055\040\107\062\060\036 -\027\015\060\066\061\060\062\065\060\070\063\060\063\065\132\027 -\015\063\066\061\060\062\065\060\070\063\060\063\065\132\060\105 -\061\013\060\011\006\003\125\004\006\023\002\103\110\061\025\060 -\023\006\003\125\004\012\023\014\123\167\151\163\163\123\151\147 -\156\040\101\107\061\037\060\035\006\003\125\004\003\023\026\123 -\167\151\163\163\123\151\147\156\040\107\157\154\144\040\103\101 -\040\055\040\107\062\060\202\002\042\060\015\006\011\052\206\110 -\206\367\015\001\001\001\005\000\003\202\002\017\000\060\202\002 -\012\002\202\002\001\000\257\344\356\176\213\044\016\022\156\251 -\120\055\026\104\073\222\222\134\312\270\135\204\222\102\023\052 -\274\145\127\202\100\076\127\044\315\120\213\045\052\267\157\374 -\357\242\320\300\037\002\044\112\023\226\217\043\023\346\050\130 -\000\243\107\307\006\247\204\043\053\273\275\226\053\177\125\314 -\213\301\127\037\016\142\145\017\335\075\126\212\163\332\256\176 -\155\272\201\034\176\102\214\040\065\331\103\115\204\372\204\333 -\122\054\363\016\047\167\013\153\277\021\057\162\170\237\056\330 -\076\346\030\067\132\052\162\371\332\142\220\222\225\312\037\234 -\351\263\074\053\313\363\001\023\277\132\317\301\265\012\140\275 -\335\265\231\144\123\270\240\226\263\157\342\046\167\221\214\340 -\142\020\002\237\064\017\244\325\222\063\121\336\276\215\272\204 -\172\140\074\152\333\237\053\354\336\336\001\077\156\115\345\120 -\206\313\264\257\355\104\100\305\312\132\214\332\322\053\174\250 -\356\276\246\345\012\252\016\245\337\005\122\267\125\307\042\135 -\062\152\227\227\143\023\333\311\333\171\066\173\205\072\112\305 -\122\211\371\044\347\235\167\251\202\377\125\034\245\161\151\053 -\321\002\044\362\263\046\324\153\332\004\125\345\301\012\307\155 -\060\067\220\052\344\236\024\063\136\026\027\125\305\133\265\313 -\064\211\222\361\235\046\217\241\007\324\306\262\170\120\333\014 -\014\013\174\013\214\101\327\271\351\335\214\210\367\243\115\262 -\062\314\330\027\332\315\267\316\146\235\324\375\136\377\275\227 -\076\051\165\347\176\247\142\130\257\045\064\245\101\307\075\274 -\015\120\312\003\003\017\010\132\037\225\163\170\142\277\257\162 -\024\151\016\245\345\003\016\170\216\046\050\102\360\007\013\142 -\040\020\147\071\106\372\251\003\314\004\070\172\146\357\040\203 -\265\214\112\126\216\221\000\374\216\134\202\336\210\240\303\342 -\150\156\175\215\357\074\335\145\364\135\254\121\357\044\200\256 -\252\126\227\157\371\255\175\332\141\077\230\167\074\245\221\266 -\034\214\046\332\145\242\011\155\301\342\124\343\271\312\114\114 -\200\217\167\173\140\232\036\337\266\362\110\036\016\272\116\124 -\155\230\340\341\242\032\242\167\120\317\304\143\222\354\107\031 -\235\353\346\153\316\301\002\003\001\000\001\243\201\254\060\201 -\251\060\016\006\003\125\035\017\001\001\377\004\004\003\002\001 -\006\060\017\006\003\125\035\023\001\001\377\004\005\060\003\001 -\001\377\060\035\006\003\125\035\016\004\026\004\024\133\045\173 -\226\244\145\121\176\270\071\363\300\170\146\136\350\072\347\360 -\356\060\037\006\003\125\035\043\004\030\060\026\200\024\133\045 -\173\226\244\145\121\176\270\071\363\300\170\146\136\350\072\347 -\360\356\060\106\006\003\125\035\040\004\077\060\075\060\073\006 -\011\140\205\164\001\131\001\002\001\001\060\056\060\054\006\010 -\053\006\001\005\005\007\002\001\026\040\150\164\164\160\072\057 -\057\162\145\160\157\163\151\164\157\162\171\056\163\167\151\163 -\163\163\151\147\156\056\143\157\155\057\060\015\006\011\052\206 -\110\206\367\015\001\001\005\005\000\003\202\002\001\000\047\272 -\343\224\174\361\256\300\336\027\346\345\330\325\365\124\260\203 -\364\273\315\136\005\173\117\237\165\146\257\074\350\126\176\374 -\162\170\070\003\331\053\142\033\000\271\370\351\140\315\314\316 -\121\212\307\120\061\156\341\112\176\030\057\151\131\266\075\144 -\201\053\343\203\204\346\042\207\216\175\340\356\002\231\141\270 -\036\364\270\053\210\022\026\204\302\061\223\070\226\061\246\271 -\073\123\077\303\044\223\126\133\151\222\354\305\301\273\070\000 -\343\354\027\251\270\334\307\174\001\203\237\062\107\272\122\042 -\064\035\062\172\011\126\247\174\045\066\251\075\113\332\300\202 -\157\012\273\022\310\207\113\047\021\371\036\055\307\223\077\236 -\333\137\046\153\122\331\056\212\361\024\306\104\215\025\251\267 -\277\275\336\246\032\356\256\055\373\110\167\027\376\273\354\257 -\030\365\052\121\360\071\204\227\225\154\156\033\303\053\304\164 -\140\171\045\260\012\047\337\337\136\322\071\317\105\175\102\113 -\337\263\054\036\305\306\135\312\125\072\240\234\151\232\217\332 -\357\262\260\074\237\207\154\022\053\145\160\025\122\061\032\044 -\317\157\061\043\120\037\214\117\217\043\303\164\101\143\034\125 -\250\024\335\076\340\121\120\317\361\033\060\126\016\222\260\202 -\205\330\203\313\042\144\274\055\270\045\325\124\242\270\006\352 -\255\222\244\044\240\301\206\265\112\023\152\107\317\056\013\126 -\225\124\313\316\232\333\152\264\246\262\333\101\010\206\047\167 -\367\152\240\102\154\013\070\316\327\165\120\062\222\302\337\053 -\060\042\110\320\325\101\070\045\135\244\351\135\237\306\224\165 -\320\105\375\060\227\103\217\220\253\012\307\206\163\140\112\151 -\055\336\245\170\327\006\332\152\236\113\076\167\072\040\023\042 -\001\320\277\150\236\143\140\153\065\115\013\155\272\241\075\300 -\223\340\177\043\263\125\255\162\045\116\106\371\322\026\357\260 -\144\301\001\236\351\312\240\152\230\016\317\330\140\362\057\111 -\270\344\102\341\070\065\026\364\310\156\117\367\201\126\350\272 -\243\276\043\257\256\375\157\003\340\002\073\060\166\372\033\155 -\101\317\001\261\351\270\311\146\364\333\046\363\072\244\164\362 -\111\044\133\311\260\320\127\301\372\076\172\341\227\311 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "SwissSign Gold CA - G2" -# Issuer: CN=SwissSign Gold CA - G2,O=SwissSign AG,C=CH -# Serial Number:00:bb:40:1c:43:f5:5e:4f:b0 -# Subject: CN=SwissSign Gold CA - G2,O=SwissSign AG,C=CH -# Not Valid Before: Wed Oct 25 08:30:35 2006 -# Not Valid After : Sat Oct 25 08:30:35 2036 -# Fingerprint (SHA-256): 62:DD:0B:E9:B9:F5:0A:16:3E:A0:F8:E7:5C:05:3B:1E:CA:57:EA:55:C8:68:8F:64:7C:68:81:F2:C8:35:7B:95 -# Fingerprint (SHA1): D8:C5:38:8A:B7:30:1B:1B:6E:D4:7A:E6:45:25:3A:6F:9F:1A:27:61 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "SwissSign Gold CA - G2" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\330\305\070\212\267\060\033\033\156\324\172\346\105\045\072\157 -\237\032\047\141 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\044\167\331\250\221\321\073\372\210\055\302\377\370\315\063\223 -END -CKA_ISSUER MULTILINE_OCTAL -\060\105\061\013\060\011\006\003\125\004\006\023\002\103\110\061 -\025\060\023\006\003\125\004\012\023\014\123\167\151\163\163\123 -\151\147\156\040\101\107\061\037\060\035\006\003\125\004\003\023 -\026\123\167\151\163\163\123\151\147\156\040\107\157\154\144\040 -\103\101\040\055\040\107\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\011\000\273\100\034\103\365\136\117\260 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "COMODO Certification Authority" -# -# Issuer: CN=COMODO Certification Authority,O=COMODO CA Limited,L=Salford,ST=Greater Manchester,C=GB -# Serial Number:4e:81:2d:8a:82:65:e0:0b:02:ee:3e:35:02:46:e5:3d -# Subject: CN=COMODO Certification Authority,O=COMODO CA Limited,L=Salford,ST=Greater Manchester,C=GB -# Not Valid Before: Fri Dec 01 00:00:00 2006 -# Not Valid After : Mon Dec 31 23:59:59 2029 -# Fingerprint (SHA-256): 0C:2C:D6:3D:F7:80:6F:A3:99:ED:E8:09:11:6B:57:5B:F8:79:89:F0:65:18:F9:80:8C:86:05:03:17:8B:AF:66 -# Fingerprint (SHA1): 66:31:BF:9E:F7:4F:9E:B6:C9:D5:A6:0C:BA:6A:BE:D1:F7:BD:EF:7B -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "COMODO Certification Authority" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\201\201\061\013\060\011\006\003\125\004\006\023\002\107\102 -\061\033\060\031\006\003\125\004\010\023\022\107\162\145\141\164 -\145\162\040\115\141\156\143\150\145\163\164\145\162\061\020\060 -\016\006\003\125\004\007\023\007\123\141\154\146\157\162\144\061 -\032\060\030\006\003\125\004\012\023\021\103\117\115\117\104\117 -\040\103\101\040\114\151\155\151\164\145\144\061\047\060\045\006 -\003\125\004\003\023\036\103\117\115\117\104\117\040\103\145\162 -\164\151\146\151\143\141\164\151\157\156\040\101\165\164\150\157 -\162\151\164\171 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\201\201\061\013\060\011\006\003\125\004\006\023\002\107\102 -\061\033\060\031\006\003\125\004\010\023\022\107\162\145\141\164 -\145\162\040\115\141\156\143\150\145\163\164\145\162\061\020\060 -\016\006\003\125\004\007\023\007\123\141\154\146\157\162\144\061 -\032\060\030\006\003\125\004\012\023\021\103\117\115\117\104\117 -\040\103\101\040\114\151\155\151\164\145\144\061\047\060\045\006 -\003\125\004\003\023\036\103\117\115\117\104\117\040\103\145\162 -\164\151\146\151\143\141\164\151\157\156\040\101\165\164\150\157 -\162\151\164\171 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\116\201\055\212\202\145\340\013\002\356\076\065\002\106 -\345\075 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\004\035\060\202\003\005\240\003\002\001\002\002\020\116 -\201\055\212\202\145\340\013\002\356\076\065\002\106\345\075\060 -\015\006\011\052\206\110\206\367\015\001\001\005\005\000\060\201 -\201\061\013\060\011\006\003\125\004\006\023\002\107\102\061\033 -\060\031\006\003\125\004\010\023\022\107\162\145\141\164\145\162 -\040\115\141\156\143\150\145\163\164\145\162\061\020\060\016\006 -\003\125\004\007\023\007\123\141\154\146\157\162\144\061\032\060 -\030\006\003\125\004\012\023\021\103\117\115\117\104\117\040\103 -\101\040\114\151\155\151\164\145\144\061\047\060\045\006\003\125 -\004\003\023\036\103\117\115\117\104\117\040\103\145\162\164\151 -\146\151\143\141\164\151\157\156\040\101\165\164\150\157\162\151 -\164\171\060\036\027\015\060\066\061\062\060\061\060\060\060\060 -\060\060\132\027\015\062\071\061\062\063\061\062\063\065\071\065 -\071\132\060\201\201\061\013\060\011\006\003\125\004\006\023\002 -\107\102\061\033\060\031\006\003\125\004\010\023\022\107\162\145 -\141\164\145\162\040\115\141\156\143\150\145\163\164\145\162\061 -\020\060\016\006\003\125\004\007\023\007\123\141\154\146\157\162 -\144\061\032\060\030\006\003\125\004\012\023\021\103\117\115\117 -\104\117\040\103\101\040\114\151\155\151\164\145\144\061\047\060 -\045\006\003\125\004\003\023\036\103\117\115\117\104\117\040\103 -\145\162\164\151\146\151\143\141\164\151\157\156\040\101\165\164 -\150\157\162\151\164\171\060\202\001\042\060\015\006\011\052\206 -\110\206\367\015\001\001\001\005\000\003\202\001\017\000\060\202 -\001\012\002\202\001\001\000\320\100\213\213\162\343\221\033\367 -\121\301\033\124\004\230\323\251\277\301\346\212\135\073\207\373 -\273\210\316\015\343\057\077\006\226\360\242\051\120\231\256\333 -\073\241\127\260\164\121\161\315\355\102\221\115\101\376\251\310 -\330\152\206\167\104\273\131\146\227\120\136\264\324\054\160\104 -\317\332\067\225\102\151\074\060\304\161\263\122\360\041\115\241 -\330\272\071\174\034\236\243\044\235\362\203\026\230\252\026\174 -\103\233\025\133\267\256\064\221\376\324\142\046\030\106\232\077 -\353\301\371\361\220\127\353\254\172\015\213\333\162\060\152\146 -\325\340\106\243\160\334\150\331\377\004\110\211\167\336\265\351 -\373\147\155\101\351\274\071\275\062\331\142\002\361\261\250\075 -\156\067\234\342\057\342\323\242\046\213\306\270\125\103\210\341 -\043\076\245\322\044\071\152\107\253\000\324\241\263\251\045\376 -\015\077\247\035\272\323\121\301\013\244\332\254\070\357\125\120 -\044\005\145\106\223\064\117\055\215\255\306\324\041\031\322\216 -\312\005\141\161\007\163\107\345\212\031\022\275\004\115\316\116 -\234\245\110\254\273\046\367\002\003\001\000\001\243\201\216\060 -\201\213\060\035\006\003\125\035\016\004\026\004\024\013\130\345 -\213\306\114\025\067\244\100\251\060\251\041\276\107\066\132\126 -\377\060\016\006\003\125\035\017\001\001\377\004\004\003\002\001 -\006\060\017\006\003\125\035\023\001\001\377\004\005\060\003\001 -\001\377\060\111\006\003\125\035\037\004\102\060\100\060\076\240 -\074\240\072\206\070\150\164\164\160\072\057\057\143\162\154\056 -\143\157\155\157\144\157\143\141\056\143\157\155\057\103\117\115 -\117\104\117\103\145\162\164\151\146\151\143\141\164\151\157\156 -\101\165\164\150\157\162\151\164\171\056\143\162\154\060\015\006 -\011\052\206\110\206\367\015\001\001\005\005\000\003\202\001\001 -\000\076\230\236\233\366\033\351\327\071\267\170\256\035\162\030 -\111\323\207\344\103\202\353\077\311\252\365\250\265\357\125\174 -\041\122\145\371\325\015\341\154\364\076\214\223\163\221\056\002 -\304\116\007\161\157\300\217\070\141\010\250\036\201\012\300\057 -\040\057\101\213\221\334\110\105\274\361\306\336\272\166\153\063 -\310\000\055\061\106\114\355\347\235\317\210\224\377\063\300\126 -\350\044\206\046\270\330\070\070\337\052\153\335\022\314\307\077 -\107\027\114\242\302\006\226\011\326\333\376\077\074\106\101\337 -\130\342\126\017\074\073\301\034\223\065\331\070\122\254\356\310 -\354\056\060\116\224\065\264\044\037\113\170\151\332\362\002\070 -\314\225\122\223\360\160\045\131\234\040\147\304\356\371\213\127 -\141\364\222\166\175\077\204\215\125\267\350\345\254\325\361\365 -\031\126\246\132\373\220\034\257\223\353\345\034\324\147\227\135 -\004\016\276\013\203\246\027\203\271\060\022\240\305\063\025\005 -\271\015\373\307\005\166\343\330\112\215\374\064\027\243\306\041 -\050\276\060\105\061\036\307\170\276\130\141\070\254\073\342\001 -\145 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "COMODO Certification Authority" -# Issuer: CN=COMODO Certification Authority,O=COMODO CA Limited,L=Salford,ST=Greater Manchester,C=GB -# Serial Number:4e:81:2d:8a:82:65:e0:0b:02:ee:3e:35:02:46:e5:3d -# Subject: CN=COMODO Certification Authority,O=COMODO CA Limited,L=Salford,ST=Greater Manchester,C=GB -# Not Valid Before: Fri Dec 01 00:00:00 2006 -# Not Valid After : Mon Dec 31 23:59:59 2029 -# Fingerprint (SHA-256): 0C:2C:D6:3D:F7:80:6F:A3:99:ED:E8:09:11:6B:57:5B:F8:79:89:F0:65:18:F9:80:8C:86:05:03:17:8B:AF:66 -# Fingerprint (SHA1): 66:31:BF:9E:F7:4F:9E:B6:C9:D5:A6:0C:BA:6A:BE:D1:F7:BD:EF:7B -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "COMODO Certification Authority" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\146\061\277\236\367\117\236\266\311\325\246\014\272\152\276\321 -\367\275\357\173 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\134\110\334\367\102\162\354\126\224\155\034\314\161\065\200\165 -END -CKA_ISSUER MULTILINE_OCTAL -\060\201\201\061\013\060\011\006\003\125\004\006\023\002\107\102 -\061\033\060\031\006\003\125\004\010\023\022\107\162\145\141\164 -\145\162\040\115\141\156\143\150\145\163\164\145\162\061\020\060 -\016\006\003\125\004\007\023\007\123\141\154\146\157\162\144\061 -\032\060\030\006\003\125\004\012\023\021\103\117\115\117\104\117 -\040\103\101\040\114\151\155\151\164\145\144\061\047\060\045\006 -\003\125\004\003\023\036\103\117\115\117\104\117\040\103\145\162 -\164\151\146\151\143\141\164\151\157\156\040\101\165\164\150\157 -\162\151\164\171 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\116\201\055\212\202\145\340\013\002\356\076\065\002\106 -\345\075 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "COMODO ECC Certification Authority" -# -# Issuer: CN=COMODO ECC Certification Authority,O=COMODO CA Limited,L=Salford,ST=Greater Manchester,C=GB -# Serial Number:1f:47:af:aa:62:00:70:50:54:4c:01:9e:9b:63:99:2a -# Subject: CN=COMODO ECC Certification Authority,O=COMODO CA Limited,L=Salford,ST=Greater Manchester,C=GB -# Not Valid Before: Thu Mar 06 00:00:00 2008 -# Not Valid After : Mon Jan 18 23:59:59 2038 -# Fingerprint (SHA-256): 17:93:92:7A:06:14:54:97:89:AD:CE:2F:8F:34:F7:F0:B6:6D:0F:3A:E3:A3:B8:4D:21:EC:15:DB:BA:4F:AD:C7 -# Fingerprint (SHA1): 9F:74:4E:9F:2B:4D:BA:EC:0F:31:2C:50:B6:56:3B:8E:2D:93:C3:11 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "COMODO ECC Certification Authority" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\201\205\061\013\060\011\006\003\125\004\006\023\002\107\102 -\061\033\060\031\006\003\125\004\010\023\022\107\162\145\141\164 -\145\162\040\115\141\156\143\150\145\163\164\145\162\061\020\060 -\016\006\003\125\004\007\023\007\123\141\154\146\157\162\144\061 -\032\060\030\006\003\125\004\012\023\021\103\117\115\117\104\117 -\040\103\101\040\114\151\155\151\164\145\144\061\053\060\051\006 -\003\125\004\003\023\042\103\117\115\117\104\117\040\105\103\103 -\040\103\145\162\164\151\146\151\143\141\164\151\157\156\040\101 -\165\164\150\157\162\151\164\171 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\201\205\061\013\060\011\006\003\125\004\006\023\002\107\102 -\061\033\060\031\006\003\125\004\010\023\022\107\162\145\141\164 -\145\162\040\115\141\156\143\150\145\163\164\145\162\061\020\060 -\016\006\003\125\004\007\023\007\123\141\154\146\157\162\144\061 -\032\060\030\006\003\125\004\012\023\021\103\117\115\117\104\117 -\040\103\101\040\114\151\155\151\164\145\144\061\053\060\051\006 -\003\125\004\003\023\042\103\117\115\117\104\117\040\105\103\103 -\040\103\145\162\164\151\146\151\143\141\164\151\157\156\040\101 -\165\164\150\157\162\151\164\171 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\037\107\257\252\142\000\160\120\124\114\001\236\233\143 -\231\052 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\211\060\202\002\017\240\003\002\001\002\002\020\037 -\107\257\252\142\000\160\120\124\114\001\236\233\143\231\052\060 -\012\006\010\052\206\110\316\075\004\003\003\060\201\205\061\013 -\060\011\006\003\125\004\006\023\002\107\102\061\033\060\031\006 -\003\125\004\010\023\022\107\162\145\141\164\145\162\040\115\141 -\156\143\150\145\163\164\145\162\061\020\060\016\006\003\125\004 -\007\023\007\123\141\154\146\157\162\144\061\032\060\030\006\003 -\125\004\012\023\021\103\117\115\117\104\117\040\103\101\040\114 -\151\155\151\164\145\144\061\053\060\051\006\003\125\004\003\023 -\042\103\117\115\117\104\117\040\105\103\103\040\103\145\162\164 -\151\146\151\143\141\164\151\157\156\040\101\165\164\150\157\162 -\151\164\171\060\036\027\015\060\070\060\063\060\066\060\060\060 -\060\060\060\132\027\015\063\070\060\061\061\070\062\063\065\071 -\065\071\132\060\201\205\061\013\060\011\006\003\125\004\006\023 -\002\107\102\061\033\060\031\006\003\125\004\010\023\022\107\162 -\145\141\164\145\162\040\115\141\156\143\150\145\163\164\145\162 -\061\020\060\016\006\003\125\004\007\023\007\123\141\154\146\157 -\162\144\061\032\060\030\006\003\125\004\012\023\021\103\117\115 -\117\104\117\040\103\101\040\114\151\155\151\164\145\144\061\053 -\060\051\006\003\125\004\003\023\042\103\117\115\117\104\117\040 -\105\103\103\040\103\145\162\164\151\146\151\143\141\164\151\157 -\156\040\101\165\164\150\157\162\151\164\171\060\166\060\020\006 -\007\052\206\110\316\075\002\001\006\005\053\201\004\000\042\003 -\142\000\004\003\107\173\057\165\311\202\025\205\373\165\344\221 -\026\324\253\142\231\365\076\122\013\006\316\101\000\177\227\341 -\012\044\074\035\001\004\356\075\322\215\011\227\014\340\165\344 -\372\373\167\212\052\365\003\140\113\066\213\026\043\026\255\011 -\161\364\112\364\050\120\264\376\210\034\156\077\154\057\057\011 -\131\133\245\133\013\063\231\342\303\075\211\371\152\054\357\262 -\323\006\351\243\102\060\100\060\035\006\003\125\035\016\004\026 -\004\024\165\161\247\031\110\031\274\235\235\352\101\107\337\224 -\304\110\167\231\323\171\060\016\006\003\125\035\017\001\001\377 -\004\004\003\002\001\006\060\017\006\003\125\035\023\001\001\377 -\004\005\060\003\001\001\377\060\012\006\010\052\206\110\316\075 -\004\003\003\003\150\000\060\145\002\061\000\357\003\133\172\254 -\267\170\012\162\267\210\337\377\265\106\024\011\012\372\240\346 -\175\010\306\032\207\275\030\250\163\275\046\312\140\014\235\316 -\231\237\317\134\017\060\341\276\024\061\352\002\060\024\364\223 -\074\111\247\063\172\220\106\107\263\143\175\023\233\116\267\157 -\030\067\200\123\376\335\040\340\065\232\066\321\307\001\271\346 -\334\335\363\377\035\054\072\026\127\331\222\071\326 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "COMODO ECC Certification Authority" -# Issuer: CN=COMODO ECC Certification Authority,O=COMODO CA Limited,L=Salford,ST=Greater Manchester,C=GB -# Serial Number:1f:47:af:aa:62:00:70:50:54:4c:01:9e:9b:63:99:2a -# Subject: CN=COMODO ECC Certification Authority,O=COMODO CA Limited,L=Salford,ST=Greater Manchester,C=GB -# Not Valid Before: Thu Mar 06 00:00:00 2008 -# Not Valid After : Mon Jan 18 23:59:59 2038 -# Fingerprint (SHA-256): 17:93:92:7A:06:14:54:97:89:AD:CE:2F:8F:34:F7:F0:B6:6D:0F:3A:E3:A3:B8:4D:21:EC:15:DB:BA:4F:AD:C7 -# Fingerprint (SHA1): 9F:74:4E:9F:2B:4D:BA:EC:0F:31:2C:50:B6:56:3B:8E:2D:93:C3:11 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "COMODO ECC Certification Authority" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\237\164\116\237\053\115\272\354\017\061\054\120\266\126\073\216 -\055\223\303\021 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\174\142\377\164\235\061\123\136\150\112\325\170\252\036\277\043 -END -CKA_ISSUER MULTILINE_OCTAL -\060\201\205\061\013\060\011\006\003\125\004\006\023\002\107\102 -\061\033\060\031\006\003\125\004\010\023\022\107\162\145\141\164 -\145\162\040\115\141\156\143\150\145\163\164\145\162\061\020\060 -\016\006\003\125\004\007\023\007\123\141\154\146\157\162\144\061 -\032\060\030\006\003\125\004\012\023\021\103\117\115\117\104\117 -\040\103\101\040\114\151\155\151\164\145\144\061\053\060\051\006 -\003\125\004\003\023\042\103\117\115\117\104\117\040\105\103\103 -\040\103\145\162\164\151\146\151\143\141\164\151\157\156\040\101 -\165\164\150\157\162\151\164\171 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\037\107\257\252\142\000\160\120\124\114\001\236\233\143 -\231\052 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "OISTE WISeKey Global Root GA CA" -# -# Issuer: CN=OISTE WISeKey Global Root GA CA,OU=OISTE Foundation Endorsed,OU=Copyright (c) 2005,O=WISeKey,C=CH -# Serial Number:41:3d:72:c7:f4:6b:1f:81:43:7d:f1:d2:28:54:df:9a -# Subject: CN=OISTE WISeKey Global Root GA CA,OU=OISTE Foundation Endorsed,OU=Copyright (c) 2005,O=WISeKey,C=CH -# Not Valid Before: Sun Dec 11 16:03:44 2005 -# Not Valid After : Fri Dec 11 16:09:51 2037 -# Fingerprint (SHA-256): 41:C9:23:86:6A:B4:CA:D6:B7:AD:57:80:81:58:2E:02:07:97:A6:CB:DF:4F:FF:78:CE:83:96:B3:89:37:D7:F5 -# Fingerprint (SHA1): 59:22:A1:E1:5A:EA:16:35:21:F8:98:39:6A:46:46:B0:44:1B:0F:A9 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "OISTE WISeKey Global Root GA CA" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\201\212\061\013\060\011\006\003\125\004\006\023\002\103\110 -\061\020\060\016\006\003\125\004\012\023\007\127\111\123\145\113 -\145\171\061\033\060\031\006\003\125\004\013\023\022\103\157\160 -\171\162\151\147\150\164\040\050\143\051\040\062\060\060\065\061 -\042\060\040\006\003\125\004\013\023\031\117\111\123\124\105\040 -\106\157\165\156\144\141\164\151\157\156\040\105\156\144\157\162 -\163\145\144\061\050\060\046\006\003\125\004\003\023\037\117\111 -\123\124\105\040\127\111\123\145\113\145\171\040\107\154\157\142 -\141\154\040\122\157\157\164\040\107\101\040\103\101 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\201\212\061\013\060\011\006\003\125\004\006\023\002\103\110 -\061\020\060\016\006\003\125\004\012\023\007\127\111\123\145\113 -\145\171\061\033\060\031\006\003\125\004\013\023\022\103\157\160 -\171\162\151\147\150\164\040\050\143\051\040\062\060\060\065\061 -\042\060\040\006\003\125\004\013\023\031\117\111\123\124\105\040 -\106\157\165\156\144\141\164\151\157\156\040\105\156\144\157\162 -\163\145\144\061\050\060\046\006\003\125\004\003\023\037\117\111 -\123\124\105\040\127\111\123\145\113\145\171\040\107\154\157\142 -\141\154\040\122\157\157\164\040\107\101\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\101\075\162\307\364\153\037\201\103\175\361\322\050\124 -\337\232 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\003\361\060\202\002\331\240\003\002\001\002\002\020\101 -\075\162\307\364\153\037\201\103\175\361\322\050\124\337\232\060 -\015\006\011\052\206\110\206\367\015\001\001\005\005\000\060\201 -\212\061\013\060\011\006\003\125\004\006\023\002\103\110\061\020 -\060\016\006\003\125\004\012\023\007\127\111\123\145\113\145\171 -\061\033\060\031\006\003\125\004\013\023\022\103\157\160\171\162 -\151\147\150\164\040\050\143\051\040\062\060\060\065\061\042\060 -\040\006\003\125\004\013\023\031\117\111\123\124\105\040\106\157 -\165\156\144\141\164\151\157\156\040\105\156\144\157\162\163\145 -\144\061\050\060\046\006\003\125\004\003\023\037\117\111\123\124 -\105\040\127\111\123\145\113\145\171\040\107\154\157\142\141\154 -\040\122\157\157\164\040\107\101\040\103\101\060\036\027\015\060 -\065\061\062\061\061\061\066\060\063\064\064\132\027\015\063\067 -\061\062\061\061\061\066\060\071\065\061\132\060\201\212\061\013 -\060\011\006\003\125\004\006\023\002\103\110\061\020\060\016\006 -\003\125\004\012\023\007\127\111\123\145\113\145\171\061\033\060 -\031\006\003\125\004\013\023\022\103\157\160\171\162\151\147\150 -\164\040\050\143\051\040\062\060\060\065\061\042\060\040\006\003 -\125\004\013\023\031\117\111\123\124\105\040\106\157\165\156\144 -\141\164\151\157\156\040\105\156\144\157\162\163\145\144\061\050 -\060\046\006\003\125\004\003\023\037\117\111\123\124\105\040\127 -\111\123\145\113\145\171\040\107\154\157\142\141\154\040\122\157 -\157\164\040\107\101\040\103\101\060\202\001\042\060\015\006\011 -\052\206\110\206\367\015\001\001\001\005\000\003\202\001\017\000 -\060\202\001\012\002\202\001\001\000\313\117\263\000\233\075\066 -\335\371\321\111\152\153\020\111\037\354\330\053\262\306\370\062 -\201\051\103\225\114\232\031\043\041\025\105\336\343\310\034\121 -\125\133\256\223\350\067\377\053\153\351\324\352\276\052\335\250 -\121\053\327\146\303\141\134\140\002\310\365\316\162\173\073\270 -\362\116\145\010\232\315\244\152\031\301\001\273\163\246\327\366 -\303\335\315\274\244\213\265\231\141\270\001\242\243\324\115\324 -\005\075\221\255\370\264\010\161\144\257\160\361\034\153\176\366 -\303\167\235\044\163\173\344\014\214\341\331\066\341\231\213\005 -\231\013\355\105\061\011\312\302\000\333\367\162\240\226\252\225 -\207\320\216\307\266\141\163\015\166\146\214\334\033\264\143\242 -\237\177\223\023\060\361\241\047\333\331\377\054\125\210\221\240 -\340\117\007\260\050\126\214\030\033\227\104\216\211\335\340\027 -\156\347\052\357\217\071\012\061\204\202\330\100\024\111\056\172 -\101\344\247\376\343\144\314\301\131\161\113\054\041\247\133\175 -\340\035\321\056\201\233\303\330\150\367\275\226\033\254\160\261 -\026\024\013\333\140\271\046\001\005\002\003\001\000\001\243\121 -\060\117\060\013\006\003\125\035\017\004\004\003\002\001\206\060 -\017\006\003\125\035\023\001\001\377\004\005\060\003\001\001\377 -\060\035\006\003\125\035\016\004\026\004\024\263\003\176\256\066 -\274\260\171\321\334\224\046\266\021\276\041\262\151\206\224\060 -\020\006\011\053\006\001\004\001\202\067\025\001\004\003\002\001 -\000\060\015\006\011\052\206\110\206\367\015\001\001\005\005\000 -\003\202\001\001\000\113\241\377\013\207\156\263\371\301\103\261 -\110\363\050\300\035\056\311\011\101\372\224\000\034\244\244\253 -\111\117\217\075\036\357\115\157\275\274\244\366\362\046\060\311 -\020\312\035\210\373\164\031\037\205\105\275\260\154\121\371\066 -\176\333\365\114\062\072\101\117\133\107\317\350\013\055\266\304 -\031\235\164\305\107\306\073\152\017\254\024\333\074\364\163\234 -\251\005\337\000\334\164\170\372\370\065\140\131\002\023\030\174 -\274\373\115\260\040\155\103\273\140\060\172\147\063\134\305\231 -\321\370\055\071\122\163\373\214\252\227\045\134\162\331\010\036 -\253\116\074\343\201\061\237\003\246\373\300\376\051\210\125\332 -\204\325\120\003\266\342\204\243\246\066\252\021\072\001\341\030 -\113\326\104\150\263\075\371\123\164\204\263\106\221\106\226\000 -\267\200\054\266\341\343\020\342\333\242\347\050\217\001\226\142 -\026\076\000\343\034\245\066\201\030\242\114\122\166\300\021\243 -\156\346\035\272\343\132\276\066\123\305\076\165\217\206\151\051 -\130\123\265\234\273\157\237\134\305\030\354\335\057\341\230\311 -\374\276\337\012\015 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "OISTE WISeKey Global Root GA CA" -# Issuer: CN=OISTE WISeKey Global Root GA CA,OU=OISTE Foundation Endorsed,OU=Copyright (c) 2005,O=WISeKey,C=CH -# Serial Number:41:3d:72:c7:f4:6b:1f:81:43:7d:f1:d2:28:54:df:9a -# Subject: CN=OISTE WISeKey Global Root GA CA,OU=OISTE Foundation Endorsed,OU=Copyright (c) 2005,O=WISeKey,C=CH -# Not Valid Before: Sun Dec 11 16:03:44 2005 -# Not Valid After : Fri Dec 11 16:09:51 2037 -# Fingerprint (SHA-256): 41:C9:23:86:6A:B4:CA:D6:B7:AD:57:80:81:58:2E:02:07:97:A6:CB:DF:4F:FF:78:CE:83:96:B3:89:37:D7:F5 -# Fingerprint (SHA1): 59:22:A1:E1:5A:EA:16:35:21:F8:98:39:6A:46:46:B0:44:1B:0F:A9 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "OISTE WISeKey Global Root GA CA" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\131\042\241\341\132\352\026\065\041\370\230\071\152\106\106\260 -\104\033\017\251 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\274\154\121\063\247\351\323\146\143\124\025\162\033\041\222\223 -END -CKA_ISSUER MULTILINE_OCTAL -\060\201\212\061\013\060\011\006\003\125\004\006\023\002\103\110 -\061\020\060\016\006\003\125\004\012\023\007\127\111\123\145\113 -\145\171\061\033\060\031\006\003\125\004\013\023\022\103\157\160 -\171\162\151\147\150\164\040\050\143\051\040\062\060\060\065\061 -\042\060\040\006\003\125\004\013\023\031\117\111\123\124\105\040 -\106\157\165\156\144\141\164\151\157\156\040\105\156\144\157\162 -\163\145\144\061\050\060\046\006\003\125\004\003\023\037\117\111 -\123\124\105\040\127\111\123\145\113\145\171\040\107\154\157\142 -\141\154\040\122\157\157\164\040\107\101\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\101\075\162\307\364\153\037\201\103\175\361\322\050\124 -\337\232 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Certigna" -# -# Issuer: CN=Certigna,O=Dhimyotis,C=FR -# Serial Number:00:fe:dc:e3:01:0f:c9:48:ff -# Subject: CN=Certigna,O=Dhimyotis,C=FR -# Not Valid Before: Fri Jun 29 15:13:05 2007 -# Not Valid After : Tue Jun 29 15:13:05 2027 -# Fingerprint (SHA-256): E3:B6:A2:DB:2E:D7:CE:48:84:2F:7A:C5:32:41:C7:B7:1D:54:14:4B:FB:40:C1:1F:3F:1D:0B:42:F5:EE:A1:2D -# Fingerprint (SHA1): B1:2E:13:63:45:86:A4:6F:1A:B2:60:68:37:58:2D:C4:AC:FD:94:97 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Certigna" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\064\061\013\060\011\006\003\125\004\006\023\002\106\122\061 -\022\060\020\006\003\125\004\012\014\011\104\150\151\155\171\157 -\164\151\163\061\021\060\017\006\003\125\004\003\014\010\103\145 -\162\164\151\147\156\141 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\064\061\013\060\011\006\003\125\004\006\023\002\106\122\061 -\022\060\020\006\003\125\004\012\014\011\104\150\151\155\171\157 -\164\151\163\061\021\060\017\006\003\125\004\003\014\010\103\145 -\162\164\151\147\156\141 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\011\000\376\334\343\001\017\311\110\377 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\003\250\060\202\002\220\240\003\002\001\002\002\011\000 -\376\334\343\001\017\311\110\377\060\015\006\011\052\206\110\206 -\367\015\001\001\005\005\000\060\064\061\013\060\011\006\003\125 -\004\006\023\002\106\122\061\022\060\020\006\003\125\004\012\014 -\011\104\150\151\155\171\157\164\151\163\061\021\060\017\006\003 -\125\004\003\014\010\103\145\162\164\151\147\156\141\060\036\027 -\015\060\067\060\066\062\071\061\065\061\063\060\065\132\027\015 -\062\067\060\066\062\071\061\065\061\063\060\065\132\060\064\061 -\013\060\011\006\003\125\004\006\023\002\106\122\061\022\060\020 -\006\003\125\004\012\014\011\104\150\151\155\171\157\164\151\163 -\061\021\060\017\006\003\125\004\003\014\010\103\145\162\164\151 -\147\156\141\060\202\001\042\060\015\006\011\052\206\110\206\367 -\015\001\001\001\005\000\003\202\001\017\000\060\202\001\012\002 -\202\001\001\000\310\150\361\311\326\326\263\064\165\046\202\036 -\354\264\276\352\134\341\046\355\021\107\141\341\242\174\026\170 -\100\041\344\140\236\132\310\143\341\304\261\226\222\377\030\155 -\151\043\341\053\142\367\335\342\066\057\221\007\271\110\317\016 -\354\171\266\054\347\064\113\160\010\045\243\074\207\033\031\362 -\201\007\017\070\220\031\323\021\376\206\264\362\321\136\036\036 -\226\315\200\154\316\073\061\223\266\362\240\320\251\225\022\175 -\245\232\314\153\310\204\126\212\063\251\347\042\025\123\026\360 -\314\027\354\127\137\351\242\012\230\011\336\343\137\234\157\334 -\110\343\205\013\025\132\246\272\237\254\110\343\011\262\367\364 -\062\336\136\064\276\034\170\135\102\133\316\016\042\217\115\220 -\327\175\062\030\263\013\054\152\277\216\077\024\021\211\040\016 -\167\024\265\075\224\010\207\367\045\036\325\262\140\000\354\157 -\052\050\045\156\052\076\030\143\027\045\077\076\104\040\026\366 -\046\310\045\256\005\112\264\347\143\054\363\214\026\123\176\134 -\373\021\032\010\301\106\142\237\042\270\361\302\215\151\334\372 -\072\130\006\337\002\003\001\000\001\243\201\274\060\201\271\060 -\017\006\003\125\035\023\001\001\377\004\005\060\003\001\001\377 -\060\035\006\003\125\035\016\004\026\004\024\032\355\376\101\071 -\220\264\044\131\276\001\362\122\325\105\366\132\071\334\021\060 -\144\006\003\125\035\043\004\135\060\133\200\024\032\355\376\101 -\071\220\264\044\131\276\001\362\122\325\105\366\132\071\334\021 -\241\070\244\066\060\064\061\013\060\011\006\003\125\004\006\023 -\002\106\122\061\022\060\020\006\003\125\004\012\014\011\104\150 -\151\155\171\157\164\151\163\061\021\060\017\006\003\125\004\003 -\014\010\103\145\162\164\151\147\156\141\202\011\000\376\334\343 -\001\017\311\110\377\060\016\006\003\125\035\017\001\001\377\004 -\004\003\002\001\006\060\021\006\011\140\206\110\001\206\370\102 -\001\001\004\004\003\002\000\007\060\015\006\011\052\206\110\206 -\367\015\001\001\005\005\000\003\202\001\001\000\205\003\036\222 -\161\366\102\257\341\243\141\236\353\363\300\017\362\245\324\332 -\225\346\326\276\150\066\075\176\156\037\114\212\357\321\017\041 -\155\136\245\122\143\316\022\370\357\052\332\157\353\067\376\023 -\002\307\313\073\076\042\153\332\141\056\177\324\162\075\335\060 -\341\036\114\100\031\214\017\327\234\321\203\060\173\230\131\334 -\175\306\271\014\051\114\241\063\242\353\147\072\145\204\323\226 -\342\355\166\105\160\217\265\053\336\371\043\326\111\156\074\024 -\265\306\237\065\036\120\320\301\217\152\160\104\002\142\313\256 -\035\150\101\247\252\127\350\123\252\007\322\006\366\325\024\006 -\013\221\003\165\054\154\162\265\141\225\232\015\213\271\015\347 -\365\337\124\315\336\346\330\326\011\010\227\143\345\301\056\260 -\267\104\046\300\046\300\257\125\060\236\073\325\066\052\031\004 -\364\134\036\377\317\054\267\377\320\375\207\100\021\325\021\043 -\273\110\300\041\251\244\050\055\375\025\370\260\116\053\364\060 -\133\041\374\021\221\064\276\101\357\173\235\227\165\377\227\225 -\300\226\130\057\352\273\106\327\273\344\331\056 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Certigna" -# Issuer: CN=Certigna,O=Dhimyotis,C=FR -# Serial Number:00:fe:dc:e3:01:0f:c9:48:ff -# Subject: CN=Certigna,O=Dhimyotis,C=FR -# Not Valid Before: Fri Jun 29 15:13:05 2007 -# Not Valid After : Tue Jun 29 15:13:05 2027 -# Fingerprint (SHA-256): E3:B6:A2:DB:2E:D7:CE:48:84:2F:7A:C5:32:41:C7:B7:1D:54:14:4B:FB:40:C1:1F:3F:1D:0B:42:F5:EE:A1:2D -# Fingerprint (SHA1): B1:2E:13:63:45:86:A4:6F:1A:B2:60:68:37:58:2D:C4:AC:FD:94:97 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Certigna" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\261\056\023\143\105\206\244\157\032\262\140\150\067\130\055\304 -\254\375\224\227 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\253\127\246\133\175\102\202\031\265\330\130\046\050\136\375\377 -END -CKA_ISSUER MULTILINE_OCTAL -\060\064\061\013\060\011\006\003\125\004\006\023\002\106\122\061 -\022\060\020\006\003\125\004\012\014\011\104\150\151\155\171\157 -\164\151\163\061\021\060\017\006\003\125\004\003\014\010\103\145 -\162\164\151\147\156\141 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\011\000\376\334\343\001\017\311\110\377 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "NetLock Arany (Class Gold) Főtanúsítvány" -# -# Issuer: CN=NetLock Arany (Class Gold) F..tan..s..tv..ny,OU=Tan..s..tv..nykiad..k (Certification Services),O=NetLock Kft.,L=Budapest,C=HU -# Serial Number:49:41:2c:e4:00:10 -# Subject: CN=NetLock Arany (Class Gold) F..tan..s..tv..ny,OU=Tan..s..tv..nykiad..k (Certification Services),O=NetLock Kft.,L=Budapest,C=HU -# Not Valid Before: Thu Dec 11 15:08:21 2008 -# Not Valid After : Wed Dec 06 15:08:21 2028 -# Fingerprint (SHA-256): 6C:61:DA:C3:A2:DE:F0:31:50:6B:E0:36:D2:A6:FE:40:19:94:FB:D1:3D:F9:C8:D4:66:59:92:74:C4:46:EC:98 -# Fingerprint (SHA1): 06:08:3F:59:3F:15:A1:04:A0:69:A4:6B:A9:03:D0:06:B7:97:09:91 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "NetLock Arany (Class Gold) Főtanúsítvány" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\201\247\061\013\060\011\006\003\125\004\006\023\002\110\125 -\061\021\060\017\006\003\125\004\007\014\010\102\165\144\141\160 -\145\163\164\061\025\060\023\006\003\125\004\012\014\014\116\145 -\164\114\157\143\153\040\113\146\164\056\061\067\060\065\006\003 -\125\004\013\014\056\124\141\156\303\272\163\303\255\164\166\303 -\241\156\171\153\151\141\144\303\263\153\040\050\103\145\162\164 -\151\146\151\143\141\164\151\157\156\040\123\145\162\166\151\143 -\145\163\051\061\065\060\063\006\003\125\004\003\014\054\116\145 -\164\114\157\143\153\040\101\162\141\156\171\040\050\103\154\141 -\163\163\040\107\157\154\144\051\040\106\305\221\164\141\156\303 -\272\163\303\255\164\166\303\241\156\171 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\201\247\061\013\060\011\006\003\125\004\006\023\002\110\125 -\061\021\060\017\006\003\125\004\007\014\010\102\165\144\141\160 -\145\163\164\061\025\060\023\006\003\125\004\012\014\014\116\145 -\164\114\157\143\153\040\113\146\164\056\061\067\060\065\006\003 -\125\004\013\014\056\124\141\156\303\272\163\303\255\164\166\303 -\241\156\171\153\151\141\144\303\263\153\040\050\103\145\162\164 -\151\146\151\143\141\164\151\157\156\040\123\145\162\166\151\143 -\145\163\051\061\065\060\063\006\003\125\004\003\014\054\116\145 -\164\114\157\143\153\040\101\162\141\156\171\040\050\103\154\141 -\163\163\040\107\157\154\144\051\040\106\305\221\164\141\156\303 -\272\163\303\255\164\166\303\241\156\171 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\006\111\101\054\344\000\020 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\004\025\060\202\002\375\240\003\002\001\002\002\006\111 -\101\054\344\000\020\060\015\006\011\052\206\110\206\367\015\001 -\001\013\005\000\060\201\247\061\013\060\011\006\003\125\004\006 -\023\002\110\125\061\021\060\017\006\003\125\004\007\014\010\102 -\165\144\141\160\145\163\164\061\025\060\023\006\003\125\004\012 -\014\014\116\145\164\114\157\143\153\040\113\146\164\056\061\067 -\060\065\006\003\125\004\013\014\056\124\141\156\303\272\163\303 -\255\164\166\303\241\156\171\153\151\141\144\303\263\153\040\050 -\103\145\162\164\151\146\151\143\141\164\151\157\156\040\123\145 -\162\166\151\143\145\163\051\061\065\060\063\006\003\125\004\003 -\014\054\116\145\164\114\157\143\153\040\101\162\141\156\171\040 -\050\103\154\141\163\163\040\107\157\154\144\051\040\106\305\221 -\164\141\156\303\272\163\303\255\164\166\303\241\156\171\060\036 -\027\015\060\070\061\062\061\061\061\065\060\070\062\061\132\027 -\015\062\070\061\062\060\066\061\065\060\070\062\061\132\060\201 -\247\061\013\060\011\006\003\125\004\006\023\002\110\125\061\021 -\060\017\006\003\125\004\007\014\010\102\165\144\141\160\145\163 -\164\061\025\060\023\006\003\125\004\012\014\014\116\145\164\114 -\157\143\153\040\113\146\164\056\061\067\060\065\006\003\125\004 -\013\014\056\124\141\156\303\272\163\303\255\164\166\303\241\156 -\171\153\151\141\144\303\263\153\040\050\103\145\162\164\151\146 -\151\143\141\164\151\157\156\040\123\145\162\166\151\143\145\163 -\051\061\065\060\063\006\003\125\004\003\014\054\116\145\164\114 -\157\143\153\040\101\162\141\156\171\040\050\103\154\141\163\163 -\040\107\157\154\144\051\040\106\305\221\164\141\156\303\272\163 -\303\255\164\166\303\241\156\171\060\202\001\042\060\015\006\011 -\052\206\110\206\367\015\001\001\001\005\000\003\202\001\017\000 -\060\202\001\012\002\202\001\001\000\304\044\136\163\276\113\155 -\024\303\241\364\343\227\220\156\322\060\105\036\074\356\147\331 -\144\340\032\212\177\312\060\312\203\343\040\301\343\364\072\323 -\224\137\032\174\133\155\277\060\117\204\047\366\237\037\111\274 -\306\231\012\220\362\017\365\177\103\204\067\143\121\213\172\245 -\160\374\172\130\315\216\233\355\303\106\154\204\160\135\332\363 -\001\220\043\374\116\060\251\176\341\047\143\347\355\144\074\240 -\270\311\063\143\376\026\220\377\260\270\375\327\250\300\300\224 -\103\013\266\325\131\246\236\126\320\044\037\160\171\257\333\071 -\124\015\145\165\331\025\101\224\001\257\136\354\366\215\361\377 -\255\144\376\040\232\327\134\353\376\246\037\010\144\243\213\166 -\125\255\036\073\050\140\056\207\045\350\252\257\037\306\144\106 -\040\267\160\177\074\336\110\333\226\123\267\071\167\344\032\342 -\307\026\204\166\227\133\057\273\031\025\205\370\151\205\365\231 -\247\251\362\064\247\251\266\246\003\374\157\206\075\124\174\166 -\004\233\153\371\100\135\000\064\307\056\231\165\235\345\210\003 -\252\115\370\003\322\102\166\300\033\002\003\000\250\213\243\105 -\060\103\060\022\006\003\125\035\023\001\001\377\004\010\060\006 -\001\001\377\002\001\004\060\016\006\003\125\035\017\001\001\377 -\004\004\003\002\001\006\060\035\006\003\125\035\016\004\026\004 -\024\314\372\147\223\360\266\270\320\245\300\036\363\123\375\214 -\123\337\203\327\226\060\015\006\011\052\206\110\206\367\015\001 -\001\013\005\000\003\202\001\001\000\253\177\356\034\026\251\234 -\074\121\000\240\300\021\010\005\247\231\346\157\001\210\124\141 -\156\361\271\030\255\112\255\376\201\100\043\224\057\373\165\174 -\057\050\113\142\044\201\202\013\365\141\361\034\156\270\141\070 -\353\201\372\142\241\073\132\142\323\224\145\304\341\346\155\202 -\370\057\045\160\262\041\046\301\162\121\037\214\054\303\204\220 -\303\132\217\272\317\364\247\145\245\353\230\321\373\005\262\106 -\165\025\043\152\157\205\143\060\200\360\325\236\037\051\034\302 -\154\260\120\131\135\220\133\073\250\015\060\317\277\175\177\316 -\361\235\203\275\311\106\156\040\246\371\141\121\272\041\057\173 -\276\245\025\143\241\324\225\207\361\236\271\363\211\363\075\205 -\270\270\333\276\265\271\051\371\332\067\005\000\111\224\003\204 -\104\347\277\103\061\317\165\213\045\321\364\246\144\365\222\366 -\253\005\353\075\351\245\013\066\142\332\314\006\137\066\213\266 -\136\061\270\052\373\136\366\161\337\104\046\236\304\346\015\221 -\264\056\165\225\200\121\152\113\060\246\260\142\241\223\361\233 -\330\316\304\143\165\077\131\107\261 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "NetLock Arany (Class Gold) Főtanúsítvány" -# Issuer: CN=NetLock Arany (Class Gold) F..tan..s..tv..ny,OU=Tan..s..tv..nykiad..k (Certification Services),O=NetLock Kft.,L=Budapest,C=HU -# Serial Number:49:41:2c:e4:00:10 -# Subject: CN=NetLock Arany (Class Gold) F..tan..s..tv..ny,OU=Tan..s..tv..nykiad..k (Certification Services),O=NetLock Kft.,L=Budapest,C=HU -# Not Valid Before: Thu Dec 11 15:08:21 2008 -# Not Valid After : Wed Dec 06 15:08:21 2028 -# Fingerprint (SHA-256): 6C:61:DA:C3:A2:DE:F0:31:50:6B:E0:36:D2:A6:FE:40:19:94:FB:D1:3D:F9:C8:D4:66:59:92:74:C4:46:EC:98 -# Fingerprint (SHA1): 06:08:3F:59:3F:15:A1:04:A0:69:A4:6B:A9:03:D0:06:B7:97:09:91 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "NetLock Arany (Class Gold) Főtanúsítvány" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\006\010\077\131\077\025\241\004\240\151\244\153\251\003\320\006 -\267\227\011\221 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\305\241\267\377\163\335\326\327\064\062\030\337\374\074\255\210 -END -CKA_ISSUER MULTILINE_OCTAL -\060\201\247\061\013\060\011\006\003\125\004\006\023\002\110\125 -\061\021\060\017\006\003\125\004\007\014\010\102\165\144\141\160 -\145\163\164\061\025\060\023\006\003\125\004\012\014\014\116\145 -\164\114\157\143\153\040\113\146\164\056\061\067\060\065\006\003 -\125\004\013\014\056\124\141\156\303\272\163\303\255\164\166\303 -\241\156\171\153\151\141\144\303\263\153\040\050\103\145\162\164 -\151\146\151\143\141\164\151\157\156\040\123\145\162\166\151\143 -\145\163\051\061\065\060\063\006\003\125\004\003\014\054\116\145 -\164\114\157\143\153\040\101\162\141\156\171\040\050\103\154\141 -\163\163\040\107\157\154\144\051\040\106\305\221\164\141\156\303 -\272\163\303\255\164\166\303\241\156\171 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\006\111\101\054\344\000\020 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Microsec e-Szigno Root CA 2009" -# -# Issuer: E=info@e-szigno.hu,CN=Microsec e-Szigno Root CA 2009,O=Microsec Ltd.,L=Budapest,C=HU -# Serial Number:00:c2:7e:43:04:4e:47:3f:19 -# Subject: E=info@e-szigno.hu,CN=Microsec e-Szigno Root CA 2009,O=Microsec Ltd.,L=Budapest,C=HU -# Not Valid Before: Tue Jun 16 11:30:18 2009 -# Not Valid After : Sun Dec 30 11:30:18 2029 -# Fingerprint (SHA-256): 3C:5F:81:FE:A5:FA:B8:2C:64:BF:A2:EA:EC:AF:CD:E8:E0:77:FC:86:20:A7:CA:E5:37:16:3D:F3:6E:DB:F3:78 -# Fingerprint (SHA1): 89:DF:74:FE:5C:F4:0F:4A:80:F9:E3:37:7D:54:DA:91:E1:01:31:8E -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Microsec e-Szigno Root CA 2009" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\201\202\061\013\060\011\006\003\125\004\006\023\002\110\125 -\061\021\060\017\006\003\125\004\007\014\010\102\165\144\141\160 -\145\163\164\061\026\060\024\006\003\125\004\012\014\015\115\151 -\143\162\157\163\145\143\040\114\164\144\056\061\047\060\045\006 -\003\125\004\003\014\036\115\151\143\162\157\163\145\143\040\145 -\055\123\172\151\147\156\157\040\122\157\157\164\040\103\101\040 -\062\060\060\071\061\037\060\035\006\011\052\206\110\206\367\015 -\001\011\001\026\020\151\156\146\157\100\145\055\163\172\151\147 -\156\157\056\150\165 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\201\202\061\013\060\011\006\003\125\004\006\023\002\110\125 -\061\021\060\017\006\003\125\004\007\014\010\102\165\144\141\160 -\145\163\164\061\026\060\024\006\003\125\004\012\014\015\115\151 -\143\162\157\163\145\143\040\114\164\144\056\061\047\060\045\006 -\003\125\004\003\014\036\115\151\143\162\157\163\145\143\040\145 -\055\123\172\151\147\156\157\040\122\157\157\164\040\103\101\040 -\062\060\060\071\061\037\060\035\006\011\052\206\110\206\367\015 -\001\011\001\026\020\151\156\146\157\100\145\055\163\172\151\147 -\156\157\056\150\165 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\011\000\302\176\103\004\116\107\077\031 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\004\012\060\202\002\362\240\003\002\001\002\002\011\000 -\302\176\103\004\116\107\077\031\060\015\006\011\052\206\110\206 -\367\015\001\001\013\005\000\060\201\202\061\013\060\011\006\003 -\125\004\006\023\002\110\125\061\021\060\017\006\003\125\004\007 -\014\010\102\165\144\141\160\145\163\164\061\026\060\024\006\003 -\125\004\012\014\015\115\151\143\162\157\163\145\143\040\114\164 -\144\056\061\047\060\045\006\003\125\004\003\014\036\115\151\143 -\162\157\163\145\143\040\145\055\123\172\151\147\156\157\040\122 -\157\157\164\040\103\101\040\062\060\060\071\061\037\060\035\006 -\011\052\206\110\206\367\015\001\011\001\026\020\151\156\146\157 -\100\145\055\163\172\151\147\156\157\056\150\165\060\036\027\015 -\060\071\060\066\061\066\061\061\063\060\061\070\132\027\015\062 -\071\061\062\063\060\061\061\063\060\061\070\132\060\201\202\061 -\013\060\011\006\003\125\004\006\023\002\110\125\061\021\060\017 -\006\003\125\004\007\014\010\102\165\144\141\160\145\163\164\061 -\026\060\024\006\003\125\004\012\014\015\115\151\143\162\157\163 -\145\143\040\114\164\144\056\061\047\060\045\006\003\125\004\003 -\014\036\115\151\143\162\157\163\145\143\040\145\055\123\172\151 -\147\156\157\040\122\157\157\164\040\103\101\040\062\060\060\071 -\061\037\060\035\006\011\052\206\110\206\367\015\001\011\001\026 -\020\151\156\146\157\100\145\055\163\172\151\147\156\157\056\150 -\165\060\202\001\042\060\015\006\011\052\206\110\206\367\015\001 -\001\001\005\000\003\202\001\017\000\060\202\001\012\002\202\001 -\001\000\351\370\217\363\143\255\332\206\330\247\340\102\373\317 -\221\336\246\046\370\231\245\143\160\255\233\256\312\063\100\175 -\155\226\156\241\016\104\356\341\023\235\224\102\122\232\275\165 -\205\164\054\250\016\035\223\266\030\267\214\054\250\317\373\134 -\161\271\332\354\376\350\176\217\344\057\035\262\250\165\207\330 -\267\241\345\073\317\231\112\106\320\203\031\175\300\241\022\034 -\225\155\112\364\330\307\245\115\063\056\205\071\100\165\176\024 -\174\200\022\230\120\307\101\147\270\240\200\141\124\246\154\116 -\037\340\235\016\007\351\311\272\063\347\376\300\125\050\054\002 -\200\247\031\365\236\334\125\123\003\227\173\007\110\377\231\373 -\067\212\044\304\131\314\120\020\143\216\252\251\032\260\204\032 -\206\371\137\273\261\120\156\244\321\012\314\325\161\176\037\247 -\033\174\365\123\156\042\137\313\053\346\324\174\135\256\326\302 -\306\114\345\005\001\331\355\127\374\301\043\171\374\372\310\044 -\203\225\363\265\152\121\001\320\167\326\351\022\241\371\032\203 -\373\202\033\271\260\227\364\166\006\063\103\111\240\377\013\265 -\372\265\002\003\001\000\001\243\201\200\060\176\060\017\006\003 -\125\035\023\001\001\377\004\005\060\003\001\001\377\060\016\006 -\003\125\035\017\001\001\377\004\004\003\002\001\006\060\035\006 -\003\125\035\016\004\026\004\024\313\017\306\337\102\103\314\075 -\313\265\110\043\241\032\172\246\052\273\064\150\060\037\006\003 -\125\035\043\004\030\060\026\200\024\313\017\306\337\102\103\314 -\075\313\265\110\043\241\032\172\246\052\273\064\150\060\033\006 -\003\125\035\021\004\024\060\022\201\020\151\156\146\157\100\145 -\055\163\172\151\147\156\157\056\150\165\060\015\006\011\052\206 -\110\206\367\015\001\001\013\005\000\003\202\001\001\000\311\321 -\016\136\056\325\314\263\174\076\313\374\075\377\015\050\225\223 -\004\310\277\332\315\171\270\103\220\360\244\276\357\362\357\041 -\230\274\324\324\135\006\366\356\102\354\060\154\240\252\251\312 -\361\257\212\372\077\013\163\152\076\352\056\100\176\037\256\124 -\141\171\353\056\010\067\327\043\363\214\237\276\035\261\341\244 -\165\333\240\342\124\024\261\272\034\051\244\030\366\022\272\242 -\024\024\343\061\065\310\100\377\267\340\005\166\127\301\034\131 -\362\370\277\344\355\045\142\134\204\360\176\176\037\263\276\371 -\267\041\021\314\003\001\126\160\247\020\222\036\033\064\201\036 -\255\234\032\303\004\074\355\002\141\326\036\006\363\137\072\207 -\362\053\361\105\207\345\075\254\321\307\127\204\275\153\256\334 -\330\371\266\033\142\160\013\075\066\311\102\362\062\327\172\141 -\346\322\333\075\317\310\251\311\233\334\333\130\104\327\157\070 -\257\177\170\323\243\255\032\165\272\034\301\066\174\217\036\155 -\034\303\165\106\256\065\005\246\366\134\075\041\356\126\360\311 -\202\042\055\172\124\253\160\303\175\042\145\202\160\226 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Microsec e-Szigno Root CA 2009" -# Issuer: E=info@e-szigno.hu,CN=Microsec e-Szigno Root CA 2009,O=Microsec Ltd.,L=Budapest,C=HU -# Serial Number:00:c2:7e:43:04:4e:47:3f:19 -# Subject: E=info@e-szigno.hu,CN=Microsec e-Szigno Root CA 2009,O=Microsec Ltd.,L=Budapest,C=HU -# Not Valid Before: Tue Jun 16 11:30:18 2009 -# Not Valid After : Sun Dec 30 11:30:18 2029 -# Fingerprint (SHA-256): 3C:5F:81:FE:A5:FA:B8:2C:64:BF:A2:EA:EC:AF:CD:E8:E0:77:FC:86:20:A7:CA:E5:37:16:3D:F3:6E:DB:F3:78 -# Fingerprint (SHA1): 89:DF:74:FE:5C:F4:0F:4A:80:F9:E3:37:7D:54:DA:91:E1:01:31:8E -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Microsec e-Szigno Root CA 2009" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\211\337\164\376\134\364\017\112\200\371\343\067\175\124\332\221 -\341\001\061\216 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\370\111\364\003\274\104\055\203\276\110\151\175\051\144\374\261 -END -CKA_ISSUER MULTILINE_OCTAL -\060\201\202\061\013\060\011\006\003\125\004\006\023\002\110\125 -\061\021\060\017\006\003\125\004\007\014\010\102\165\144\141\160 -\145\163\164\061\026\060\024\006\003\125\004\012\014\015\115\151 -\143\162\157\163\145\143\040\114\164\144\056\061\047\060\045\006 -\003\125\004\003\014\036\115\151\143\162\157\163\145\143\040\145 -\055\123\172\151\147\156\157\040\122\157\157\164\040\103\101\040 -\062\060\060\071\061\037\060\035\006\011\052\206\110\206\367\015 -\001\011\001\026\020\151\156\146\157\100\145\055\163\172\151\147 -\156\157\056\150\165 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\011\000\302\176\103\004\116\107\077\031 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "GlobalSign Root CA - R3" -# -# Issuer: CN=GlobalSign,O=GlobalSign,OU=GlobalSign Root CA - R3 -# Serial Number:04:00:00:00:00:01:21:58:53:08:a2 -# Subject: CN=GlobalSign,O=GlobalSign,OU=GlobalSign Root CA - R3 -# Not Valid Before: Wed Mar 18 10:00:00 2009 -# Not Valid After : Sun Mar 18 10:00:00 2029 -# Fingerprint (SHA-256): CB:B5:22:D7:B7:F1:27:AD:6A:01:13:86:5B:DF:1C:D4:10:2E:7D:07:59:AF:63:5A:7C:F4:72:0D:C9:63:C5:3B -# Fingerprint (SHA1): D6:9B:56:11:48:F0:1C:77:C5:45:78:C1:09:26:DF:5B:85:69:76:AD -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "GlobalSign Root CA - R3" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\114\061\040\060\036\006\003\125\004\013\023\027\107\154\157 -\142\141\154\123\151\147\156\040\122\157\157\164\040\103\101\040 -\055\040\122\063\061\023\060\021\006\003\125\004\012\023\012\107 -\154\157\142\141\154\123\151\147\156\061\023\060\021\006\003\125 -\004\003\023\012\107\154\157\142\141\154\123\151\147\156 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\114\061\040\060\036\006\003\125\004\013\023\027\107\154\157 -\142\141\154\123\151\147\156\040\122\157\157\164\040\103\101\040 -\055\040\122\063\061\023\060\021\006\003\125\004\012\023\012\107 -\154\157\142\141\154\123\151\147\156\061\023\060\021\006\003\125 -\004\003\023\012\107\154\157\142\141\154\123\151\147\156 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\013\004\000\000\000\000\001\041\130\123\010\242 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\003\137\060\202\002\107\240\003\002\001\002\002\013\004 -\000\000\000\000\001\041\130\123\010\242\060\015\006\011\052\206 -\110\206\367\015\001\001\013\005\000\060\114\061\040\060\036\006 -\003\125\004\013\023\027\107\154\157\142\141\154\123\151\147\156 -\040\122\157\157\164\040\103\101\040\055\040\122\063\061\023\060 -\021\006\003\125\004\012\023\012\107\154\157\142\141\154\123\151 -\147\156\061\023\060\021\006\003\125\004\003\023\012\107\154\157 -\142\141\154\123\151\147\156\060\036\027\015\060\071\060\063\061 -\070\061\060\060\060\060\060\132\027\015\062\071\060\063\061\070 -\061\060\060\060\060\060\132\060\114\061\040\060\036\006\003\125 -\004\013\023\027\107\154\157\142\141\154\123\151\147\156\040\122 -\157\157\164\040\103\101\040\055\040\122\063\061\023\060\021\006 -\003\125\004\012\023\012\107\154\157\142\141\154\123\151\147\156 -\061\023\060\021\006\003\125\004\003\023\012\107\154\157\142\141 -\154\123\151\147\156\060\202\001\042\060\015\006\011\052\206\110 -\206\367\015\001\001\001\005\000\003\202\001\017\000\060\202\001 -\012\002\202\001\001\000\314\045\166\220\171\006\170\042\026\365 -\300\203\266\204\312\050\236\375\005\166\021\305\255\210\162\374 -\106\002\103\307\262\212\235\004\137\044\313\056\113\341\140\202 -\106\341\122\253\014\201\107\160\154\335\144\321\353\365\054\243 -\017\202\075\014\053\256\227\327\266\024\206\020\171\273\073\023 -\200\167\214\010\341\111\322\152\142\057\037\136\372\226\150\337 -\211\047\225\070\237\006\327\076\311\313\046\131\015\163\336\260 -\310\351\046\016\203\025\306\357\133\213\322\004\140\312\111\246 -\050\366\151\073\366\313\310\050\221\345\235\212\141\127\067\254 -\164\024\334\164\340\072\356\162\057\056\234\373\320\273\277\365 -\075\000\341\006\063\350\202\053\256\123\246\072\026\163\214\335 -\101\016\040\072\300\264\247\241\351\262\117\220\056\062\140\351 -\127\313\271\004\222\150\150\345\070\046\140\165\262\237\167\377 -\221\024\357\256\040\111\374\255\100\025\110\321\002\061\141\031 -\136\270\227\357\255\167\267\144\232\172\277\137\301\023\357\233 -\142\373\015\154\340\124\151\026\251\003\332\156\351\203\223\161 -\166\306\151\205\202\027\002\003\001\000\001\243\102\060\100\060 -\016\006\003\125\035\017\001\001\377\004\004\003\002\001\006\060 -\017\006\003\125\035\023\001\001\377\004\005\060\003\001\001\377 -\060\035\006\003\125\035\016\004\026\004\024\217\360\113\177\250 -\056\105\044\256\115\120\372\143\232\213\336\342\335\033\274\060 -\015\006\011\052\206\110\206\367\015\001\001\013\005\000\003\202 -\001\001\000\113\100\333\300\120\252\376\310\014\357\367\226\124 -\105\111\273\226\000\011\101\254\263\023\206\206\050\007\063\312 -\153\346\164\271\272\000\055\256\244\012\323\365\361\361\017\212 -\277\163\147\112\203\307\104\173\170\340\257\156\154\157\003\051 -\216\063\071\105\303\216\344\271\127\154\252\374\022\226\354\123 -\306\055\344\044\154\271\224\143\373\334\123\150\147\126\076\203 -\270\317\065\041\303\311\150\376\316\332\302\123\252\314\220\212 -\351\360\135\106\214\225\335\172\130\050\032\057\035\336\315\000 -\067\101\217\355\104\155\327\123\050\227\176\363\147\004\036\025 -\327\212\226\264\323\336\114\047\244\114\033\163\163\166\364\027 -\231\302\037\172\016\343\055\010\255\012\034\054\377\074\253\125 -\016\017\221\176\066\353\303\127\111\276\341\056\055\174\140\213 -\303\101\121\023\043\235\316\367\062\153\224\001\250\231\347\054 -\063\037\072\073\045\322\206\100\316\073\054\206\170\311\141\057 -\024\272\356\333\125\157\337\204\356\005\011\115\275\050\330\162 -\316\323\142\120\145\036\353\222\227\203\061\331\263\265\312\107 -\130\077\137 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "GlobalSign Root CA - R3" -# Issuer: CN=GlobalSign,O=GlobalSign,OU=GlobalSign Root CA - R3 -# Serial Number:04:00:00:00:00:01:21:58:53:08:a2 -# Subject: CN=GlobalSign,O=GlobalSign,OU=GlobalSign Root CA - R3 -# Not Valid Before: Wed Mar 18 10:00:00 2009 -# Not Valid After : Sun Mar 18 10:00:00 2029 -# Fingerprint (SHA-256): CB:B5:22:D7:B7:F1:27:AD:6A:01:13:86:5B:DF:1C:D4:10:2E:7D:07:59:AF:63:5A:7C:F4:72:0D:C9:63:C5:3B -# Fingerprint (SHA1): D6:9B:56:11:48:F0:1C:77:C5:45:78:C1:09:26:DF:5B:85:69:76:AD -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "GlobalSign Root CA - R3" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\326\233\126\021\110\360\034\167\305\105\170\301\011\046\337\133 -\205\151\166\255 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\305\337\270\111\312\005\023\125\356\055\272\032\303\076\260\050 -END -CKA_ISSUER MULTILINE_OCTAL -\060\114\061\040\060\036\006\003\125\004\013\023\027\107\154\157 -\142\141\154\123\151\147\156\040\122\157\157\164\040\103\101\040 -\055\040\122\063\061\023\060\021\006\003\125\004\012\023\012\107 -\154\157\142\141\154\123\151\147\156\061\023\060\021\006\003\125 -\004\003\023\012\107\154\157\142\141\154\123\151\147\156 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\013\004\000\000\000\000\001\041\130\123\010\242 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Izenpe.com" -# -# Issuer: CN=Izenpe.com,O=IZENPE S.A.,C=ES -# Serial Number:00:b0:b7:5a:16:48:5f:bf:e1:cb:f5:8b:d7:19:e6:7d -# Subject: CN=Izenpe.com,O=IZENPE S.A.,C=ES -# Not Valid Before: Thu Dec 13 13:08:28 2007 -# Not Valid After : Sun Dec 13 08:27:25 2037 -# Fingerprint (SHA-256): 25:30:CC:8E:98:32:15:02:BA:D9:6F:9B:1F:BA:1B:09:9E:2D:29:9E:0F:45:48:BB:91:4F:36:3B:C0:D4:53:1F -# Fingerprint (SHA1): 2F:78:3D:25:52:18:A7:4A:65:39:71:B5:2C:A2:9C:45:15:6F:E9:19 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Izenpe.com" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\070\061\013\060\011\006\003\125\004\006\023\002\105\123\061 -\024\060\022\006\003\125\004\012\014\013\111\132\105\116\120\105 -\040\123\056\101\056\061\023\060\021\006\003\125\004\003\014\012 -\111\172\145\156\160\145\056\143\157\155 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\070\061\013\060\011\006\003\125\004\006\023\002\105\123\061 -\024\060\022\006\003\125\004\012\014\013\111\132\105\116\120\105 -\040\123\056\101\056\061\023\060\021\006\003\125\004\003\014\012 -\111\172\145\156\160\145\056\143\157\155 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\000\260\267\132\026\110\137\277\341\313\365\213\327\031 -\346\175 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\361\060\202\003\331\240\003\002\001\002\002\020\000 -\260\267\132\026\110\137\277\341\313\365\213\327\031\346\175\060 -\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060\070 -\061\013\060\011\006\003\125\004\006\023\002\105\123\061\024\060 -\022\006\003\125\004\012\014\013\111\132\105\116\120\105\040\123 -\056\101\056\061\023\060\021\006\003\125\004\003\014\012\111\172 -\145\156\160\145\056\143\157\155\060\036\027\015\060\067\061\062 -\061\063\061\063\060\070\062\070\132\027\015\063\067\061\062\061 -\063\060\070\062\067\062\065\132\060\070\061\013\060\011\006\003 -\125\004\006\023\002\105\123\061\024\060\022\006\003\125\004\012 -\014\013\111\132\105\116\120\105\040\123\056\101\056\061\023\060 -\021\006\003\125\004\003\014\012\111\172\145\156\160\145\056\143 -\157\155\060\202\002\042\060\015\006\011\052\206\110\206\367\015 -\001\001\001\005\000\003\202\002\017\000\060\202\002\012\002\202 -\002\001\000\311\323\172\312\017\036\254\247\206\350\026\145\152 -\261\302\033\105\062\161\225\331\376\020\133\314\257\347\245\171 -\001\217\211\303\312\362\125\161\367\167\276\167\224\363\162\244 -\054\104\330\236\222\233\024\072\241\347\044\220\012\012\126\216 -\305\330\046\224\341\331\110\341\055\076\332\012\162\335\243\231 -\025\332\201\242\207\364\173\156\046\167\211\130\255\326\353\014 -\262\101\172\163\156\155\333\172\170\101\351\010\210\022\176\207 -\056\146\021\143\154\124\373\074\235\162\300\274\056\377\302\267 -\335\015\166\343\072\327\367\264\150\276\242\365\343\201\156\301 -\106\157\135\215\340\115\306\124\125\211\032\063\061\012\261\127 -\271\243\212\230\303\354\073\064\305\225\101\151\176\165\302\074 -\040\305\141\272\121\107\240\040\220\223\241\220\113\363\116\174 -\205\105\124\232\321\005\046\101\260\265\115\035\063\276\304\003 -\310\045\174\301\160\333\073\364\011\055\124\047\110\254\057\341 -\304\254\076\310\313\222\114\123\071\067\043\354\323\001\371\340 -\011\104\115\115\144\300\341\015\132\207\042\274\255\033\243\376 -\046\265\025\363\247\374\204\031\351\354\241\210\264\104\151\204 -\203\363\211\321\164\006\251\314\013\326\302\336\047\205\120\046 -\312\027\270\311\172\207\126\054\032\001\036\154\276\023\255\020 -\254\265\044\365\070\221\241\326\113\332\361\273\322\336\107\265 -\361\274\201\366\131\153\317\031\123\351\215\025\313\112\313\251 -\157\104\345\033\101\317\341\206\247\312\320\152\237\274\114\215 -\006\063\132\242\205\345\220\065\240\142\134\026\116\360\343\242 -\372\003\032\264\054\161\263\130\054\336\173\013\333\032\017\353 -\336\041\037\006\167\006\003\260\311\357\231\374\300\271\117\013 -\206\050\376\322\271\352\343\332\245\303\107\151\022\340\333\360 -\366\031\213\355\173\160\327\002\326\355\207\030\050\054\004\044 -\114\167\344\110\212\032\306\073\232\324\017\312\372\165\322\001 -\100\132\215\171\277\213\317\113\317\252\026\301\225\344\255\114 -\212\076\027\221\324\261\142\345\202\345\200\004\244\003\176\215 -\277\332\177\242\017\227\117\014\323\015\373\327\321\345\162\176 -\034\310\167\377\133\232\017\267\256\005\106\345\361\250\026\354 -\107\244\027\002\003\001\000\001\243\201\366\060\201\363\060\201 -\260\006\003\125\035\021\004\201\250\060\201\245\201\017\151\156 -\146\157\100\151\172\145\156\160\145\056\143\157\155\244\201\221 -\060\201\216\061\107\060\105\006\003\125\004\012\014\076\111\132 -\105\116\120\105\040\123\056\101\056\040\055\040\103\111\106\040 -\101\060\061\063\063\067\062\066\060\055\122\115\145\162\143\056 -\126\151\164\157\162\151\141\055\107\141\163\164\145\151\172\040 -\124\061\060\065\065\040\106\066\062\040\123\070\061\103\060\101 -\006\003\125\004\011\014\072\101\166\144\141\040\144\145\154\040 -\115\145\144\151\164\145\162\162\141\156\145\157\040\105\164\157 -\162\142\151\144\145\141\040\061\064\040\055\040\060\061\060\061 -\060\040\126\151\164\157\162\151\141\055\107\141\163\164\145\151 -\172\060\017\006\003\125\035\023\001\001\377\004\005\060\003\001 -\001\377\060\016\006\003\125\035\017\001\001\377\004\004\003\002 -\001\006\060\035\006\003\125\035\016\004\026\004\024\035\034\145 -\016\250\362\045\173\264\221\317\344\261\261\346\275\125\164\154 -\005\060\015\006\011\052\206\110\206\367\015\001\001\013\005\000 -\003\202\002\001\000\170\246\014\026\112\237\114\210\072\300\313 -\016\245\026\175\237\271\110\137\030\217\015\142\066\366\315\031 -\153\254\253\325\366\221\175\256\161\363\077\263\016\170\205\233 -\225\244\047\041\107\102\112\174\110\072\365\105\174\263\014\216 -\121\170\254\225\023\336\306\375\175\270\032\220\114\253\222\003 -\307\355\102\001\316\017\330\261\372\242\222\341\140\155\256\172 -\153\011\252\306\051\356\150\111\147\060\200\044\172\061\026\071 -\133\176\361\034\056\335\154\011\255\362\061\301\202\116\271\273 -\371\276\277\052\205\077\300\100\243\072\131\374\131\113\074\050 -\044\333\264\025\165\256\015\210\272\056\163\300\275\130\207\345 -\102\362\353\136\356\036\060\042\231\313\067\321\304\041\154\201 -\354\276\155\046\346\034\344\102\040\236\107\260\254\203\131\160 -\054\065\326\257\066\064\264\315\073\370\062\250\357\343\170\211 -\373\215\105\054\332\234\270\176\100\034\141\347\076\242\222\054 -\113\362\315\372\230\266\051\377\363\362\173\251\037\056\240\223 -\127\053\336\205\003\371\151\067\313\236\170\152\005\264\305\061 -\170\211\354\172\247\205\341\271\173\074\336\276\036\171\204\316 -\237\160\016\131\302\065\056\220\052\061\331\344\105\172\101\244 -\056\023\233\064\016\146\173\111\253\144\227\320\106\303\171\235 -\162\120\143\246\230\133\006\275\110\155\330\071\203\160\350\065 -\360\005\321\252\274\343\333\310\002\352\174\375\202\332\302\133 -\122\065\256\230\072\255\272\065\223\043\247\037\110\335\065\106 -\230\262\020\150\344\245\061\302\012\130\056\031\201\020\311\120 -\165\374\352\132\026\316\021\327\356\357\120\210\055\141\377\077 -\102\163\005\224\103\325\216\074\116\001\072\031\245\037\106\116 -\167\320\135\345\201\042\041\207\376\224\175\204\330\223\255\326 -\150\103\110\262\333\353\163\044\347\221\177\124\244\266\200\076 -\235\243\074\114\162\302\127\304\240\324\314\070\047\316\325\006 -\236\242\110\331\351\237\316\202\160\066\223\232\073\337\226\041 -\343\131\267\014\332\221\067\360\375\131\132\263\231\310\151\154 -\103\046\001\065\143\140\125\211\003\072\165\330\272\112\331\124 -\377\356\336\200\330\055\321\070\325\136\055\013\230\175\076\154 -\333\374\046\210\307 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Izenpe.com" -# Issuer: CN=Izenpe.com,O=IZENPE S.A.,C=ES -# Serial Number:00:b0:b7:5a:16:48:5f:bf:e1:cb:f5:8b:d7:19:e6:7d -# Subject: CN=Izenpe.com,O=IZENPE S.A.,C=ES -# Not Valid Before: Thu Dec 13 13:08:28 2007 -# Not Valid After : Sun Dec 13 08:27:25 2037 -# Fingerprint (SHA-256): 25:30:CC:8E:98:32:15:02:BA:D9:6F:9B:1F:BA:1B:09:9E:2D:29:9E:0F:45:48:BB:91:4F:36:3B:C0:D4:53:1F -# Fingerprint (SHA1): 2F:78:3D:25:52:18:A7:4A:65:39:71:B5:2C:A2:9C:45:15:6F:E9:19 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Izenpe.com" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\057\170\075\045\122\030\247\112\145\071\161\265\054\242\234\105 -\025\157\351\031 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\246\260\315\205\200\332\134\120\064\243\071\220\057\125\147\163 -END -CKA_ISSUER MULTILINE_OCTAL -\060\070\061\013\060\011\006\003\125\004\006\023\002\105\123\061 -\024\060\022\006\003\125\004\012\014\013\111\132\105\116\120\105 -\040\123\056\101\056\061\023\060\021\006\003\125\004\003\014\012 -\111\172\145\156\160\145\056\143\157\155 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\000\260\267\132\026\110\137\277\341\313\365\213\327\031 -\346\175 -END -# For Server Distrust After: Wed Apr 15 23:59:59 2026 -CKA_NSS_SERVER_DISTRUST_AFTER MULTILINE_OCTAL -\062\066\060\064\061\065\062\063\065\071\065\071\132 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Go Daddy Root Certificate Authority - G2" -# -# Issuer: CN=Go Daddy Root Certificate Authority - G2,O="GoDaddy.com, Inc.",L=Scottsdale,ST=Arizona,C=US -# Serial Number: 0 (0x0) -# Subject: CN=Go Daddy Root Certificate Authority - G2,O="GoDaddy.com, Inc.",L=Scottsdale,ST=Arizona,C=US -# Not Valid Before: Tue Sep 01 00:00:00 2009 -# Not Valid After : Thu Dec 31 23:59:59 2037 -# Fingerprint (SHA-256): 45:14:0B:32:47:EB:9C:C8:C5:B4:F0:D7:B5:30:91:F7:32:92:08:9E:6E:5A:63:E2:74:9D:D3:AC:A9:19:8E:DA -# Fingerprint (SHA1): 47:BE:AB:C9:22:EA:E8:0E:78:78:34:62:A7:9F:45:C2:54:FD:E6:8B -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Go Daddy Root Certificate Authority - G2" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\201\203\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\020\060\016\006\003\125\004\010\023\007\101\162\151\172\157 -\156\141\061\023\060\021\006\003\125\004\007\023\012\123\143\157 -\164\164\163\144\141\154\145\061\032\060\030\006\003\125\004\012 -\023\021\107\157\104\141\144\144\171\056\143\157\155\054\040\111 -\156\143\056\061\061\060\057\006\003\125\004\003\023\050\107\157 -\040\104\141\144\144\171\040\122\157\157\164\040\103\145\162\164 -\151\146\151\143\141\164\145\040\101\165\164\150\157\162\151\164 -\171\040\055\040\107\062 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\201\203\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\020\060\016\006\003\125\004\010\023\007\101\162\151\172\157 -\156\141\061\023\060\021\006\003\125\004\007\023\012\123\143\157 -\164\164\163\144\141\154\145\061\032\060\030\006\003\125\004\012 -\023\021\107\157\104\141\144\144\171\056\143\157\155\054\040\111 -\156\143\056\061\061\060\057\006\003\125\004\003\023\050\107\157 -\040\104\141\144\144\171\040\122\157\157\164\040\103\145\162\164 -\151\146\151\143\141\164\145\040\101\165\164\150\157\162\151\164 -\171\040\055\040\107\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\000 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\003\305\060\202\002\255\240\003\002\001\002\002\001\000 -\060\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060 -\201\203\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\020\060\016\006\003\125\004\010\023\007\101\162\151\172\157\156 -\141\061\023\060\021\006\003\125\004\007\023\012\123\143\157\164 -\164\163\144\141\154\145\061\032\060\030\006\003\125\004\012\023 -\021\107\157\104\141\144\144\171\056\143\157\155\054\040\111\156 -\143\056\061\061\060\057\006\003\125\004\003\023\050\107\157\040 -\104\141\144\144\171\040\122\157\157\164\040\103\145\162\164\151 -\146\151\143\141\164\145\040\101\165\164\150\157\162\151\164\171 -\040\055\040\107\062\060\036\027\015\060\071\060\071\060\061\060 -\060\060\060\060\060\132\027\015\063\067\061\062\063\061\062\063 -\065\071\065\071\132\060\201\203\061\013\060\011\006\003\125\004 -\006\023\002\125\123\061\020\060\016\006\003\125\004\010\023\007 -\101\162\151\172\157\156\141\061\023\060\021\006\003\125\004\007 -\023\012\123\143\157\164\164\163\144\141\154\145\061\032\060\030 -\006\003\125\004\012\023\021\107\157\104\141\144\144\171\056\143 -\157\155\054\040\111\156\143\056\061\061\060\057\006\003\125\004 -\003\023\050\107\157\040\104\141\144\144\171\040\122\157\157\164 -\040\103\145\162\164\151\146\151\143\141\164\145\040\101\165\164 -\150\157\162\151\164\171\040\055\040\107\062\060\202\001\042\060 -\015\006\011\052\206\110\206\367\015\001\001\001\005\000\003\202 -\001\017\000\060\202\001\012\002\202\001\001\000\277\161\142\010 -\361\372\131\064\367\033\311\030\243\367\200\111\130\351\042\203 -\023\246\305\040\103\001\073\204\361\346\205\111\237\047\352\366 -\204\033\116\240\264\333\160\230\307\062\001\261\005\076\007\116 -\356\364\372\117\057\131\060\042\347\253\031\126\153\342\200\007 -\374\363\026\165\200\071\121\173\345\371\065\266\164\116\251\215 -\202\023\344\266\077\251\003\203\372\242\276\212\025\152\177\336 -\013\303\266\031\024\005\312\352\303\250\004\224\073\106\174\062 -\015\363\000\146\042\310\215\151\155\066\214\021\030\267\323\262 -\034\140\264\070\372\002\214\316\323\335\106\007\336\012\076\353 -\135\174\310\174\373\260\053\123\244\222\142\151\121\045\005\141 -\032\104\201\214\054\251\103\226\043\337\254\072\201\232\016\051 -\305\034\251\351\135\036\266\236\236\060\012\071\316\361\210\200 -\373\113\135\314\062\354\205\142\103\045\064\002\126\047\001\221 -\264\073\160\052\077\156\261\350\234\210\001\175\237\324\371\333 -\123\155\140\235\277\054\347\130\253\270\137\106\374\316\304\033 -\003\074\011\353\111\061\134\151\106\263\340\107\002\003\001\000 -\001\243\102\060\100\060\017\006\003\125\035\023\001\001\377\004 -\005\060\003\001\001\377\060\016\006\003\125\035\017\001\001\377 -\004\004\003\002\001\006\060\035\006\003\125\035\016\004\026\004 -\024\072\232\205\007\020\147\050\266\357\366\275\005\101\156\040 -\301\224\332\017\336\060\015\006\011\052\206\110\206\367\015\001 -\001\013\005\000\003\202\001\001\000\231\333\135\171\325\371\227 -\131\147\003\141\361\176\073\006\061\165\055\241\040\216\117\145 -\207\264\367\246\234\274\330\351\057\320\333\132\356\317\164\214 -\163\264\070\102\332\005\173\370\002\165\270\375\245\261\327\256 -\366\327\336\023\313\123\020\176\212\106\321\227\372\267\056\053 -\021\253\220\260\047\200\371\350\237\132\351\067\237\253\344\337 -\154\263\205\027\235\075\331\044\117\171\221\065\326\137\004\353 -\200\203\253\232\002\055\265\020\364\330\220\307\004\163\100\355 -\162\045\240\251\237\354\236\253\150\022\231\127\306\217\022\072 -\011\244\275\104\375\006\025\067\301\233\344\062\243\355\070\350 -\330\144\363\054\176\024\374\002\352\237\315\377\007\150\027\333 -\042\220\070\055\172\215\321\124\361\151\343\137\063\312\172\075 -\173\012\343\312\177\137\071\345\342\165\272\305\166\030\063\316 -\054\360\057\114\255\367\261\347\316\117\250\304\233\112\124\006 -\305\177\175\325\010\017\342\034\376\176\027\270\254\136\366\324 -\026\262\103\011\014\115\366\247\153\264\231\204\145\312\172\210 -\342\342\104\276\134\367\352\034\365 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Go Daddy Root Certificate Authority - G2" -# Issuer: CN=Go Daddy Root Certificate Authority - G2,O="GoDaddy.com, Inc.",L=Scottsdale,ST=Arizona,C=US -# Serial Number: 0 (0x0) -# Subject: CN=Go Daddy Root Certificate Authority - G2,O="GoDaddy.com, Inc.",L=Scottsdale,ST=Arizona,C=US -# Not Valid Before: Tue Sep 01 00:00:00 2009 -# Not Valid After : Thu Dec 31 23:59:59 2037 -# Fingerprint (SHA-256): 45:14:0B:32:47:EB:9C:C8:C5:B4:F0:D7:B5:30:91:F7:32:92:08:9E:6E:5A:63:E2:74:9D:D3:AC:A9:19:8E:DA -# Fingerprint (SHA1): 47:BE:AB:C9:22:EA:E8:0E:78:78:34:62:A7:9F:45:C2:54:FD:E6:8B -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Go Daddy Root Certificate Authority - G2" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\107\276\253\311\042\352\350\016\170\170\064\142\247\237\105\302 -\124\375\346\213 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\200\072\274\042\301\346\373\215\233\073\047\112\062\033\232\001 -END -CKA_ISSUER MULTILINE_OCTAL -\060\201\203\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\020\060\016\006\003\125\004\010\023\007\101\162\151\172\157 -\156\141\061\023\060\021\006\003\125\004\007\023\012\123\143\157 -\164\164\163\144\141\154\145\061\032\060\030\006\003\125\004\012 -\023\021\107\157\104\141\144\144\171\056\143\157\155\054\040\111 -\156\143\056\061\061\060\057\006\003\125\004\003\023\050\107\157 -\040\104\141\144\144\171\040\122\157\157\164\040\103\145\162\164 -\151\146\151\143\141\164\145\040\101\165\164\150\157\162\151\164 -\171\040\055\040\107\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\000 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Starfield Root Certificate Authority - G2" -# -# Issuer: CN=Starfield Root Certificate Authority - G2,O="Starfield Technologies, Inc.",L=Scottsdale,ST=Arizona,C=US -# Serial Number: 0 (0x0) -# Subject: CN=Starfield Root Certificate Authority - G2,O="Starfield Technologies, Inc.",L=Scottsdale,ST=Arizona,C=US -# Not Valid Before: Tue Sep 01 00:00:00 2009 -# Not Valid After : Thu Dec 31 23:59:59 2037 -# Fingerprint (SHA-256): 2C:E1:CB:0B:F9:D2:F9:E1:02:99:3F:BE:21:51:52:C3:B2:DD:0C:AB:DE:1C:68:E5:31:9B:83:91:54:DB:B7:F5 -# Fingerprint (SHA1): B5:1C:06:7C:EE:2B:0C:3D:F8:55:AB:2D:92:F4:FE:39:D4:E7:0F:0E -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Starfield Root Certificate Authority - G2" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\201\217\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\020\060\016\006\003\125\004\010\023\007\101\162\151\172\157 -\156\141\061\023\060\021\006\003\125\004\007\023\012\123\143\157 -\164\164\163\144\141\154\145\061\045\060\043\006\003\125\004\012 -\023\034\123\164\141\162\146\151\145\154\144\040\124\145\143\150 -\156\157\154\157\147\151\145\163\054\040\111\156\143\056\061\062 -\060\060\006\003\125\004\003\023\051\123\164\141\162\146\151\145 -\154\144\040\122\157\157\164\040\103\145\162\164\151\146\151\143 -\141\164\145\040\101\165\164\150\157\162\151\164\171\040\055\040 -\107\062 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\201\217\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\020\060\016\006\003\125\004\010\023\007\101\162\151\172\157 -\156\141\061\023\060\021\006\003\125\004\007\023\012\123\143\157 -\164\164\163\144\141\154\145\061\045\060\043\006\003\125\004\012 -\023\034\123\164\141\162\146\151\145\154\144\040\124\145\143\150 -\156\157\154\157\147\151\145\163\054\040\111\156\143\056\061\062 -\060\060\006\003\125\004\003\023\051\123\164\141\162\146\151\145 -\154\144\040\122\157\157\164\040\103\145\162\164\151\146\151\143 -\141\164\145\040\101\165\164\150\157\162\151\164\171\040\055\040 -\107\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\000 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\003\335\060\202\002\305\240\003\002\001\002\002\001\000 -\060\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060 -\201\217\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\020\060\016\006\003\125\004\010\023\007\101\162\151\172\157\156 -\141\061\023\060\021\006\003\125\004\007\023\012\123\143\157\164 -\164\163\144\141\154\145\061\045\060\043\006\003\125\004\012\023 -\034\123\164\141\162\146\151\145\154\144\040\124\145\143\150\156 -\157\154\157\147\151\145\163\054\040\111\156\143\056\061\062\060 -\060\006\003\125\004\003\023\051\123\164\141\162\146\151\145\154 -\144\040\122\157\157\164\040\103\145\162\164\151\146\151\143\141 -\164\145\040\101\165\164\150\157\162\151\164\171\040\055\040\107 -\062\060\036\027\015\060\071\060\071\060\061\060\060\060\060\060 -\060\132\027\015\063\067\061\062\063\061\062\063\065\071\065\071 -\132\060\201\217\061\013\060\011\006\003\125\004\006\023\002\125 -\123\061\020\060\016\006\003\125\004\010\023\007\101\162\151\172 -\157\156\141\061\023\060\021\006\003\125\004\007\023\012\123\143 -\157\164\164\163\144\141\154\145\061\045\060\043\006\003\125\004 -\012\023\034\123\164\141\162\146\151\145\154\144\040\124\145\143 -\150\156\157\154\157\147\151\145\163\054\040\111\156\143\056\061 -\062\060\060\006\003\125\004\003\023\051\123\164\141\162\146\151 -\145\154\144\040\122\157\157\164\040\103\145\162\164\151\146\151 -\143\141\164\145\040\101\165\164\150\157\162\151\164\171\040\055 -\040\107\062\060\202\001\042\060\015\006\011\052\206\110\206\367 -\015\001\001\001\005\000\003\202\001\017\000\060\202\001\012\002 -\202\001\001\000\275\355\301\003\374\366\217\374\002\261\157\133 -\237\110\331\235\171\342\242\267\003\141\126\030\303\107\266\327 -\312\075\065\056\211\103\367\241\151\233\336\212\032\375\023\040 -\234\264\111\167\062\051\126\375\271\354\214\335\042\372\162\334 -\047\141\227\356\366\132\204\354\156\031\271\211\054\334\204\133 -\325\164\373\153\137\305\211\245\020\122\211\106\125\364\270\165 -\034\346\177\344\124\256\113\370\125\162\127\002\031\370\027\161 -\131\353\036\050\007\164\305\235\110\276\154\264\364\244\260\363 -\144\067\171\222\300\354\106\136\177\341\155\123\114\142\257\315 -\037\013\143\273\072\235\373\374\171\000\230\141\164\317\046\202 -\100\143\363\262\162\152\031\015\231\312\324\016\165\314\067\373 -\213\211\301\131\361\142\177\137\263\137\145\060\370\247\267\115 -\166\132\036\166\136\064\300\350\226\126\231\212\263\360\177\244 -\315\275\334\062\061\174\221\317\340\137\021\370\153\252\111\134 -\321\231\224\321\242\343\143\133\011\166\265\126\142\341\113\164 -\035\226\324\046\324\010\004\131\320\230\016\016\346\336\374\303 -\354\037\220\361\002\003\001\000\001\243\102\060\100\060\017\006 -\003\125\035\023\001\001\377\004\005\060\003\001\001\377\060\016 -\006\003\125\035\017\001\001\377\004\004\003\002\001\006\060\035 -\006\003\125\035\016\004\026\004\024\174\014\062\037\247\331\060 -\177\304\175\150\243\142\250\241\316\253\007\133\047\060\015\006 -\011\052\206\110\206\367\015\001\001\013\005\000\003\202\001\001 -\000\021\131\372\045\117\003\157\224\231\073\232\037\202\205\071 -\324\166\005\224\136\341\050\223\155\142\135\011\302\240\250\324 -\260\165\070\361\064\152\235\344\237\212\206\046\121\346\054\321 -\306\055\156\225\040\112\222\001\354\270\212\147\173\061\342\147 -\056\214\225\003\046\056\103\235\112\061\366\016\265\014\273\267 -\342\067\177\042\272\000\243\016\173\122\373\153\273\073\304\323 -\171\121\116\315\220\364\147\007\031\310\074\106\172\015\001\175 -\305\130\347\155\346\205\060\027\232\044\304\020\340\004\367\340 -\362\177\324\252\012\377\102\035\067\355\224\345\144\131\022\040 -\167\070\323\062\076\070\201\165\226\163\372\150\217\261\313\316 -\037\305\354\372\234\176\317\176\261\361\007\055\266\374\277\312 -\244\277\320\227\005\112\274\352\030\050\002\220\275\124\170\011 -\041\161\323\321\175\035\331\026\260\251\141\075\320\012\000\042 -\374\307\173\313\011\144\105\013\073\100\201\367\175\174\062\365 -\230\312\130\216\175\052\356\220\131\163\144\371\066\164\136\045 -\241\365\146\005\056\177\071\025\251\052\373\120\213\216\205\151 -\364 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Starfield Root Certificate Authority - G2" -# Issuer: CN=Starfield Root Certificate Authority - G2,O="Starfield Technologies, Inc.",L=Scottsdale,ST=Arizona,C=US -# Serial Number: 0 (0x0) -# Subject: CN=Starfield Root Certificate Authority - G2,O="Starfield Technologies, Inc.",L=Scottsdale,ST=Arizona,C=US -# Not Valid Before: Tue Sep 01 00:00:00 2009 -# Not Valid After : Thu Dec 31 23:59:59 2037 -# Fingerprint (SHA-256): 2C:E1:CB:0B:F9:D2:F9:E1:02:99:3F:BE:21:51:52:C3:B2:DD:0C:AB:DE:1C:68:E5:31:9B:83:91:54:DB:B7:F5 -# Fingerprint (SHA1): B5:1C:06:7C:EE:2B:0C:3D:F8:55:AB:2D:92:F4:FE:39:D4:E7:0F:0E -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Starfield Root Certificate Authority - G2" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\265\034\006\174\356\053\014\075\370\125\253\055\222\364\376\071 -\324\347\017\016 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\326\071\201\306\122\176\226\151\374\374\312\146\355\005\362\226 -END -CKA_ISSUER MULTILINE_OCTAL -\060\201\217\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\020\060\016\006\003\125\004\010\023\007\101\162\151\172\157 -\156\141\061\023\060\021\006\003\125\004\007\023\012\123\143\157 -\164\164\163\144\141\154\145\061\045\060\043\006\003\125\004\012 -\023\034\123\164\141\162\146\151\145\154\144\040\124\145\143\150 -\156\157\154\157\147\151\145\163\054\040\111\156\143\056\061\062 -\060\060\006\003\125\004\003\023\051\123\164\141\162\146\151\145 -\154\144\040\122\157\157\164\040\103\145\162\164\151\146\151\143 -\141\164\145\040\101\165\164\150\157\162\151\164\171\040\055\040 -\107\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\000 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Starfield Services Root Certificate Authority - G2" -# -# Issuer: CN=Starfield Services Root Certificate Authority - G2,O="Starfield Technologies, Inc.",L=Scottsdale,ST=Arizona,C=US -# Serial Number: 0 (0x0) -# Subject: CN=Starfield Services Root Certificate Authority - G2,O="Starfield Technologies, Inc.",L=Scottsdale,ST=Arizona,C=US -# Not Valid Before: Tue Sep 01 00:00:00 2009 -# Not Valid After : Thu Dec 31 23:59:59 2037 -# Fingerprint (SHA-256): 56:8D:69:05:A2:C8:87:08:A4:B3:02:51:90:ED:CF:ED:B1:97:4A:60:6A:13:C6:E5:29:0F:CB:2A:E6:3E:DA:B5 -# Fingerprint (SHA1): 92:5A:8F:8D:2C:6D:04:E0:66:5F:59:6A:FF:22:D8:63:E8:25:6F:3F -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Starfield Services Root Certificate Authority - G2" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\201\230\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\020\060\016\006\003\125\004\010\023\007\101\162\151\172\157 -\156\141\061\023\060\021\006\003\125\004\007\023\012\123\143\157 -\164\164\163\144\141\154\145\061\045\060\043\006\003\125\004\012 -\023\034\123\164\141\162\146\151\145\154\144\040\124\145\143\150 -\156\157\154\157\147\151\145\163\054\040\111\156\143\056\061\073 -\060\071\006\003\125\004\003\023\062\123\164\141\162\146\151\145 -\154\144\040\123\145\162\166\151\143\145\163\040\122\157\157\164 -\040\103\145\162\164\151\146\151\143\141\164\145\040\101\165\164 -\150\157\162\151\164\171\040\055\040\107\062 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\201\230\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\020\060\016\006\003\125\004\010\023\007\101\162\151\172\157 -\156\141\061\023\060\021\006\003\125\004\007\023\012\123\143\157 -\164\164\163\144\141\154\145\061\045\060\043\006\003\125\004\012 -\023\034\123\164\141\162\146\151\145\154\144\040\124\145\143\150 -\156\157\154\157\147\151\145\163\054\040\111\156\143\056\061\073 -\060\071\006\003\125\004\003\023\062\123\164\141\162\146\151\145 -\154\144\040\123\145\162\166\151\143\145\163\040\122\157\157\164 -\040\103\145\162\164\151\146\151\143\141\164\145\040\101\165\164 -\150\157\162\151\164\171\040\055\040\107\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\000 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\003\357\060\202\002\327\240\003\002\001\002\002\001\000 -\060\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060 -\201\230\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\020\060\016\006\003\125\004\010\023\007\101\162\151\172\157\156 -\141\061\023\060\021\006\003\125\004\007\023\012\123\143\157\164 -\164\163\144\141\154\145\061\045\060\043\006\003\125\004\012\023 -\034\123\164\141\162\146\151\145\154\144\040\124\145\143\150\156 -\157\154\157\147\151\145\163\054\040\111\156\143\056\061\073\060 -\071\006\003\125\004\003\023\062\123\164\141\162\146\151\145\154 -\144\040\123\145\162\166\151\143\145\163\040\122\157\157\164\040 -\103\145\162\164\151\146\151\143\141\164\145\040\101\165\164\150 -\157\162\151\164\171\040\055\040\107\062\060\036\027\015\060\071 -\060\071\060\061\060\060\060\060\060\060\132\027\015\063\067\061 -\062\063\061\062\063\065\071\065\071\132\060\201\230\061\013\060 -\011\006\003\125\004\006\023\002\125\123\061\020\060\016\006\003 -\125\004\010\023\007\101\162\151\172\157\156\141\061\023\060\021 -\006\003\125\004\007\023\012\123\143\157\164\164\163\144\141\154 -\145\061\045\060\043\006\003\125\004\012\023\034\123\164\141\162 -\146\151\145\154\144\040\124\145\143\150\156\157\154\157\147\151 -\145\163\054\040\111\156\143\056\061\073\060\071\006\003\125\004 -\003\023\062\123\164\141\162\146\151\145\154\144\040\123\145\162 -\166\151\143\145\163\040\122\157\157\164\040\103\145\162\164\151 -\146\151\143\141\164\145\040\101\165\164\150\157\162\151\164\171 -\040\055\040\107\062\060\202\001\042\060\015\006\011\052\206\110 -\206\367\015\001\001\001\005\000\003\202\001\017\000\060\202\001 -\012\002\202\001\001\000\325\014\072\304\052\371\116\342\365\276 -\031\227\137\216\210\123\261\037\077\313\317\237\040\023\155\051 -\072\310\017\175\074\367\153\166\070\143\331\066\140\250\233\136 -\134\000\200\262\057\131\177\366\207\371\045\103\206\347\151\033 -\122\232\220\341\161\343\330\055\015\116\157\366\310\111\331\266 -\363\032\126\256\053\266\164\024\353\317\373\046\343\032\272\035 -\226\056\152\073\130\224\211\107\126\377\045\240\223\160\123\203 -\332\204\164\024\303\147\236\004\150\072\337\216\100\132\035\112 -\116\317\103\221\073\347\126\326\000\160\313\122\356\173\175\256 -\072\347\274\061\371\105\366\302\140\317\023\131\002\053\200\314 -\064\107\337\271\336\220\145\155\002\317\054\221\246\246\347\336 -\205\030\111\174\146\116\243\072\155\251\265\356\064\056\272\015 -\003\270\063\337\107\353\261\153\215\045\331\233\316\201\321\105 -\106\062\226\160\207\336\002\016\111\103\205\266\154\163\273\144 -\352\141\101\254\311\324\124\337\207\057\307\042\262\046\314\237 -\131\124\150\237\374\276\052\057\304\125\034\165\100\140\027\205 -\002\125\071\213\177\005\002\003\001\000\001\243\102\060\100\060 -\017\006\003\125\035\023\001\001\377\004\005\060\003\001\001\377 -\060\016\006\003\125\035\017\001\001\377\004\004\003\002\001\006 -\060\035\006\003\125\035\016\004\026\004\024\234\137\000\337\252 -\001\327\060\053\070\210\242\270\155\112\234\362\021\221\203\060 -\015\006\011\052\206\110\206\367\015\001\001\013\005\000\003\202 -\001\001\000\113\066\246\204\167\151\335\073\031\237\147\043\010 -\157\016\141\311\375\204\334\137\330\066\201\315\330\033\101\055 -\237\140\335\307\032\150\331\321\156\206\341\210\043\317\023\336 -\103\317\342\064\263\004\235\037\051\325\277\370\136\310\325\301 -\275\356\222\157\062\164\362\221\202\057\275\202\102\172\255\052 -\267\040\175\115\274\172\125\022\302\025\352\275\367\152\225\056 -\154\164\237\317\034\264\362\305\001\243\205\320\162\076\255\163 -\253\013\233\165\014\155\105\267\216\224\254\226\067\265\240\320 -\217\025\107\016\343\350\203\335\217\375\357\101\001\167\314\047 -\251\142\205\063\362\067\010\357\161\317\167\006\336\310\031\035 -\210\100\317\175\106\035\377\036\307\341\316\377\043\333\306\372 -\215\125\116\251\002\347\107\021\106\076\364\375\275\173\051\046 -\273\251\141\142\067\050\266\055\052\366\020\206\144\311\160\247 -\322\255\267\051\160\171\352\074\332\143\045\237\375\150\267\060 -\354\160\373\165\212\267\155\140\147\262\036\310\271\351\330\250 -\157\002\213\147\015\115\046\127\161\332\040\374\301\112\120\215 -\261\050\272 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Starfield Services Root Certificate Authority - G2" -# Issuer: CN=Starfield Services Root Certificate Authority - G2,O="Starfield Technologies, Inc.",L=Scottsdale,ST=Arizona,C=US -# Serial Number: 0 (0x0) -# Subject: CN=Starfield Services Root Certificate Authority - G2,O="Starfield Technologies, Inc.",L=Scottsdale,ST=Arizona,C=US -# Not Valid Before: Tue Sep 01 00:00:00 2009 -# Not Valid After : Thu Dec 31 23:59:59 2037 -# Fingerprint (SHA-256): 56:8D:69:05:A2:C8:87:08:A4:B3:02:51:90:ED:CF:ED:B1:97:4A:60:6A:13:C6:E5:29:0F:CB:2A:E6:3E:DA:B5 -# Fingerprint (SHA1): 92:5A:8F:8D:2C:6D:04:E0:66:5F:59:6A:FF:22:D8:63:E8:25:6F:3F -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Starfield Services Root Certificate Authority - G2" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\222\132\217\215\054\155\004\340\146\137\131\152\377\042\330\143 -\350\045\157\077 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\027\065\164\257\173\141\034\353\364\371\074\342\356\100\371\242 -END -CKA_ISSUER MULTILINE_OCTAL -\060\201\230\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\020\060\016\006\003\125\004\010\023\007\101\162\151\172\157 -\156\141\061\023\060\021\006\003\125\004\007\023\012\123\143\157 -\164\164\163\144\141\154\145\061\045\060\043\006\003\125\004\012 -\023\034\123\164\141\162\146\151\145\154\144\040\124\145\143\150 -\156\157\154\157\147\151\145\163\054\040\111\156\143\056\061\073 -\060\071\006\003\125\004\003\023\062\123\164\141\162\146\151\145 -\154\144\040\123\145\162\166\151\143\145\163\040\122\157\157\164 -\040\103\145\162\164\151\146\151\143\141\164\145\040\101\165\164 -\150\157\162\151\164\171\040\055\040\107\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\000 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Certum Trusted Network CA" -# -# Issuer: CN=Certum Trusted Network CA,OU=Certum Certification Authority,O=Unizeto Technologies S.A.,C=PL -# Serial Number: 279744 (0x444c0) -# Subject: CN=Certum Trusted Network CA,OU=Certum Certification Authority,O=Unizeto Technologies S.A.,C=PL -# Not Valid Before: Wed Oct 22 12:07:37 2008 -# Not Valid After : Mon Dec 31 12:07:37 2029 -# Fingerprint (SHA-256): 5C:58:46:8D:55:F5:8E:49:7E:74:39:82:D2:B5:00:10:B6:D1:65:37:4A:CF:83:A7:D4:A3:2D:B7:68:C4:40:8E -# Fingerprint (SHA1): 07:E0:32:E0:20:B7:2C:3F:19:2F:06:28:A2:59:3A:19:A7:0F:06:9E -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Certum Trusted Network CA" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\176\061\013\060\011\006\003\125\004\006\023\002\120\114\061 -\042\060\040\006\003\125\004\012\023\031\125\156\151\172\145\164 -\157\040\124\145\143\150\156\157\154\157\147\151\145\163\040\123 -\056\101\056\061\047\060\045\006\003\125\004\013\023\036\103\145 -\162\164\165\155\040\103\145\162\164\151\146\151\143\141\164\151 -\157\156\040\101\165\164\150\157\162\151\164\171\061\042\060\040 -\006\003\125\004\003\023\031\103\145\162\164\165\155\040\124\162 -\165\163\164\145\144\040\116\145\164\167\157\162\153\040\103\101 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\176\061\013\060\011\006\003\125\004\006\023\002\120\114\061 -\042\060\040\006\003\125\004\012\023\031\125\156\151\172\145\164 -\157\040\124\145\143\150\156\157\154\157\147\151\145\163\040\123 -\056\101\056\061\047\060\045\006\003\125\004\013\023\036\103\145 -\162\164\165\155\040\103\145\162\164\151\146\151\143\141\164\151 -\157\156\040\101\165\164\150\157\162\151\164\171\061\042\060\040 -\006\003\125\004\003\023\031\103\145\162\164\165\155\040\124\162 -\165\163\164\145\144\040\116\145\164\167\157\162\153\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\003\004\104\300 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\003\273\060\202\002\243\240\003\002\001\002\002\003\004 -\104\300\060\015\006\011\052\206\110\206\367\015\001\001\005\005 -\000\060\176\061\013\060\011\006\003\125\004\006\023\002\120\114 -\061\042\060\040\006\003\125\004\012\023\031\125\156\151\172\145 -\164\157\040\124\145\143\150\156\157\154\157\147\151\145\163\040 -\123\056\101\056\061\047\060\045\006\003\125\004\013\023\036\103 -\145\162\164\165\155\040\103\145\162\164\151\146\151\143\141\164 -\151\157\156\040\101\165\164\150\157\162\151\164\171\061\042\060 -\040\006\003\125\004\003\023\031\103\145\162\164\165\155\040\124 -\162\165\163\164\145\144\040\116\145\164\167\157\162\153\040\103 -\101\060\036\027\015\060\070\061\060\062\062\061\062\060\067\063 -\067\132\027\015\062\071\061\062\063\061\061\062\060\067\063\067 -\132\060\176\061\013\060\011\006\003\125\004\006\023\002\120\114 -\061\042\060\040\006\003\125\004\012\023\031\125\156\151\172\145 -\164\157\040\124\145\143\150\156\157\154\157\147\151\145\163\040 -\123\056\101\056\061\047\060\045\006\003\125\004\013\023\036\103 -\145\162\164\165\155\040\103\145\162\164\151\146\151\143\141\164 -\151\157\156\040\101\165\164\150\157\162\151\164\171\061\042\060 -\040\006\003\125\004\003\023\031\103\145\162\164\165\155\040\124 -\162\165\163\164\145\144\040\116\145\164\167\157\162\153\040\103 -\101\060\202\001\042\060\015\006\011\052\206\110\206\367\015\001 -\001\001\005\000\003\202\001\017\000\060\202\001\012\002\202\001 -\001\000\343\373\175\243\162\272\302\360\311\024\207\365\153\001 -\116\341\156\100\007\272\155\047\135\177\367\133\055\263\132\307 -\121\137\253\244\062\246\141\207\266\156\017\206\322\060\002\227 -\370\327\151\127\241\030\071\135\152\144\171\306\001\131\254\074 -\061\112\070\174\322\004\322\113\050\350\040\137\073\007\242\314 -\115\163\333\363\256\117\307\126\325\132\247\226\211\372\363\253 -\150\324\043\206\131\047\317\011\047\274\254\156\162\203\034\060 -\162\337\340\242\351\322\341\164\165\031\275\052\236\173\025\124 -\004\033\327\103\071\255\125\050\305\342\032\273\364\300\344\256 -\070\111\063\314\166\205\237\071\105\322\244\236\362\022\214\121 -\370\174\344\055\177\365\254\137\353\026\237\261\055\321\272\314 -\221\102\167\114\045\311\220\070\157\333\360\314\373\216\036\227 -\131\076\325\140\116\346\005\050\355\111\171\023\113\272\110\333 -\057\371\162\323\071\312\376\037\330\064\162\365\264\100\317\061 -\001\303\354\336\021\055\027\135\037\270\120\321\136\031\247\151 -\336\007\063\050\312\120\225\371\247\124\313\124\206\120\105\251 -\371\111\002\003\001\000\001\243\102\060\100\060\017\006\003\125 -\035\023\001\001\377\004\005\060\003\001\001\377\060\035\006\003 -\125\035\016\004\026\004\024\010\166\315\313\007\377\044\366\305 -\315\355\273\220\274\342\204\067\106\165\367\060\016\006\003\125 -\035\017\001\001\377\004\004\003\002\001\006\060\015\006\011\052 -\206\110\206\367\015\001\001\005\005\000\003\202\001\001\000\246 -\250\255\042\316\001\075\246\243\377\142\320\110\235\213\136\162 -\260\170\104\343\334\034\257\011\375\043\110\372\275\052\304\271 -\125\004\265\020\243\215\047\336\013\202\143\320\356\336\014\067 -\171\101\133\042\262\260\232\101\134\246\160\340\324\320\167\313 -\043\323\000\340\154\126\057\341\151\015\015\331\252\277\041\201 -\120\331\006\245\250\377\225\067\320\252\376\342\263\365\231\055 -\105\204\212\345\102\011\327\164\002\057\367\211\330\231\351\274 -\047\324\107\215\272\015\106\034\167\317\024\244\034\271\244\061 -\304\234\050\164\003\064\377\063\031\046\245\351\015\164\267\076 -\227\306\166\350\047\226\243\146\335\341\256\362\101\133\312\230 -\126\203\163\160\344\206\032\322\061\101\272\057\276\055\023\132 -\166\157\116\350\116\201\016\077\133\003\042\240\022\276\146\130 -\021\112\313\003\304\264\052\052\055\226\027\340\071\124\274\110 -\323\166\047\235\232\055\006\246\311\354\071\322\253\333\237\232 -\013\047\002\065\051\261\100\225\347\371\350\234\125\210\031\106 -\326\267\064\365\176\316\071\232\331\070\361\121\367\117\054 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Certum Trusted Network CA" -# Issuer: CN=Certum Trusted Network CA,OU=Certum Certification Authority,O=Unizeto Technologies S.A.,C=PL -# Serial Number: 279744 (0x444c0) -# Subject: CN=Certum Trusted Network CA,OU=Certum Certification Authority,O=Unizeto Technologies S.A.,C=PL -# Not Valid Before: Wed Oct 22 12:07:37 2008 -# Not Valid After : Mon Dec 31 12:07:37 2029 -# Fingerprint (SHA-256): 5C:58:46:8D:55:F5:8E:49:7E:74:39:82:D2:B5:00:10:B6:D1:65:37:4A:CF:83:A7:D4:A3:2D:B7:68:C4:40:8E -# Fingerprint (SHA1): 07:E0:32:E0:20:B7:2C:3F:19:2F:06:28:A2:59:3A:19:A7:0F:06:9E -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Certum Trusted Network CA" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\007\340\062\340\040\267\054\077\031\057\006\050\242\131\072\031 -\247\017\006\236 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\325\351\201\100\305\030\151\374\106\054\211\165\142\017\252\170 -END -CKA_ISSUER MULTILINE_OCTAL -\060\176\061\013\060\011\006\003\125\004\006\023\002\120\114\061 -\042\060\040\006\003\125\004\012\023\031\125\156\151\172\145\164 -\157\040\124\145\143\150\156\157\154\157\147\151\145\163\040\123 -\056\101\056\061\047\060\045\006\003\125\004\013\023\036\103\145 -\162\164\165\155\040\103\145\162\164\151\146\151\143\141\164\151 -\157\156\040\101\165\164\150\157\162\151\164\171\061\042\060\040 -\006\003\125\004\003\023\031\103\145\162\164\165\155\040\124\162 -\165\163\164\145\144\040\116\145\164\167\157\162\153\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\003\004\104\300 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "TWCA Root Certification Authority" -# -# Issuer: CN=TWCA Root Certification Authority,OU=Root CA,O=TAIWAN-CA,C=TW -# Serial Number: 1 (0x1) -# Subject: CN=TWCA Root Certification Authority,OU=Root CA,O=TAIWAN-CA,C=TW -# Not Valid Before: Thu Aug 28 07:24:33 2008 -# Not Valid After : Tue Dec 31 15:59:59 2030 -# Fingerprint (SHA-256): BF:D8:8F:E1:10:1C:41:AE:3E:80:1B:F8:BE:56:35:0E:E9:BA:D1:A6:B9:BD:51:5E:DC:5C:6D:5B:87:11:AC:44 -# Fingerprint (SHA1): CF:9E:87:6D:D3:EB:FC:42:26:97:A3:B5:A3:7A:A0:76:A9:06:23:48 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "TWCA Root Certification Authority" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\137\061\013\060\011\006\003\125\004\006\023\002\124\127\061 -\022\060\020\006\003\125\004\012\014\011\124\101\111\127\101\116 -\055\103\101\061\020\060\016\006\003\125\004\013\014\007\122\157 -\157\164\040\103\101\061\052\060\050\006\003\125\004\003\014\041 -\124\127\103\101\040\122\157\157\164\040\103\145\162\164\151\146 -\151\143\141\164\151\157\156\040\101\165\164\150\157\162\151\164 -\171 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\137\061\013\060\011\006\003\125\004\006\023\002\124\127\061 -\022\060\020\006\003\125\004\012\014\011\124\101\111\127\101\116 -\055\103\101\061\020\060\016\006\003\125\004\013\014\007\122\157 -\157\164\040\103\101\061\052\060\050\006\003\125\004\003\014\041 -\124\127\103\101\040\122\157\157\164\040\103\145\162\164\151\146 -\151\143\141\164\151\157\156\040\101\165\164\150\157\162\151\164 -\171 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\001 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\003\173\060\202\002\143\240\003\002\001\002\002\001\001 -\060\015\006\011\052\206\110\206\367\015\001\001\005\005\000\060 -\137\061\013\060\011\006\003\125\004\006\023\002\124\127\061\022 -\060\020\006\003\125\004\012\014\011\124\101\111\127\101\116\055 -\103\101\061\020\060\016\006\003\125\004\013\014\007\122\157\157 -\164\040\103\101\061\052\060\050\006\003\125\004\003\014\041\124 -\127\103\101\040\122\157\157\164\040\103\145\162\164\151\146\151 -\143\141\164\151\157\156\040\101\165\164\150\157\162\151\164\171 -\060\036\027\015\060\070\060\070\062\070\060\067\062\064\063\063 -\132\027\015\063\060\061\062\063\061\061\065\065\071\065\071\132 -\060\137\061\013\060\011\006\003\125\004\006\023\002\124\127\061 -\022\060\020\006\003\125\004\012\014\011\124\101\111\127\101\116 -\055\103\101\061\020\060\016\006\003\125\004\013\014\007\122\157 -\157\164\040\103\101\061\052\060\050\006\003\125\004\003\014\041 -\124\127\103\101\040\122\157\157\164\040\103\145\162\164\151\146 -\151\143\141\164\151\157\156\040\101\165\164\150\157\162\151\164 -\171\060\202\001\042\060\015\006\011\052\206\110\206\367\015\001 -\001\001\005\000\003\202\001\017\000\060\202\001\012\002\202\001 -\001\000\260\176\162\270\244\003\224\346\247\336\011\070\221\112 -\021\100\207\247\174\131\144\024\173\265\021\020\335\376\277\325 -\300\273\126\342\205\045\364\065\162\017\370\123\320\101\341\104 -\001\302\264\034\303\061\102\026\107\205\063\042\166\262\012\157 -\017\345\045\120\117\205\206\276\277\230\056\020\147\036\276\021 -\005\206\005\220\304\131\320\174\170\020\260\200\134\267\341\307 -\053\165\313\174\237\256\265\321\235\043\067\143\247\334\102\242 -\055\222\004\033\120\301\173\270\076\033\311\126\004\213\057\122 -\233\255\251\126\351\301\377\255\251\130\207\060\266\201\367\227 -\105\374\031\127\073\053\157\344\107\364\231\105\376\035\361\370 -\227\243\210\035\067\034\134\217\340\166\045\232\120\370\240\124 -\377\104\220\166\043\322\062\306\303\253\006\277\374\373\277\363 -\255\175\222\142\002\133\051\323\065\243\223\232\103\144\140\135 -\262\372\062\377\073\004\257\115\100\152\371\307\343\357\043\375 -\153\313\345\017\213\070\015\356\012\374\376\017\230\237\060\061 -\335\154\122\145\371\213\201\276\042\341\034\130\003\272\221\033 -\211\007\002\003\001\000\001\243\102\060\100\060\016\006\003\125 -\035\017\001\001\377\004\004\003\002\001\006\060\017\006\003\125 -\035\023\001\001\377\004\005\060\003\001\001\377\060\035\006\003 -\125\035\016\004\026\004\024\152\070\133\046\215\336\213\132\362 -\117\172\124\203\031\030\343\010\065\246\272\060\015\006\011\052 -\206\110\206\367\015\001\001\005\005\000\003\202\001\001\000\074 -\325\167\075\332\337\211\272\207\014\010\124\152\040\120\222\276 -\260\101\075\271\046\144\203\012\057\350\100\300\227\050\047\202 -\060\112\311\223\377\152\347\246\000\177\211\102\232\326\021\345 -\123\316\057\314\362\332\005\304\376\342\120\304\072\206\175\314 -\332\176\020\011\073\222\065\052\123\262\376\353\053\005\331\154 -\135\346\320\357\323\152\146\236\025\050\205\172\350\202\000\254 -\036\247\011\151\126\102\323\150\121\030\276\124\232\277\104\101 -\272\111\276\040\272\151\134\356\270\167\315\316\154\037\255\203 -\226\030\175\016\265\024\071\204\361\050\351\055\243\236\173\036 -\172\162\132\203\263\171\157\357\264\374\320\012\245\130\117\106 -\337\373\155\171\131\362\204\042\122\256\017\314\373\174\073\347 -\152\312\107\141\303\172\370\323\222\004\037\270\040\204\341\066 -\124\026\307\100\336\073\212\163\334\337\306\011\114\337\354\332 -\377\324\123\102\241\311\362\142\035\042\203\074\227\305\371\031 -\142\047\254\145\042\327\323\074\306\345\216\262\123\314\111\316 -\274\060\376\173\016\063\220\373\355\322\024\221\037\007\257 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "TWCA Root Certification Authority" -# Issuer: CN=TWCA Root Certification Authority,OU=Root CA,O=TAIWAN-CA,C=TW -# Serial Number: 1 (0x1) -# Subject: CN=TWCA Root Certification Authority,OU=Root CA,O=TAIWAN-CA,C=TW -# Not Valid Before: Thu Aug 28 07:24:33 2008 -# Not Valid After : Tue Dec 31 15:59:59 2030 -# Fingerprint (SHA-256): BF:D8:8F:E1:10:1C:41:AE:3E:80:1B:F8:BE:56:35:0E:E9:BA:D1:A6:B9:BD:51:5E:DC:5C:6D:5B:87:11:AC:44 -# Fingerprint (SHA1): CF:9E:87:6D:D3:EB:FC:42:26:97:A3:B5:A3:7A:A0:76:A9:06:23:48 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "TWCA Root Certification Authority" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\317\236\207\155\323\353\374\102\046\227\243\265\243\172\240\166 -\251\006\043\110 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\252\010\217\366\371\173\267\362\261\247\036\233\352\352\275\171 -END -CKA_ISSUER MULTILINE_OCTAL -\060\137\061\013\060\011\006\003\125\004\006\023\002\124\127\061 -\022\060\020\006\003\125\004\012\014\011\124\101\111\127\101\116 -\055\103\101\061\020\060\016\006\003\125\004\013\014\007\122\157 -\157\164\040\103\101\061\052\060\050\006\003\125\004\003\014\041 -\124\127\103\101\040\122\157\157\164\040\103\145\162\164\151\146 -\151\143\141\164\151\157\156\040\101\165\164\150\157\162\151\164 -\171 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\001 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Security Communication RootCA2" -# -# Issuer: OU=Security Communication RootCA2,O="SECOM Trust Systems CO.,LTD.",C=JP -# Serial Number: 0 (0x0) -# Subject: OU=Security Communication RootCA2,O="SECOM Trust Systems CO.,LTD.",C=JP -# Not Valid Before: Fri May 29 05:00:39 2009 -# Not Valid After : Tue May 29 05:00:39 2029 -# Fingerprint (SHA-256): 51:3B:2C:EC:B8:10:D4:CD:E5:DD:85:39:1A:DF:C6:C2:DD:60:D8:7B:B7:36:D2:B5:21:48:4A:A4:7A:0E:BE:F6 -# Fingerprint (SHA1): 5F:3B:8C:F2:F8:10:B3:7D:78:B4:CE:EC:19:19:C3:73:34:B9:C7:74 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Security Communication RootCA2" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\135\061\013\060\011\006\003\125\004\006\023\002\112\120\061 -\045\060\043\006\003\125\004\012\023\034\123\105\103\117\115\040 -\124\162\165\163\164\040\123\171\163\164\145\155\163\040\103\117 -\056\054\114\124\104\056\061\047\060\045\006\003\125\004\013\023 -\036\123\145\143\165\162\151\164\171\040\103\157\155\155\165\156 -\151\143\141\164\151\157\156\040\122\157\157\164\103\101\062 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\135\061\013\060\011\006\003\125\004\006\023\002\112\120\061 -\045\060\043\006\003\125\004\012\023\034\123\105\103\117\115\040 -\124\162\165\163\164\040\123\171\163\164\145\155\163\040\103\117 -\056\054\114\124\104\056\061\047\060\045\006\003\125\004\013\023 -\036\123\145\143\165\162\151\164\171\040\103\157\155\155\165\156 -\151\143\141\164\151\157\156\040\122\157\157\164\103\101\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\000 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\003\167\060\202\002\137\240\003\002\001\002\002\001\000 -\060\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060 -\135\061\013\060\011\006\003\125\004\006\023\002\112\120\061\045 -\060\043\006\003\125\004\012\023\034\123\105\103\117\115\040\124 -\162\165\163\164\040\123\171\163\164\145\155\163\040\103\117\056 -\054\114\124\104\056\061\047\060\045\006\003\125\004\013\023\036 -\123\145\143\165\162\151\164\171\040\103\157\155\155\165\156\151 -\143\141\164\151\157\156\040\122\157\157\164\103\101\062\060\036 -\027\015\060\071\060\065\062\071\060\065\060\060\063\071\132\027 -\015\062\071\060\065\062\071\060\065\060\060\063\071\132\060\135 -\061\013\060\011\006\003\125\004\006\023\002\112\120\061\045\060 -\043\006\003\125\004\012\023\034\123\105\103\117\115\040\124\162 -\165\163\164\040\123\171\163\164\145\155\163\040\103\117\056\054 -\114\124\104\056\061\047\060\045\006\003\125\004\013\023\036\123 -\145\143\165\162\151\164\171\040\103\157\155\155\165\156\151\143 -\141\164\151\157\156\040\122\157\157\164\103\101\062\060\202\001 -\042\060\015\006\011\052\206\110\206\367\015\001\001\001\005\000 -\003\202\001\017\000\060\202\001\012\002\202\001\001\000\320\025 -\071\122\261\122\263\272\305\131\202\304\135\122\256\072\103\145 -\200\113\307\362\226\274\333\066\227\326\246\144\214\250\136\360 -\343\012\034\367\337\227\075\113\256\366\135\354\041\265\101\253 -\315\271\176\166\237\276\371\076\066\064\240\073\301\366\061\021 -\105\164\223\075\127\200\305\371\211\231\312\345\253\152\324\265 -\332\101\220\020\301\326\326\102\211\302\277\364\070\022\225\114 -\124\005\367\066\344\105\203\173\024\145\326\334\014\115\321\336 -\176\014\253\073\304\025\276\072\126\246\132\157\166\151\122\251 -\172\271\310\353\152\232\135\122\320\055\012\153\065\026\011\020 -\204\320\152\312\072\006\000\067\107\344\176\127\117\077\213\353 -\147\270\210\252\305\276\123\125\262\221\304\175\271\260\205\031 -\006\170\056\333\141\032\372\205\365\112\221\241\347\026\325\216 -\242\071\337\224\270\160\037\050\077\213\374\100\136\143\203\074 -\203\052\032\231\153\317\336\131\152\073\374\157\026\327\037\375 -\112\020\353\116\202\026\072\254\047\014\123\361\255\325\044\260 -\153\003\120\301\055\074\026\335\104\064\047\032\165\373\002\003 -\001\000\001\243\102\060\100\060\035\006\003\125\035\016\004\026 -\004\024\012\205\251\167\145\005\230\174\100\201\370\017\227\054 -\070\361\012\354\074\317\060\016\006\003\125\035\017\001\001\377 -\004\004\003\002\001\006\060\017\006\003\125\035\023\001\001\377 -\004\005\060\003\001\001\377\060\015\006\011\052\206\110\206\367 -\015\001\001\013\005\000\003\202\001\001\000\114\072\243\104\254 -\271\105\261\307\223\176\310\013\012\102\337\144\352\034\356\131 -\154\010\272\211\137\152\312\112\225\236\172\217\007\305\332\105 -\162\202\161\016\072\322\314\157\247\264\241\043\273\366\044\237 -\313\027\376\214\246\316\302\322\333\314\215\374\161\374\003\051 -\301\154\135\063\137\144\266\145\073\211\157\030\166\170\365\334 -\242\110\037\031\077\216\223\353\361\372\027\356\315\116\343\004 -\022\125\326\345\344\335\373\076\005\174\342\035\136\306\247\274 -\227\117\150\072\365\351\056\012\103\266\257\127\134\142\150\174 -\267\375\243\212\204\240\254\142\276\053\011\207\064\360\152\001 -\273\233\051\126\074\376\000\067\317\043\154\361\116\252\266\164 -\106\022\154\221\356\064\325\354\232\221\347\104\276\220\061\162 -\325\111\002\366\002\345\364\037\353\174\331\226\125\251\377\354 -\212\371\231\107\377\065\132\002\252\004\313\212\133\207\161\051 -\221\275\244\264\172\015\275\232\365\127\043\000\007\041\027\077 -\112\071\321\005\111\013\247\266\067\201\245\135\214\252\063\136 -\201\050\174\247\175\047\353\000\256\215\067 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Security Communication RootCA2" -# Issuer: OU=Security Communication RootCA2,O="SECOM Trust Systems CO.,LTD.",C=JP -# Serial Number: 0 (0x0) -# Subject: OU=Security Communication RootCA2,O="SECOM Trust Systems CO.,LTD.",C=JP -# Not Valid Before: Fri May 29 05:00:39 2009 -# Not Valid After : Tue May 29 05:00:39 2029 -# Fingerprint (SHA-256): 51:3B:2C:EC:B8:10:D4:CD:E5:DD:85:39:1A:DF:C6:C2:DD:60:D8:7B:B7:36:D2:B5:21:48:4A:A4:7A:0E:BE:F6 -# Fingerprint (SHA1): 5F:3B:8C:F2:F8:10:B3:7D:78:B4:CE:EC:19:19:C3:73:34:B9:C7:74 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Security Communication RootCA2" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\137\073\214\362\370\020\263\175\170\264\316\354\031\031\303\163 -\064\271\307\164 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\154\071\175\244\016\125\131\262\077\326\101\261\022\120\336\103 -END -CKA_ISSUER MULTILINE_OCTAL -\060\135\061\013\060\011\006\003\125\004\006\023\002\112\120\061 -\045\060\043\006\003\125\004\012\023\034\123\105\103\117\115\040 -\124\162\165\163\164\040\123\171\163\164\145\155\163\040\103\117 -\056\054\114\124\104\056\061\047\060\045\006\003\125\004\013\023 -\036\123\145\143\165\162\151\164\171\040\103\157\155\155\165\156 -\151\143\141\164\151\157\156\040\122\157\157\164\103\101\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\000 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Actalis Authentication Root CA" -# -# Issuer: CN=Actalis Authentication Root CA,O=Actalis S.p.A./03358520967,L=Milan,C=IT -# Serial Number:57:0a:11:97:42:c4:e3:cc -# Subject: CN=Actalis Authentication Root CA,O=Actalis S.p.A./03358520967,L=Milan,C=IT -# Not Valid Before: Thu Sep 22 11:22:02 2011 -# Not Valid After : Sun Sep 22 11:22:02 2030 -# Fingerprint (SHA-256): 55:92:60:84:EC:96:3A:64:B9:6E:2A:BE:01:CE:0B:A8:6A:64:FB:FE:BC:C7:AA:B5:AF:C1:55:B3:7F:D7:60:66 -# Fingerprint (SHA1): F3:73:B3:87:06:5A:28:84:8A:F2:F3:4A:CE:19:2B:DD:C7:8E:9C:AC -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Actalis Authentication Root CA" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\153\061\013\060\011\006\003\125\004\006\023\002\111\124\061 -\016\060\014\006\003\125\004\007\014\005\115\151\154\141\156\061 -\043\060\041\006\003\125\004\012\014\032\101\143\164\141\154\151 -\163\040\123\056\160\056\101\056\057\060\063\063\065\070\065\062 -\060\071\066\067\061\047\060\045\006\003\125\004\003\014\036\101 -\143\164\141\154\151\163\040\101\165\164\150\145\156\164\151\143 -\141\164\151\157\156\040\122\157\157\164\040\103\101 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\153\061\013\060\011\006\003\125\004\006\023\002\111\124\061 -\016\060\014\006\003\125\004\007\014\005\115\151\154\141\156\061 -\043\060\041\006\003\125\004\012\014\032\101\143\164\141\154\151 -\163\040\123\056\160\056\101\056\057\060\063\063\065\070\065\062 -\060\071\066\067\061\047\060\045\006\003\125\004\003\014\036\101 -\143\164\141\154\151\163\040\101\165\164\150\145\156\164\151\143 -\141\164\151\157\156\040\122\157\157\164\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\010\127\012\021\227\102\304\343\314 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\273\060\202\003\243\240\003\002\001\002\002\010\127 -\012\021\227\102\304\343\314\060\015\006\011\052\206\110\206\367 -\015\001\001\013\005\000\060\153\061\013\060\011\006\003\125\004 -\006\023\002\111\124\061\016\060\014\006\003\125\004\007\014\005 -\115\151\154\141\156\061\043\060\041\006\003\125\004\012\014\032 -\101\143\164\141\154\151\163\040\123\056\160\056\101\056\057\060 -\063\063\065\070\065\062\060\071\066\067\061\047\060\045\006\003 -\125\004\003\014\036\101\143\164\141\154\151\163\040\101\165\164 -\150\145\156\164\151\143\141\164\151\157\156\040\122\157\157\164 -\040\103\101\060\036\027\015\061\061\060\071\062\062\061\061\062 -\062\060\062\132\027\015\063\060\060\071\062\062\061\061\062\062 -\060\062\132\060\153\061\013\060\011\006\003\125\004\006\023\002 -\111\124\061\016\060\014\006\003\125\004\007\014\005\115\151\154 -\141\156\061\043\060\041\006\003\125\004\012\014\032\101\143\164 -\141\154\151\163\040\123\056\160\056\101\056\057\060\063\063\065 -\070\065\062\060\071\066\067\061\047\060\045\006\003\125\004\003 -\014\036\101\143\164\141\154\151\163\040\101\165\164\150\145\156 -\164\151\143\141\164\151\157\156\040\122\157\157\164\040\103\101 -\060\202\002\042\060\015\006\011\052\206\110\206\367\015\001\001 -\001\005\000\003\202\002\017\000\060\202\002\012\002\202\002\001 -\000\247\306\304\245\051\244\054\357\345\030\305\260\120\243\157 -\121\073\237\012\132\311\302\110\070\012\302\034\240\030\177\221 -\265\207\271\100\077\335\035\150\037\010\203\325\055\036\210\240 -\370\217\126\217\155\231\002\222\220\026\325\137\010\154\211\327 -\341\254\274\040\302\261\340\203\121\212\151\115\000\226\132\157 -\057\300\104\176\243\016\344\221\315\130\356\334\373\307\036\105 -\107\335\047\271\010\001\237\246\041\035\365\101\055\057\114\375 -\050\255\340\212\255\042\264\126\145\216\206\124\217\223\103\051 -\336\071\106\170\243\060\043\272\315\360\175\023\127\300\135\322 -\203\153\110\114\304\253\237\200\132\133\072\275\311\247\042\077 -\200\047\063\133\016\267\212\014\135\007\067\010\313\154\322\172 -\107\042\104\065\305\314\314\056\216\335\052\355\267\175\146\015 -\137\141\121\042\125\033\343\106\343\343\075\320\065\142\232\333 -\257\024\310\133\241\314\211\033\341\060\046\374\240\233\037\201 -\247\107\037\004\353\243\071\222\006\237\231\323\277\323\352\117 -\120\234\031\376\226\207\036\074\145\366\243\030\044\203\206\020 -\347\124\076\250\072\166\044\117\201\041\305\343\017\002\370\223 -\224\107\040\273\376\324\016\323\150\271\335\304\172\204\202\343 -\123\124\171\335\333\234\322\362\007\233\056\266\274\076\355\205 -\155\357\045\021\362\227\032\102\141\367\112\227\350\213\261\020 -\007\372\145\201\262\242\071\317\367\074\377\030\373\306\361\132 -\213\131\342\002\254\173\222\320\116\024\117\131\105\366\014\136 -\050\137\260\350\077\105\317\317\257\233\157\373\204\323\167\132 -\225\157\254\224\204\236\356\274\300\112\217\112\223\370\104\041 -\342\061\105\141\120\116\020\330\343\065\174\114\031\264\336\005 -\277\243\006\237\310\265\315\344\037\327\027\006\015\172\225\164 -\125\015\150\032\374\020\033\142\144\235\155\340\225\240\303\224 -\007\127\015\024\346\275\005\373\270\237\346\337\213\342\306\347 -\176\226\366\123\305\200\064\120\050\130\360\022\120\161\027\060 -\272\346\170\143\274\364\262\255\233\053\262\376\341\071\214\136 -\272\013\040\224\336\173\203\270\377\343\126\215\267\021\351\073 -\214\362\261\301\135\235\244\013\114\053\331\262\030\365\265\237 -\113\002\003\001\000\001\243\143\060\141\060\035\006\003\125\035 -\016\004\026\004\024\122\330\210\072\310\237\170\146\355\211\363 -\173\070\160\224\311\002\002\066\320\060\017\006\003\125\035\023 -\001\001\377\004\005\060\003\001\001\377\060\037\006\003\125\035 -\043\004\030\060\026\200\024\122\330\210\072\310\237\170\146\355 -\211\363\173\070\160\224\311\002\002\066\320\060\016\006\003\125 -\035\017\001\001\377\004\004\003\002\001\006\060\015\006\011\052 -\206\110\206\367\015\001\001\013\005\000\003\202\002\001\000\013 -\173\162\207\300\140\246\111\114\210\130\346\035\210\367\024\144 -\110\246\330\130\012\016\117\023\065\337\065\035\324\355\006\061 -\310\201\076\152\325\335\073\032\062\356\220\075\021\322\056\364 -\216\303\143\056\043\146\260\147\276\157\266\300\023\071\140\252 -\242\064\045\223\165\122\336\247\235\255\016\207\211\122\161\152 -\026\074\031\035\203\370\232\051\145\276\364\077\232\331\360\363 -\132\207\041\161\200\115\313\340\070\233\077\273\372\340\060\115 -\317\206\323\145\020\031\030\321\227\002\261\053\162\102\150\254 -\240\275\116\132\332\030\277\153\230\201\320\375\232\276\136\025 -\110\315\021\025\271\300\051\134\264\350\210\367\076\066\256\267 -\142\375\036\142\336\160\170\020\034\110\133\332\274\244\070\272 -\147\355\125\076\136\127\337\324\003\100\114\201\244\322\117\143 -\247\011\102\011\024\374\000\251\302\200\163\117\056\300\100\331 -\021\173\110\352\172\002\300\323\353\050\001\046\130\164\301\300 -\163\042\155\223\225\375\071\175\273\052\343\366\202\343\054\227 -\137\116\037\221\224\372\376\054\243\330\166\032\270\115\262\070 -\117\233\372\035\110\140\171\046\342\363\375\251\320\232\350\160 -\217\111\172\326\345\275\012\016\333\055\363\215\277\353\343\244 -\175\313\307\225\161\350\332\243\174\305\302\370\164\222\004\033 -\206\254\244\042\123\100\266\254\376\114\166\317\373\224\062\300 -\065\237\166\077\156\345\220\156\240\246\046\242\270\054\276\321 -\053\205\375\247\150\310\272\001\053\261\154\164\035\270\163\225 -\347\356\267\307\045\360\000\114\000\262\176\266\013\213\034\363 -\300\120\236\045\271\340\010\336\066\146\377\067\245\321\273\124 -\144\054\311\047\265\113\222\176\145\377\323\055\341\271\116\274 -\177\244\101\041\220\101\167\246\071\037\352\236\343\237\320\146 -\157\005\354\252\166\176\277\153\026\240\353\265\307\374\222\124 -\057\053\021\047\045\067\170\114\121\152\260\363\314\130\135\024 -\361\152\110\025\377\302\007\266\261\215\017\216\134\120\106\263 -\075\277\001\230\117\262\131\124\107\076\064\173\170\155\126\223 -\056\163\352\146\050\170\315\035\024\277\240\217\057\056\270\056 -\216\362\024\212\314\351\265\174\373\154\235\014\245\341\226 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Actalis Authentication Root CA" -# Issuer: CN=Actalis Authentication Root CA,O=Actalis S.p.A./03358520967,L=Milan,C=IT -# Serial Number:57:0a:11:97:42:c4:e3:cc -# Subject: CN=Actalis Authentication Root CA,O=Actalis S.p.A./03358520967,L=Milan,C=IT -# Not Valid Before: Thu Sep 22 11:22:02 2011 -# Not Valid After : Sun Sep 22 11:22:02 2030 -# Fingerprint (SHA-256): 55:92:60:84:EC:96:3A:64:B9:6E:2A:BE:01:CE:0B:A8:6A:64:FB:FE:BC:C7:AA:B5:AF:C1:55:B3:7F:D7:60:66 -# Fingerprint (SHA1): F3:73:B3:87:06:5A:28:84:8A:F2:F3:4A:CE:19:2B:DD:C7:8E:9C:AC -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Actalis Authentication Root CA" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\363\163\263\207\006\132\050\204\212\362\363\112\316\031\053\335 -\307\216\234\254 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\151\301\015\117\007\243\033\303\376\126\075\004\274\021\366\246 -END -CKA_ISSUER MULTILINE_OCTAL -\060\153\061\013\060\011\006\003\125\004\006\023\002\111\124\061 -\016\060\014\006\003\125\004\007\014\005\115\151\154\141\156\061 -\043\060\041\006\003\125\004\012\014\032\101\143\164\141\154\151 -\163\040\123\056\160\056\101\056\057\060\063\063\065\070\065\062 -\060\071\066\067\061\047\060\045\006\003\125\004\003\014\036\101 -\143\164\141\154\151\163\040\101\165\164\150\145\156\164\151\143 -\141\164\151\157\156\040\122\157\157\164\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\010\127\012\021\227\102\304\343\314 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Buypass Class 2 Root CA" -# -# Issuer: CN=Buypass Class 2 Root CA,O=Buypass AS-983163327,C=NO -# Serial Number: 2 (0x2) -# Subject: CN=Buypass Class 2 Root CA,O=Buypass AS-983163327,C=NO -# Not Valid Before: Tue Oct 26 08:38:03 2010 -# Not Valid After : Fri Oct 26 08:38:03 2040 -# Fingerprint (SHA-256): 9A:11:40:25:19:7C:5B:B9:5D:94:E6:3D:55:CD:43:79:08:47:B6:46:B2:3C:DF:11:AD:A4:A0:0E:FF:15:FB:48 -# Fingerprint (SHA1): 49:0A:75:74:DE:87:0A:47:FE:58:EE:F6:C7:6B:EB:C6:0B:12:40:99 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Buypass Class 2 Root CA" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\116\061\013\060\011\006\003\125\004\006\023\002\116\117\061 -\035\060\033\006\003\125\004\012\014\024\102\165\171\160\141\163 -\163\040\101\123\055\071\070\063\061\066\063\063\062\067\061\040 -\060\036\006\003\125\004\003\014\027\102\165\171\160\141\163\163 -\040\103\154\141\163\163\040\062\040\122\157\157\164\040\103\101 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\116\061\013\060\011\006\003\125\004\006\023\002\116\117\061 -\035\060\033\006\003\125\004\012\014\024\102\165\171\160\141\163 -\163\040\101\123\055\071\070\063\061\066\063\063\062\067\061\040 -\060\036\006\003\125\004\003\014\027\102\165\171\160\141\163\163 -\040\103\154\141\163\163\040\062\040\122\157\157\164\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\002 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\131\060\202\003\101\240\003\002\001\002\002\001\002 -\060\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060 -\116\061\013\060\011\006\003\125\004\006\023\002\116\117\061\035 -\060\033\006\003\125\004\012\014\024\102\165\171\160\141\163\163 -\040\101\123\055\071\070\063\061\066\063\063\062\067\061\040\060 -\036\006\003\125\004\003\014\027\102\165\171\160\141\163\163\040 -\103\154\141\163\163\040\062\040\122\157\157\164\040\103\101\060 -\036\027\015\061\060\061\060\062\066\060\070\063\070\060\063\132 -\027\015\064\060\061\060\062\066\060\070\063\070\060\063\132\060 -\116\061\013\060\011\006\003\125\004\006\023\002\116\117\061\035 -\060\033\006\003\125\004\012\014\024\102\165\171\160\141\163\163 -\040\101\123\055\071\070\063\061\066\063\063\062\067\061\040\060 -\036\006\003\125\004\003\014\027\102\165\171\160\141\163\163\040 -\103\154\141\163\163\040\062\040\122\157\157\164\040\103\101\060 -\202\002\042\060\015\006\011\052\206\110\206\367\015\001\001\001 -\005\000\003\202\002\017\000\060\202\002\012\002\202\002\001\000 -\327\307\136\367\301\007\324\167\373\103\041\364\364\365\151\344 -\356\062\001\333\243\206\037\344\131\015\272\347\165\203\122\353 -\352\034\141\025\110\273\035\007\312\214\256\260\334\226\235\352 -\303\140\222\206\202\050\163\234\126\006\377\113\144\360\014\052 -\067\111\265\345\317\014\174\356\361\112\273\163\060\145\363\325 -\057\203\266\176\343\347\365\236\253\140\371\323\361\235\222\164 -\212\344\034\226\254\133\200\351\265\364\061\207\243\121\374\307 -\176\241\157\216\123\167\324\227\301\125\063\222\076\030\057\165 -\324\255\206\111\313\225\257\124\006\154\330\006\023\215\133\377 -\341\046\031\131\300\044\272\201\161\171\220\104\120\150\044\224 -\137\270\263\021\361\051\101\141\243\101\313\043\066\325\301\361 -\062\120\020\116\177\364\206\223\354\204\323\216\274\113\277\134 -\001\116\007\075\334\024\212\224\012\244\352\163\373\013\121\350 -\023\007\030\372\016\361\053\321\124\025\175\074\341\367\264\031 -\102\147\142\136\167\340\242\125\354\266\331\151\027\325\072\257 -\104\355\112\305\236\344\172\047\174\345\165\327\252\313\045\347 -\337\153\012\333\017\115\223\116\250\240\315\173\056\362\131\001 -\152\267\015\270\007\201\176\213\070\033\070\346\012\127\231\075 -\356\041\350\243\365\014\026\335\213\354\064\216\234\052\034\000 -\025\027\215\150\203\322\160\237\030\010\315\021\150\325\311\153 -\122\315\304\106\217\334\265\363\330\127\163\036\351\224\071\004 -\277\323\336\070\336\264\123\354\151\034\242\176\304\217\344\033 -\160\255\362\242\371\373\367\026\144\146\151\237\111\121\242\342 -\025\030\147\006\112\177\325\154\265\115\263\063\340\141\353\135 -\276\351\230\017\062\327\035\113\074\056\132\001\122\221\011\362 -\337\352\215\330\006\100\143\252\021\344\376\303\067\236\024\122 -\077\364\342\314\362\141\223\321\375\147\153\327\122\256\277\150 -\253\100\103\240\127\065\123\170\360\123\370\141\102\007\144\306 -\327\157\233\114\070\015\143\254\142\257\066\213\242\163\012\015 -\365\041\275\164\252\115\352\162\003\111\333\307\137\035\142\143 -\307\375\335\221\354\063\356\365\155\264\156\060\150\336\310\326 -\046\260\165\136\173\264\007\040\230\241\166\062\270\115\154\117 -\002\003\001\000\001\243\102\060\100\060\017\006\003\125\035\023 -\001\001\377\004\005\060\003\001\001\377\060\035\006\003\125\035 -\016\004\026\004\024\311\200\167\340\142\222\202\365\106\234\363 -\272\367\114\303\336\270\243\255\071\060\016\006\003\125\035\017 -\001\001\377\004\004\003\002\001\006\060\015\006\011\052\206\110 -\206\367\015\001\001\013\005\000\003\202\002\001\000\123\137\041 -\365\272\260\072\122\071\054\222\260\154\000\311\357\316\040\357 -\006\362\226\236\351\244\164\177\172\026\374\267\365\266\373\025 -\033\077\253\246\300\162\135\020\261\161\356\274\117\343\255\254 -\003\155\056\161\056\257\304\343\255\243\275\014\021\247\264\377 -\112\262\173\020\020\037\247\127\101\262\300\256\364\054\131\326 -\107\020\210\363\041\121\051\060\312\140\206\257\106\253\035\355 -\072\133\260\224\336\104\343\101\010\242\301\354\035\326\375\117 -\266\326\107\320\024\013\312\346\312\265\173\167\176\101\037\136 -\203\307\266\214\071\226\260\077\226\201\101\157\140\220\342\350 -\371\373\042\161\331\175\263\075\106\277\264\204\257\220\034\017 -\217\022\152\257\357\356\036\172\256\002\112\212\027\053\166\376 -\254\124\211\044\054\117\077\266\262\247\116\214\250\221\227\373 -\051\306\173\134\055\271\313\146\266\267\250\133\022\121\205\265 -\011\176\142\170\160\376\251\152\140\266\035\016\171\014\375\312 -\352\044\200\162\303\227\077\362\167\253\103\042\012\307\353\266 -\014\204\202\054\200\153\101\212\010\300\353\245\153\337\231\022 -\313\212\325\136\200\014\221\340\046\010\066\110\305\372\070\021 -\065\377\045\203\055\362\172\277\332\375\216\376\245\313\105\054 -\037\304\210\123\256\167\016\331\232\166\305\216\054\035\243\272 -\325\354\062\256\300\252\254\367\321\172\115\353\324\007\342\110 -\367\042\216\260\244\237\152\316\216\262\262\140\364\243\042\320 -\043\353\224\132\172\151\335\017\277\100\127\254\153\131\120\331 -\243\231\341\156\376\215\001\171\047\043\025\336\222\235\173\011 -\115\132\347\113\110\060\132\030\346\012\155\346\217\340\322\273 -\346\337\174\156\041\202\301\150\071\115\264\230\130\146\142\314 -\112\220\136\303\372\047\004\261\171\025\164\231\314\276\255\040 -\336\046\140\034\353\126\121\246\243\352\344\243\077\247\377\141 -\334\361\132\115\154\062\043\103\356\254\250\356\356\112\022\011 -\074\135\161\302\276\171\372\302\207\150\035\013\375\134\151\314 -\006\320\232\175\124\231\052\311\071\032\031\257\113\052\103\363 -\143\135\132\130\342\057\343\035\344\251\326\320\012\320\236\277 -\327\201\011\361\311\307\046\015\254\230\026\126\240 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Buypass Class 2 Root CA" -# Issuer: CN=Buypass Class 2 Root CA,O=Buypass AS-983163327,C=NO -# Serial Number: 2 (0x2) -# Subject: CN=Buypass Class 2 Root CA,O=Buypass AS-983163327,C=NO -# Not Valid Before: Tue Oct 26 08:38:03 2010 -# Not Valid After : Fri Oct 26 08:38:03 2040 -# Fingerprint (SHA-256): 9A:11:40:25:19:7C:5B:B9:5D:94:E6:3D:55:CD:43:79:08:47:B6:46:B2:3C:DF:11:AD:A4:A0:0E:FF:15:FB:48 -# Fingerprint (SHA1): 49:0A:75:74:DE:87:0A:47:FE:58:EE:F6:C7:6B:EB:C6:0B:12:40:99 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Buypass Class 2 Root CA" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\111\012\165\164\336\207\012\107\376\130\356\366\307\153\353\306 -\013\022\100\231 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\106\247\322\376\105\373\144\132\250\131\220\233\170\104\233\051 -END -CKA_ISSUER MULTILINE_OCTAL -\060\116\061\013\060\011\006\003\125\004\006\023\002\116\117\061 -\035\060\033\006\003\125\004\012\014\024\102\165\171\160\141\163 -\163\040\101\123\055\071\070\063\061\066\063\063\062\067\061\040 -\060\036\006\003\125\004\003\014\027\102\165\171\160\141\163\163 -\040\103\154\141\163\163\040\062\040\122\157\157\164\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\002 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Buypass Class 3 Root CA" -# -# Issuer: CN=Buypass Class 3 Root CA,O=Buypass AS-983163327,C=NO -# Serial Number: 2 (0x2) -# Subject: CN=Buypass Class 3 Root CA,O=Buypass AS-983163327,C=NO -# Not Valid Before: Tue Oct 26 08:28:58 2010 -# Not Valid After : Fri Oct 26 08:28:58 2040 -# Fingerprint (SHA-256): ED:F7:EB:BC:A2:7A:2A:38:4D:38:7B:7D:40:10:C6:66:E2:ED:B4:84:3E:4C:29:B4:AE:1D:5B:93:32:E6:B2:4D -# Fingerprint (SHA1): DA:FA:F7:FA:66:84:EC:06:8F:14:50:BD:C7:C2:81:A5:BC:A9:64:57 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Buypass Class 3 Root CA" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\116\061\013\060\011\006\003\125\004\006\023\002\116\117\061 -\035\060\033\006\003\125\004\012\014\024\102\165\171\160\141\163 -\163\040\101\123\055\071\070\063\061\066\063\063\062\067\061\040 -\060\036\006\003\125\004\003\014\027\102\165\171\160\141\163\163 -\040\103\154\141\163\163\040\063\040\122\157\157\164\040\103\101 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\116\061\013\060\011\006\003\125\004\006\023\002\116\117\061 -\035\060\033\006\003\125\004\012\014\024\102\165\171\160\141\163 -\163\040\101\123\055\071\070\063\061\066\063\063\062\067\061\040 -\060\036\006\003\125\004\003\014\027\102\165\171\160\141\163\163 -\040\103\154\141\163\163\040\063\040\122\157\157\164\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\002 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\131\060\202\003\101\240\003\002\001\002\002\001\002 -\060\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060 -\116\061\013\060\011\006\003\125\004\006\023\002\116\117\061\035 -\060\033\006\003\125\004\012\014\024\102\165\171\160\141\163\163 -\040\101\123\055\071\070\063\061\066\063\063\062\067\061\040\060 -\036\006\003\125\004\003\014\027\102\165\171\160\141\163\163\040 -\103\154\141\163\163\040\063\040\122\157\157\164\040\103\101\060 -\036\027\015\061\060\061\060\062\066\060\070\062\070\065\070\132 -\027\015\064\060\061\060\062\066\060\070\062\070\065\070\132\060 -\116\061\013\060\011\006\003\125\004\006\023\002\116\117\061\035 -\060\033\006\003\125\004\012\014\024\102\165\171\160\141\163\163 -\040\101\123\055\071\070\063\061\066\063\063\062\067\061\040\060 -\036\006\003\125\004\003\014\027\102\165\171\160\141\163\163\040 -\103\154\141\163\163\040\063\040\122\157\157\164\040\103\101\060 -\202\002\042\060\015\006\011\052\206\110\206\367\015\001\001\001 -\005\000\003\202\002\017\000\060\202\002\012\002\202\002\001\000 -\245\332\012\225\026\120\343\225\362\136\235\166\061\006\062\172 -\233\361\020\166\270\000\232\265\122\066\315\044\107\260\237\030 -\144\274\232\366\372\325\171\330\220\142\114\042\057\336\070\075 -\326\340\250\351\034\054\333\170\021\351\216\150\121\025\162\307 -\363\063\207\344\240\135\013\134\340\127\007\052\060\365\315\304 -\067\167\050\115\030\221\346\277\325\122\375\161\055\160\076\347 -\306\304\212\343\360\050\013\364\166\230\241\213\207\125\262\072 -\023\374\267\076\047\067\216\042\343\250\117\052\357\140\273\075 -\267\071\303\016\001\107\231\135\022\117\333\103\372\127\241\355 -\371\235\276\021\107\046\133\023\230\253\135\026\212\260\067\034 -\127\235\105\377\210\226\066\277\273\312\007\173\157\207\143\327 -\320\062\152\326\135\154\014\361\263\156\071\342\153\061\056\071 -\000\047\024\336\070\300\354\031\146\206\022\350\235\162\026\023 -\144\122\307\251\067\034\375\202\060\355\204\030\035\364\256\134 -\377\160\023\000\353\261\365\063\172\113\326\125\370\005\215\113 -\151\260\365\263\050\066\134\024\304\121\163\115\153\013\361\064 -\007\333\027\071\327\334\050\173\153\365\237\363\056\301\117\027 -\052\020\363\314\312\350\353\375\153\253\056\232\237\055\202\156 -\004\324\122\001\223\055\075\206\374\176\374\337\357\102\035\246 -\153\357\271\040\306\367\275\240\247\225\375\247\346\211\044\330 -\314\214\064\154\342\043\057\331\022\032\041\271\125\221\157\013 -\221\171\031\014\255\100\210\013\160\342\172\322\016\330\150\110 -\273\202\023\071\020\130\351\330\052\007\306\022\333\130\333\322 -\073\125\020\107\005\025\147\142\176\030\143\246\106\077\011\016 -\124\062\136\277\015\142\172\047\357\200\350\333\331\113\006\132 -\067\132\045\320\010\022\167\324\157\011\120\227\075\310\035\303 -\337\214\105\060\126\306\323\144\253\146\363\300\136\226\234\303 -\304\357\303\174\153\213\072\171\177\263\111\317\075\342\211\237 -\240\060\113\205\271\234\224\044\171\217\175\153\251\105\150\017 -\053\320\361\332\034\313\151\270\312\111\142\155\310\320\143\142 -\335\140\017\130\252\217\241\274\005\245\146\242\317\033\166\262 -\204\144\261\114\071\122\300\060\272\360\214\113\002\260\266\267 -\002\003\001\000\001\243\102\060\100\060\017\006\003\125\035\023 -\001\001\377\004\005\060\003\001\001\377\060\035\006\003\125\035 -\016\004\026\004\024\107\270\315\377\345\157\356\370\262\354\057 -\116\016\371\045\260\216\074\153\303\060\016\006\003\125\035\017 -\001\001\377\004\004\003\002\001\006\060\015\006\011\052\206\110 -\206\367\015\001\001\013\005\000\003\202\002\001\000\000\040\043 -\101\065\004\220\302\100\142\140\357\342\065\114\327\077\254\342 -\064\220\270\241\157\166\372\026\026\244\110\067\054\351\220\302 -\362\074\370\012\237\330\201\345\273\133\332\045\054\244\247\125 -\161\044\062\366\310\013\362\274\152\370\223\254\262\007\302\137 -\237\333\314\310\212\252\276\152\157\341\111\020\314\061\327\200 -\273\273\310\330\242\016\144\127\352\242\365\302\251\061\025\322 -\040\152\354\374\042\001\050\317\206\270\200\036\251\314\021\245 -\074\362\026\263\107\235\374\322\200\041\304\313\320\107\160\101 -\241\312\203\031\010\054\155\362\135\167\234\212\024\023\324\066 -\034\222\360\345\006\067\334\246\346\220\233\070\217\134\153\033 -\106\206\103\102\137\076\001\007\123\124\135\145\175\367\212\163 -\241\232\124\132\037\051\103\024\047\302\205\017\265\210\173\032 -\073\224\267\035\140\247\265\234\347\051\151\127\132\233\223\172 -\103\060\033\003\327\142\310\100\246\252\374\144\344\112\327\221 -\123\001\250\040\210\156\234\137\104\271\313\140\201\064\354\157 -\323\175\332\110\137\353\264\220\274\055\251\034\013\254\034\325 -\242\150\040\200\004\326\374\261\217\057\273\112\061\015\112\206 -\034\353\342\066\051\046\365\332\330\304\362\165\141\317\176\256 -\166\143\112\172\100\145\223\207\370\036\200\214\206\345\206\326 -\217\016\374\123\054\140\350\026\141\032\242\076\103\173\315\071 -\140\124\152\365\362\211\046\001\150\203\110\242\063\350\311\004 -\221\262\021\064\021\076\352\320\103\031\037\003\223\220\014\377 -\121\075\127\364\101\156\341\313\240\276\353\311\143\315\155\314 -\344\370\066\252\150\235\355\275\135\227\160\104\015\266\016\065 -\334\341\014\135\273\240\121\224\313\176\026\353\021\057\243\222 -\105\310\114\161\331\274\311\231\122\127\106\057\120\317\275\065 -\151\364\075\025\316\006\245\054\017\076\366\201\272\224\273\303 -\273\277\145\170\322\206\171\377\111\073\032\203\014\360\336\170 -\354\310\362\115\114\032\336\202\051\370\301\132\332\355\356\346 -\047\136\350\105\320\235\034\121\250\150\253\104\343\320\213\152 -\343\370\073\273\334\115\327\144\362\121\276\346\252\253\132\351 -\061\356\006\274\163\277\023\142\012\237\307\271\227 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Buypass Class 3 Root CA" -# Issuer: CN=Buypass Class 3 Root CA,O=Buypass AS-983163327,C=NO -# Serial Number: 2 (0x2) -# Subject: CN=Buypass Class 3 Root CA,O=Buypass AS-983163327,C=NO -# Not Valid Before: Tue Oct 26 08:28:58 2010 -# Not Valid After : Fri Oct 26 08:28:58 2040 -# Fingerprint (SHA-256): ED:F7:EB:BC:A2:7A:2A:38:4D:38:7B:7D:40:10:C6:66:E2:ED:B4:84:3E:4C:29:B4:AE:1D:5B:93:32:E6:B2:4D -# Fingerprint (SHA1): DA:FA:F7:FA:66:84:EC:06:8F:14:50:BD:C7:C2:81:A5:BC:A9:64:57 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Buypass Class 3 Root CA" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\332\372\367\372\146\204\354\006\217\024\120\275\307\302\201\245 -\274\251\144\127 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\075\073\030\236\054\144\132\350\325\210\316\016\371\067\302\354 -END -CKA_ISSUER MULTILINE_OCTAL -\060\116\061\013\060\011\006\003\125\004\006\023\002\116\117\061 -\035\060\033\006\003\125\004\012\014\024\102\165\171\160\141\163 -\163\040\101\123\055\071\070\063\061\066\063\063\062\067\061\040 -\060\036\006\003\125\004\003\014\027\102\165\171\160\141\163\163 -\040\103\154\141\163\163\040\063\040\122\157\157\164\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\002 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "T-TeleSec GlobalRoot Class 3" -# -# Issuer: CN=T-TeleSec GlobalRoot Class 3,OU=T-Systems Trust Center,O=T-Systems Enterprise Services GmbH,C=DE -# Serial Number: 1 (0x1) -# Subject: CN=T-TeleSec GlobalRoot Class 3,OU=T-Systems Trust Center,O=T-Systems Enterprise Services GmbH,C=DE -# Not Valid Before: Wed Oct 01 10:29:56 2008 -# Not Valid After : Sat Oct 01 23:59:59 2033 -# Fingerprint (SHA-256): FD:73:DA:D3:1C:64:4F:F1:B4:3B:EF:0C:CD:DA:96:71:0B:9C:D9:87:5E:CA:7E:31:70:7A:F3:E9:6D:52:2B:BD -# Fingerprint (SHA1): 55:A6:72:3E:CB:F2:EC:CD:C3:23:74:70:19:9D:2A:BE:11:E3:81:D1 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "T-TeleSec GlobalRoot Class 3" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\201\202\061\013\060\011\006\003\125\004\006\023\002\104\105 -\061\053\060\051\006\003\125\004\012\014\042\124\055\123\171\163 -\164\145\155\163\040\105\156\164\145\162\160\162\151\163\145\040 -\123\145\162\166\151\143\145\163\040\107\155\142\110\061\037\060 -\035\006\003\125\004\013\014\026\124\055\123\171\163\164\145\155 -\163\040\124\162\165\163\164\040\103\145\156\164\145\162\061\045 -\060\043\006\003\125\004\003\014\034\124\055\124\145\154\145\123 -\145\143\040\107\154\157\142\141\154\122\157\157\164\040\103\154 -\141\163\163\040\063 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\201\202\061\013\060\011\006\003\125\004\006\023\002\104\105 -\061\053\060\051\006\003\125\004\012\014\042\124\055\123\171\163 -\164\145\155\163\040\105\156\164\145\162\160\162\151\163\145\040 -\123\145\162\166\151\143\145\163\040\107\155\142\110\061\037\060 -\035\006\003\125\004\013\014\026\124\055\123\171\163\164\145\155 -\163\040\124\162\165\163\164\040\103\145\156\164\145\162\061\045 -\060\043\006\003\125\004\003\014\034\124\055\124\145\154\145\123 -\145\143\040\107\154\157\142\141\154\122\157\157\164\040\103\154 -\141\163\163\040\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\001 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\003\303\060\202\002\253\240\003\002\001\002\002\001\001 -\060\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060 -\201\202\061\013\060\011\006\003\125\004\006\023\002\104\105\061 -\053\060\051\006\003\125\004\012\014\042\124\055\123\171\163\164 -\145\155\163\040\105\156\164\145\162\160\162\151\163\145\040\123 -\145\162\166\151\143\145\163\040\107\155\142\110\061\037\060\035 -\006\003\125\004\013\014\026\124\055\123\171\163\164\145\155\163 -\040\124\162\165\163\164\040\103\145\156\164\145\162\061\045\060 -\043\006\003\125\004\003\014\034\124\055\124\145\154\145\123\145 -\143\040\107\154\157\142\141\154\122\157\157\164\040\103\154\141 -\163\163\040\063\060\036\027\015\060\070\061\060\060\061\061\060 -\062\071\065\066\132\027\015\063\063\061\060\060\061\062\063\065 -\071\065\071\132\060\201\202\061\013\060\011\006\003\125\004\006 -\023\002\104\105\061\053\060\051\006\003\125\004\012\014\042\124 -\055\123\171\163\164\145\155\163\040\105\156\164\145\162\160\162 -\151\163\145\040\123\145\162\166\151\143\145\163\040\107\155\142 -\110\061\037\060\035\006\003\125\004\013\014\026\124\055\123\171 -\163\164\145\155\163\040\124\162\165\163\164\040\103\145\156\164 -\145\162\061\045\060\043\006\003\125\004\003\014\034\124\055\124 -\145\154\145\123\145\143\040\107\154\157\142\141\154\122\157\157 -\164\040\103\154\141\163\163\040\063\060\202\001\042\060\015\006 -\011\052\206\110\206\367\015\001\001\001\005\000\003\202\001\017 -\000\060\202\001\012\002\202\001\001\000\275\165\223\360\142\042 -\157\044\256\340\172\166\254\175\275\331\044\325\270\267\374\315 -\360\102\340\353\170\210\126\136\233\232\124\035\115\014\212\366 -\323\317\160\364\122\265\330\223\004\343\106\206\161\101\112\053 -\360\052\054\125\003\326\110\303\340\071\070\355\362\134\074\077 -\104\274\223\075\141\253\116\315\015\276\360\040\047\130\016\104 -\177\004\032\207\245\327\226\024\066\220\320\111\173\241\165\373 -\032\153\163\261\370\316\251\011\054\362\123\325\303\024\104\270 -\206\245\366\213\053\071\332\243\063\124\331\372\162\032\367\042 -\025\034\210\221\153\177\146\345\303\152\200\260\044\363\337\206 -\105\210\375\031\177\165\207\037\037\261\033\012\163\044\133\271 -\145\340\054\124\310\140\323\146\027\077\341\314\124\063\163\221 -\002\072\246\177\173\166\071\242\037\226\266\070\256\265\310\223 -\164\035\236\271\264\345\140\235\057\126\321\340\353\136\133\114 -\022\160\014\154\104\040\253\021\330\364\031\366\322\234\122\067 -\347\372\266\302\061\073\112\324\024\231\255\307\032\365\135\137 -\372\007\270\174\015\037\326\203\036\263\002\003\001\000\001\243 -\102\060\100\060\017\006\003\125\035\023\001\001\377\004\005\060 -\003\001\001\377\060\016\006\003\125\035\017\001\001\377\004\004 -\003\002\001\006\060\035\006\003\125\035\016\004\026\004\024\265 -\003\367\166\073\141\202\152\022\252\030\123\353\003\041\224\277 -\376\316\312\060\015\006\011\052\206\110\206\367\015\001\001\013 -\005\000\003\202\001\001\000\126\075\357\224\325\275\332\163\262 -\130\276\256\220\255\230\047\227\376\001\261\260\122\000\270\115 -\344\033\041\164\033\176\300\356\136\151\052\045\257\134\326\035 -\332\322\171\311\363\227\051\340\206\207\336\004\131\017\361\131 -\324\144\205\113\231\257\045\004\036\311\106\251\227\336\202\262 -\033\160\237\234\366\257\161\061\335\173\005\245\054\323\271\312 -\107\366\312\362\366\347\255\271\110\077\274\026\267\301\155\364 -\352\011\257\354\363\265\347\005\236\246\036\212\123\121\326\223 -\201\314\164\223\366\271\332\246\045\005\164\171\132\176\100\076 -\202\113\046\021\060\156\341\077\101\307\107\000\065\325\365\323 -\367\124\076\201\075\332\111\152\232\263\357\020\075\346\353\157 -\321\310\042\107\313\314\317\001\061\222\331\030\343\042\276\011 -\036\032\076\132\262\344\153\014\124\172\175\103\116\270\211\245 -\173\327\242\075\226\206\314\362\046\064\055\152\222\235\232\032 -\320\060\342\135\116\004\260\137\213\040\176\167\301\075\225\202 -\321\106\232\073\074\170\270\157\241\320\015\144\242\170\036\051 -\116\223\303\244\124\024\133 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "T-TeleSec GlobalRoot Class 3" -# Issuer: CN=T-TeleSec GlobalRoot Class 3,OU=T-Systems Trust Center,O=T-Systems Enterprise Services GmbH,C=DE -# Serial Number: 1 (0x1) -# Subject: CN=T-TeleSec GlobalRoot Class 3,OU=T-Systems Trust Center,O=T-Systems Enterprise Services GmbH,C=DE -# Not Valid Before: Wed Oct 01 10:29:56 2008 -# Not Valid After : Sat Oct 01 23:59:59 2033 -# Fingerprint (SHA-256): FD:73:DA:D3:1C:64:4F:F1:B4:3B:EF:0C:CD:DA:96:71:0B:9C:D9:87:5E:CA:7E:31:70:7A:F3:E9:6D:52:2B:BD -# Fingerprint (SHA1): 55:A6:72:3E:CB:F2:EC:CD:C3:23:74:70:19:9D:2A:BE:11:E3:81:D1 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "T-TeleSec GlobalRoot Class 3" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\125\246\162\076\313\362\354\315\303\043\164\160\031\235\052\276 -\021\343\201\321 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\312\373\100\250\116\071\222\212\035\376\216\057\304\047\352\357 -END -CKA_ISSUER MULTILINE_OCTAL -\060\201\202\061\013\060\011\006\003\125\004\006\023\002\104\105 -\061\053\060\051\006\003\125\004\012\014\042\124\055\123\171\163 -\164\145\155\163\040\105\156\164\145\162\160\162\151\163\145\040 -\123\145\162\166\151\143\145\163\040\107\155\142\110\061\037\060 -\035\006\003\125\004\013\014\026\124\055\123\171\163\164\145\155 -\163\040\124\162\165\163\164\040\103\145\156\164\145\162\061\045 -\060\043\006\003\125\004\003\014\034\124\055\124\145\154\145\123 -\145\143\040\107\154\157\142\141\154\122\157\157\164\040\103\154 -\141\163\163\040\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\001 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "D-TRUST Root Class 3 CA 2 2009" -# -# Issuer: CN=D-TRUST Root Class 3 CA 2 2009,O=D-Trust GmbH,C=DE -# Serial Number: 623603 (0x983f3) -# Subject: CN=D-TRUST Root Class 3 CA 2 2009,O=D-Trust GmbH,C=DE -# Not Valid Before: Thu Nov 05 08:35:58 2009 -# Not Valid After : Mon Nov 05 08:35:58 2029 -# Fingerprint (SHA-256): 49:E7:A4:42:AC:F0:EA:62:87:05:00:54:B5:25:64:B6:50:E4:F4:9E:42:E3:48:D6:AA:38:E0:39:E9:57:B1:C1 -# Fingerprint (SHA1): 58:E8:AB:B0:36:15:33:FB:80:F7:9B:1B:6D:29:D3:FF:8D:5F:00:F0 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "D-TRUST Root Class 3 CA 2 2009" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\115\061\013\060\011\006\003\125\004\006\023\002\104\105\061 -\025\060\023\006\003\125\004\012\014\014\104\055\124\162\165\163 -\164\040\107\155\142\110\061\047\060\045\006\003\125\004\003\014 -\036\104\055\124\122\125\123\124\040\122\157\157\164\040\103\154 -\141\163\163\040\063\040\103\101\040\062\040\062\060\060\071 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\115\061\013\060\011\006\003\125\004\006\023\002\104\105\061 -\025\060\023\006\003\125\004\012\014\014\104\055\124\162\165\163 -\164\040\107\155\142\110\061\047\060\045\006\003\125\004\003\014 -\036\104\055\124\122\125\123\124\040\122\157\157\164\040\103\154 -\141\163\163\040\063\040\103\101\040\062\040\062\060\060\071 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\003\011\203\363 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\004\063\060\202\003\033\240\003\002\001\002\002\003\011 -\203\363\060\015\006\011\052\206\110\206\367\015\001\001\013\005 -\000\060\115\061\013\060\011\006\003\125\004\006\023\002\104\105 -\061\025\060\023\006\003\125\004\012\014\014\104\055\124\162\165 -\163\164\040\107\155\142\110\061\047\060\045\006\003\125\004\003 -\014\036\104\055\124\122\125\123\124\040\122\157\157\164\040\103 -\154\141\163\163\040\063\040\103\101\040\062\040\062\060\060\071 -\060\036\027\015\060\071\061\061\060\065\060\070\063\065\065\070 -\132\027\015\062\071\061\061\060\065\060\070\063\065\065\070\132 -\060\115\061\013\060\011\006\003\125\004\006\023\002\104\105\061 -\025\060\023\006\003\125\004\012\014\014\104\055\124\162\165\163 -\164\040\107\155\142\110\061\047\060\045\006\003\125\004\003\014 -\036\104\055\124\122\125\123\124\040\122\157\157\164\040\103\154 -\141\163\163\040\063\040\103\101\040\062\040\062\060\060\071\060 -\202\001\042\060\015\006\011\052\206\110\206\367\015\001\001\001 -\005\000\003\202\001\017\000\060\202\001\012\002\202\001\001\000 -\323\262\112\317\172\107\357\165\233\043\372\072\057\326\120\105 -\211\065\072\306\153\333\376\333\000\150\250\340\003\021\035\067 -\120\010\237\115\112\150\224\065\263\123\321\224\143\247\040\126 -\257\336\121\170\354\052\075\363\110\110\120\076\012\337\106\125 -\213\047\155\303\020\115\015\221\122\103\330\207\340\135\116\066 -\265\041\312\137\071\100\004\137\133\176\314\243\306\053\251\100 -\036\331\066\204\326\110\363\222\036\064\106\040\044\301\244\121 -\216\112\032\357\120\077\151\135\031\177\105\303\307\001\217\121 -\311\043\350\162\256\264\274\126\011\177\022\313\034\261\257\051 -\220\012\311\125\314\017\323\264\032\355\107\065\132\112\355\234 -\163\004\041\320\252\275\014\023\265\000\312\046\154\304\153\014 -\224\132\225\224\332\120\232\361\377\245\053\146\061\244\311\070 -\240\337\035\037\270\011\056\363\247\350\147\122\253\225\037\340 -\106\076\330\244\303\312\132\305\061\200\350\110\232\237\224\151 -\376\031\335\330\163\174\201\312\226\336\216\355\263\062\005\145 -\204\064\346\346\375\127\020\265\137\166\277\057\260\020\015\305 -\002\003\001\000\001\243\202\001\032\060\202\001\026\060\017\006 -\003\125\035\023\001\001\377\004\005\060\003\001\001\377\060\035 -\006\003\125\035\016\004\026\004\024\375\332\024\304\237\060\336 -\041\275\036\102\071\374\253\143\043\111\340\361\204\060\016\006 -\003\125\035\017\001\001\377\004\004\003\002\001\006\060\201\323 -\006\003\125\035\037\004\201\313\060\201\310\060\201\200\240\176 -\240\174\206\172\154\144\141\160\072\057\057\144\151\162\145\143 -\164\157\162\171\056\144\055\164\162\165\163\164\056\156\145\164 -\057\103\116\075\104\055\124\122\125\123\124\045\062\060\122\157 -\157\164\045\062\060\103\154\141\163\163\045\062\060\063\045\062 -\060\103\101\045\062\060\062\045\062\060\062\060\060\071\054\117 -\075\104\055\124\162\165\163\164\045\062\060\107\155\142\110\054 -\103\075\104\105\077\143\145\162\164\151\146\151\143\141\164\145 -\162\145\166\157\143\141\164\151\157\156\154\151\163\164\060\103 -\240\101\240\077\206\075\150\164\164\160\072\057\057\167\167\167 -\056\144\055\164\162\165\163\164\056\156\145\164\057\143\162\154 -\057\144\055\164\162\165\163\164\137\162\157\157\164\137\143\154 -\141\163\163\137\063\137\143\141\137\062\137\062\060\060\071\056 -\143\162\154\060\015\006\011\052\206\110\206\367\015\001\001\013 -\005\000\003\202\001\001\000\177\227\333\060\310\337\244\234\175 -\041\172\200\160\316\024\022\151\210\024\225\140\104\001\254\262 -\351\060\117\233\120\302\146\330\176\215\060\265\160\061\351\342 -\151\307\363\160\333\040\025\206\320\015\360\276\254\001\165\204 -\316\176\237\115\277\267\140\073\234\363\312\035\342\136\150\330 -\243\235\227\345\100\140\322\066\041\376\320\264\270\027\332\164 -\243\177\324\337\260\230\002\254\157\153\153\054\045\044\162\241 -\145\356\045\132\345\346\062\347\362\337\253\111\372\363\220\151 -\043\333\004\331\347\134\130\374\145\324\227\276\314\374\056\012 -\314\045\052\065\004\370\140\221\025\165\075\101\377\043\037\031 -\310\154\353\202\123\004\246\344\114\042\115\215\214\272\316\133 -\163\354\144\124\120\155\321\234\125\373\151\303\066\303\214\274 -\074\205\246\153\012\046\015\340\223\230\140\256\176\306\044\227 -\212\141\137\221\216\146\222\011\207\066\315\213\233\055\076\366 -\121\324\120\324\131\050\275\203\362\314\050\173\123\206\155\330 -\046\210\160\327\352\221\315\076\271\312\300\220\156\132\306\136 -\164\145\327\134\376\243\342 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "D-TRUST Root Class 3 CA 2 2009" -# Issuer: CN=D-TRUST Root Class 3 CA 2 2009,O=D-Trust GmbH,C=DE -# Serial Number: 623603 (0x983f3) -# Subject: CN=D-TRUST Root Class 3 CA 2 2009,O=D-Trust GmbH,C=DE -# Not Valid Before: Thu Nov 05 08:35:58 2009 -# Not Valid After : Mon Nov 05 08:35:58 2029 -# Fingerprint (SHA-256): 49:E7:A4:42:AC:F0:EA:62:87:05:00:54:B5:25:64:B6:50:E4:F4:9E:42:E3:48:D6:AA:38:E0:39:E9:57:B1:C1 -# Fingerprint (SHA1): 58:E8:AB:B0:36:15:33:FB:80:F7:9B:1B:6D:29:D3:FF:8D:5F:00:F0 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "D-TRUST Root Class 3 CA 2 2009" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\130\350\253\260\066\025\063\373\200\367\233\033\155\051\323\377 -\215\137\000\360 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\315\340\045\151\215\107\254\234\211\065\220\367\375\121\075\057 -END -CKA_ISSUER MULTILINE_OCTAL -\060\115\061\013\060\011\006\003\125\004\006\023\002\104\105\061 -\025\060\023\006\003\125\004\012\014\014\104\055\124\162\165\163 -\164\040\107\155\142\110\061\047\060\045\006\003\125\004\003\014 -\036\104\055\124\122\125\123\124\040\122\157\157\164\040\103\154 -\141\163\163\040\063\040\103\101\040\062\040\062\060\060\071 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\003\011\203\363 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "D-TRUST Root Class 3 CA 2 EV 2009" -# -# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009,O=D-Trust GmbH,C=DE -# Serial Number: 623604 (0x983f4) -# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009,O=D-Trust GmbH,C=DE -# Not Valid Before: Thu Nov 05 08:50:46 2009 -# Not Valid After : Mon Nov 05 08:50:46 2029 -# Fingerprint (SHA-256): EE:C5:49:6B:98:8C:E9:86:25:B9:34:09:2E:EC:29:08:BE:D0:B0:F3:16:C2:D4:73:0C:84:EA:F1:F3:D3:48:81 -# Fingerprint (SHA1): 96:C9:1B:0B:95:B4:10:98:42:FA:D0:D8:22:79:FE:60:FA:B9:16:83 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "D-TRUST Root Class 3 CA 2 EV 2009" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\120\061\013\060\011\006\003\125\004\006\023\002\104\105\061 -\025\060\023\006\003\125\004\012\014\014\104\055\124\162\165\163 -\164\040\107\155\142\110\061\052\060\050\006\003\125\004\003\014 -\041\104\055\124\122\125\123\124\040\122\157\157\164\040\103\154 -\141\163\163\040\063\040\103\101\040\062\040\105\126\040\062\060 -\060\071 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\120\061\013\060\011\006\003\125\004\006\023\002\104\105\061 -\025\060\023\006\003\125\004\012\014\014\104\055\124\162\165\163 -\164\040\107\155\142\110\061\052\060\050\006\003\125\004\003\014 -\041\104\055\124\122\125\123\124\040\122\157\157\164\040\103\154 -\141\163\163\040\063\040\103\101\040\062\040\105\126\040\062\060 -\060\071 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\003\011\203\364 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\004\103\060\202\003\053\240\003\002\001\002\002\003\011 -\203\364\060\015\006\011\052\206\110\206\367\015\001\001\013\005 -\000\060\120\061\013\060\011\006\003\125\004\006\023\002\104\105 -\061\025\060\023\006\003\125\004\012\014\014\104\055\124\162\165 -\163\164\040\107\155\142\110\061\052\060\050\006\003\125\004\003 -\014\041\104\055\124\122\125\123\124\040\122\157\157\164\040\103 -\154\141\163\163\040\063\040\103\101\040\062\040\105\126\040\062 -\060\060\071\060\036\027\015\060\071\061\061\060\065\060\070\065 -\060\064\066\132\027\015\062\071\061\061\060\065\060\070\065\060 -\064\066\132\060\120\061\013\060\011\006\003\125\004\006\023\002 -\104\105\061\025\060\023\006\003\125\004\012\014\014\104\055\124 -\162\165\163\164\040\107\155\142\110\061\052\060\050\006\003\125 -\004\003\014\041\104\055\124\122\125\123\124\040\122\157\157\164 -\040\103\154\141\163\163\040\063\040\103\101\040\062\040\105\126 -\040\062\060\060\071\060\202\001\042\060\015\006\011\052\206\110 -\206\367\015\001\001\001\005\000\003\202\001\017\000\060\202\001 -\012\002\202\001\001\000\231\361\204\064\160\272\057\267\060\240 -\216\275\174\004\317\276\142\274\231\375\202\227\322\172\012\147 -\226\070\011\366\020\116\225\042\163\231\215\332\025\055\347\005 -\374\031\163\042\267\216\230\000\274\074\075\254\241\154\373\326 -\171\045\113\255\360\314\144\332\210\076\051\270\017\011\323\064 -\335\063\365\142\321\341\315\031\351\356\030\117\114\130\256\342 -\036\326\014\133\025\132\330\072\270\304\030\144\036\343\063\262 -\265\211\167\116\014\277\331\224\153\023\227\157\022\243\376\231 -\251\004\314\025\354\140\150\066\355\010\173\267\365\277\223\355 -\146\061\203\214\306\161\064\207\116\027\352\257\213\221\215\034 -\126\101\256\042\067\136\067\362\035\331\321\055\015\057\151\121 -\247\276\146\246\212\072\052\275\307\032\261\341\024\360\276\072 -\035\271\317\133\261\152\376\264\261\106\040\242\373\036\073\160 -\357\223\230\175\214\163\226\362\305\357\205\160\255\051\046\374 -\036\004\076\034\240\330\017\313\122\203\142\174\356\213\123\225 -\220\251\127\242\352\141\005\330\371\115\304\047\372\156\255\355 -\371\327\121\367\153\245\002\003\001\000\001\243\202\001\044\060 -\202\001\040\060\017\006\003\125\035\023\001\001\377\004\005\060 -\003\001\001\377\060\035\006\003\125\035\016\004\026\004\024\323 -\224\212\114\142\023\052\031\056\314\257\162\212\175\066\327\232 -\034\334\147\060\016\006\003\125\035\017\001\001\377\004\004\003 -\002\001\006\060\201\335\006\003\125\035\037\004\201\325\060\201 -\322\060\201\207\240\201\204\240\201\201\206\177\154\144\141\160 -\072\057\057\144\151\162\145\143\164\157\162\171\056\144\055\164 -\162\165\163\164\056\156\145\164\057\103\116\075\104\055\124\122 -\125\123\124\045\062\060\122\157\157\164\045\062\060\103\154\141 -\163\163\045\062\060\063\045\062\060\103\101\045\062\060\062\045 -\062\060\105\126\045\062\060\062\060\060\071\054\117\075\104\055 -\124\162\165\163\164\045\062\060\107\155\142\110\054\103\075\104 -\105\077\143\145\162\164\151\146\151\143\141\164\145\162\145\166 -\157\143\141\164\151\157\156\154\151\163\164\060\106\240\104\240 -\102\206\100\150\164\164\160\072\057\057\167\167\167\056\144\055 -\164\162\165\163\164\056\156\145\164\057\143\162\154\057\144\055 -\164\162\165\163\164\137\162\157\157\164\137\143\154\141\163\163 -\137\063\137\143\141\137\062\137\145\166\137\062\060\060\071\056 -\143\162\154\060\015\006\011\052\206\110\206\367\015\001\001\013 -\005\000\003\202\001\001\000\064\355\173\132\074\244\224\210\357 -\032\021\165\007\057\263\376\074\372\036\121\046\353\207\366\051 -\336\340\361\324\306\044\011\351\301\317\125\033\264\060\331\316 -\032\376\006\121\246\025\244\055\357\262\113\277\040\050\045\111 -\321\246\066\167\064\350\144\337\122\261\021\307\163\172\315\071 -\236\302\255\214\161\041\362\132\153\257\337\074\116\125\257\262 -\204\145\024\211\271\167\313\052\061\276\317\243\155\317\157\110 -\224\062\106\157\347\161\214\240\246\204\031\067\007\362\003\105 -\011\053\206\165\174\337\137\151\127\000\333\156\330\246\162\042 -\113\120\324\165\230\126\337\267\030\377\103\103\120\256\172\104 -\173\360\171\121\327\103\075\247\323\201\323\360\311\117\271\332 -\306\227\206\320\202\303\344\102\155\376\260\342\144\116\016\046 -\347\100\064\046\265\010\211\327\010\143\143\070\047\165\036\063 -\352\156\250\335\237\231\117\164\115\201\211\200\113\335\232\227 -\051\134\057\276\201\101\271\214\377\352\175\140\006\236\315\327 -\075\323\056\243\025\274\250\346\046\345\157\303\334\270\003\041 -\352\237\026\361\054\124\265 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "D-TRUST Root Class 3 CA 2 EV 2009" -# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009,O=D-Trust GmbH,C=DE -# Serial Number: 623604 (0x983f4) -# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009,O=D-Trust GmbH,C=DE -# Not Valid Before: Thu Nov 05 08:50:46 2009 -# Not Valid After : Mon Nov 05 08:50:46 2029 -# Fingerprint (SHA-256): EE:C5:49:6B:98:8C:E9:86:25:B9:34:09:2E:EC:29:08:BE:D0:B0:F3:16:C2:D4:73:0C:84:EA:F1:F3:D3:48:81 -# Fingerprint (SHA1): 96:C9:1B:0B:95:B4:10:98:42:FA:D0:D8:22:79:FE:60:FA:B9:16:83 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "D-TRUST Root Class 3 CA 2 EV 2009" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\226\311\033\013\225\264\020\230\102\372\320\330\042\171\376\140 -\372\271\026\203 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\252\306\103\054\136\055\315\304\064\300\120\117\021\002\117\266 -END -CKA_ISSUER MULTILINE_OCTAL -\060\120\061\013\060\011\006\003\125\004\006\023\002\104\105\061 -\025\060\023\006\003\125\004\012\014\014\104\055\124\162\165\163 -\164\040\107\155\142\110\061\052\060\050\006\003\125\004\003\014 -\041\104\055\124\122\125\123\124\040\122\157\157\164\040\103\154 -\141\163\163\040\063\040\103\101\040\062\040\105\126\040\062\060 -\060\071 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\003\011\203\364 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "CA Disig Root R2" -# -# Issuer: CN=CA Disig Root R2,O=Disig a.s.,L=Bratislava,C=SK -# Serial Number:00:92:b8:88:db:b0:8a:c1:63 -# Subject: CN=CA Disig Root R2,O=Disig a.s.,L=Bratislava,C=SK -# Not Valid Before: Thu Jul 19 09:15:30 2012 -# Not Valid After : Sat Jul 19 09:15:30 2042 -# Fingerprint (SHA-256): E2:3D:4A:03:6D:7B:70:E9:F5:95:B1:42:20:79:D2:B9:1E:DF:BB:1F:B6:51:A0:63:3E:AA:8A:9D:C5:F8:07:03 -# Fingerprint (SHA1): B5:61:EB:EA:A4:DE:E4:25:4B:69:1A:98:A5:57:47:C2:34:C7:D9:71 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "CA Disig Root R2" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\122\061\013\060\011\006\003\125\004\006\023\002\123\113\061 -\023\060\021\006\003\125\004\007\023\012\102\162\141\164\151\163 -\154\141\166\141\061\023\060\021\006\003\125\004\012\023\012\104 -\151\163\151\147\040\141\056\163\056\061\031\060\027\006\003\125 -\004\003\023\020\103\101\040\104\151\163\151\147\040\122\157\157 -\164\040\122\062 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\122\061\013\060\011\006\003\125\004\006\023\002\123\113\061 -\023\060\021\006\003\125\004\007\023\012\102\162\141\164\151\163 -\154\141\166\141\061\023\060\021\006\003\125\004\012\023\012\104 -\151\163\151\147\040\141\056\163\056\061\031\060\027\006\003\125 -\004\003\023\020\103\101\040\104\151\163\151\147\040\122\157\157 -\164\040\122\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\011\000\222\270\210\333\260\212\301\143 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\151\060\202\003\121\240\003\002\001\002\002\011\000 -\222\270\210\333\260\212\301\143\060\015\006\011\052\206\110\206 -\367\015\001\001\013\005\000\060\122\061\013\060\011\006\003\125 -\004\006\023\002\123\113\061\023\060\021\006\003\125\004\007\023 -\012\102\162\141\164\151\163\154\141\166\141\061\023\060\021\006 -\003\125\004\012\023\012\104\151\163\151\147\040\141\056\163\056 -\061\031\060\027\006\003\125\004\003\023\020\103\101\040\104\151 -\163\151\147\040\122\157\157\164\040\122\062\060\036\027\015\061 -\062\060\067\061\071\060\071\061\065\063\060\132\027\015\064\062 -\060\067\061\071\060\071\061\065\063\060\132\060\122\061\013\060 -\011\006\003\125\004\006\023\002\123\113\061\023\060\021\006\003 -\125\004\007\023\012\102\162\141\164\151\163\154\141\166\141\061 -\023\060\021\006\003\125\004\012\023\012\104\151\163\151\147\040 -\141\056\163\056\061\031\060\027\006\003\125\004\003\023\020\103 -\101\040\104\151\163\151\147\040\122\157\157\164\040\122\062\060 -\202\002\042\060\015\006\011\052\206\110\206\367\015\001\001\001 -\005\000\003\202\002\017\000\060\202\002\012\002\202\002\001\000 -\242\243\304\000\011\326\205\135\055\155\024\366\302\303\163\236 -\065\302\161\125\176\201\373\253\106\120\340\301\174\111\170\346 -\253\171\130\074\332\377\174\034\237\330\227\002\170\076\153\101 -\004\351\101\275\276\003\054\105\366\057\144\324\253\135\243\107 -\075\144\233\351\150\232\306\314\033\077\272\276\262\213\064\002 -\056\230\125\031\374\214\157\252\137\332\114\316\115\003\041\243 -\330\322\064\223\126\226\313\114\014\000\026\074\137\032\315\310 -\307\154\246\255\323\061\247\274\350\345\341\146\326\322\373\003 -\264\101\145\311\020\256\016\005\143\306\200\152\151\060\375\322 -\356\220\357\015\047\337\237\225\163\364\341\045\332\154\026\336 -\101\070\064\352\213\374\321\350\004\024\141\055\101\176\254\307 -\167\116\313\121\124\373\136\222\030\033\004\132\150\306\311\304 -\372\267\023\240\230\267\021\053\267\326\127\314\174\236\027\321 -\313\045\376\206\116\044\056\126\014\170\115\236\001\022\246\053 -\247\001\145\156\174\142\035\204\204\337\352\300\153\265\245\052 -\225\203\303\123\021\014\163\035\013\262\106\220\321\102\072\316 -\100\156\225\255\377\306\224\255\156\227\204\216\175\157\236\212 -\200\015\111\155\163\342\173\222\036\303\363\301\363\353\056\005 -\157\331\033\317\067\166\004\310\264\132\344\027\247\313\335\166 -\037\320\031\166\350\054\005\263\326\234\064\330\226\334\141\207 -\221\005\344\104\010\063\301\332\271\010\145\324\256\262\066\015 -\353\272\070\272\014\345\233\236\353\215\146\335\231\317\326\211 -\101\366\004\222\212\051\051\155\153\072\034\347\165\175\002\161 -\016\363\300\347\275\313\031\335\235\140\262\302\146\140\266\261 -\004\356\311\346\206\271\232\146\100\250\347\021\355\201\105\003 -\213\366\147\131\350\301\006\021\275\335\317\200\002\117\145\100 -\170\134\107\120\310\233\346\037\201\173\344\104\250\133\205\232 -\342\336\132\325\307\371\072\104\146\113\344\062\124\174\344\154 -\234\263\016\075\027\242\262\064\022\326\176\262\250\111\273\321 -\172\050\100\276\242\026\037\337\344\067\037\021\163\373\220\012 -\145\103\242\015\174\370\006\001\125\063\175\260\015\270\364\365 -\256\245\102\127\174\066\021\214\173\136\304\003\235\214\171\235 -\002\003\001\000\001\243\102\060\100\060\017\006\003\125\035\023 -\001\001\377\004\005\060\003\001\001\377\060\016\006\003\125\035 -\017\001\001\377\004\004\003\002\001\006\060\035\006\003\125\035 -\016\004\026\004\024\265\231\370\257\260\224\365\343\040\326\012 -\255\316\116\126\244\056\156\102\355\060\015\006\011\052\206\110 -\206\367\015\001\001\013\005\000\003\202\002\001\000\046\006\136 -\160\347\145\063\310\202\156\331\234\027\072\033\172\146\262\001 -\366\170\073\151\136\057\352\377\116\371\050\303\230\052\141\114 -\264\044\022\212\175\155\021\024\367\234\265\312\346\274\236\047 -\216\114\031\310\251\275\172\300\327\066\016\155\205\162\156\250 -\306\242\155\366\372\163\143\177\274\156\171\010\034\235\212\237 -\032\212\123\246\330\273\331\065\125\261\021\305\251\003\263\126 -\073\271\204\223\042\136\176\301\366\022\122\213\352\054\147\274 -\376\066\114\365\270\317\321\263\111\222\073\323\051\016\231\033 -\226\367\141\270\073\304\053\266\170\154\264\043\157\360\375\323 -\262\136\165\037\231\225\250\254\366\332\341\305\061\173\373\321 -\106\263\322\274\147\264\142\124\272\011\367\143\260\223\242\232 -\371\351\122\056\213\140\022\253\374\365\140\126\357\020\134\213 -\304\032\102\334\203\133\144\016\313\265\274\326\117\301\174\074 -\156\215\023\155\373\173\353\060\320\334\115\257\305\325\266\245 -\114\133\161\311\350\061\276\350\070\006\110\241\032\342\352\322 -\336\022\071\130\032\377\200\016\202\165\346\267\311\007\154\016 -\357\377\070\361\230\161\304\267\177\016\025\320\045\151\275\042 -\235\053\355\005\366\106\107\254\355\300\360\324\073\342\354\356 -\226\133\220\023\116\036\126\072\353\260\357\226\273\226\043\021 -\272\362\103\206\164\144\225\310\050\165\337\035\065\272\322\067 -\203\070\123\070\066\073\317\154\351\371\153\016\320\373\004\350 -\117\167\327\145\001\170\206\014\172\076\041\142\361\177\143\161 -\014\311\237\104\333\250\047\242\165\276\156\201\076\327\300\353 -\033\230\017\160\134\064\262\212\314\300\205\030\353\156\172\263 -\367\132\241\007\277\251\102\222\363\140\042\227\344\024\241\007 -\233\116\166\300\216\175\375\244\045\307\107\355\377\037\163\254 -\314\303\245\351\157\012\216\233\145\302\120\205\265\243\240\123 -\022\314\125\207\141\363\201\256\020\106\141\275\104\041\270\302 -\075\164\317\176\044\065\372\034\007\016\233\075\042\312\357\061 -\057\214\254\022\275\357\100\050\374\051\147\237\262\023\117\146 -\044\304\123\031\351\036\051\025\357\346\155\260\177\055\147\375 -\363\154\033\165\106\243\345\112\027\351\244\327\013 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "CA Disig Root R2" -# Issuer: CN=CA Disig Root R2,O=Disig a.s.,L=Bratislava,C=SK -# Serial Number:00:92:b8:88:db:b0:8a:c1:63 -# Subject: CN=CA Disig Root R2,O=Disig a.s.,L=Bratislava,C=SK -# Not Valid Before: Thu Jul 19 09:15:30 2012 -# Not Valid After : Sat Jul 19 09:15:30 2042 -# Fingerprint (SHA-256): E2:3D:4A:03:6D:7B:70:E9:F5:95:B1:42:20:79:D2:B9:1E:DF:BB:1F:B6:51:A0:63:3E:AA:8A:9D:C5:F8:07:03 -# Fingerprint (SHA1): B5:61:EB:EA:A4:DE:E4:25:4B:69:1A:98:A5:57:47:C2:34:C7:D9:71 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "CA Disig Root R2" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\265\141\353\352\244\336\344\045\113\151\032\230\245\127\107\302 -\064\307\331\161 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\046\001\373\330\047\247\027\232\105\124\070\032\103\001\073\003 -END -CKA_ISSUER MULTILINE_OCTAL -\060\122\061\013\060\011\006\003\125\004\006\023\002\123\113\061 -\023\060\021\006\003\125\004\007\023\012\102\162\141\164\151\163 -\154\141\166\141\061\023\060\021\006\003\125\004\012\023\012\104 -\151\163\151\147\040\141\056\163\056\061\031\060\027\006\003\125 -\004\003\023\020\103\101\040\104\151\163\151\147\040\122\157\157 -\164\040\122\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\011\000\222\270\210\333\260\212\301\143 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "ACCVRAIZ1" -# -# Issuer: C=ES,O=ACCV,OU=PKIACCV,CN=ACCVRAIZ1 -# Serial Number:5e:c3:b7:a6:43:7f:a4:e0 -# Subject: C=ES,O=ACCV,OU=PKIACCV,CN=ACCVRAIZ1 -# Not Valid Before: Thu May 05 09:37:37 2011 -# Not Valid After : Tue Dec 31 09:37:37 2030 -# Fingerprint (SHA-256): 9A:6E:C0:12:E1:A7:DA:9D:BE:34:19:4D:47:8A:D7:C0:DB:18:22:FB:07:1D:F1:29:81:49:6E:D1:04:38:41:13 -# Fingerprint (SHA1): 93:05:7A:88:15:C6:4F:CE:88:2F:FA:91:16:52:28:78:BC:53:64:17 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "ACCVRAIZ1" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\102\061\022\060\020\006\003\125\004\003\014\011\101\103\103 -\126\122\101\111\132\061\061\020\060\016\006\003\125\004\013\014 -\007\120\113\111\101\103\103\126\061\015\060\013\006\003\125\004 -\012\014\004\101\103\103\126\061\013\060\011\006\003\125\004\006 -\023\002\105\123 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\102\061\022\060\020\006\003\125\004\003\014\011\101\103\103 -\126\122\101\111\132\061\061\020\060\016\006\003\125\004\013\014 -\007\120\113\111\101\103\103\126\061\015\060\013\006\003\125\004 -\012\014\004\101\103\103\126\061\013\060\011\006\003\125\004\006 -\023\002\105\123 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\010\136\303\267\246\103\177\244\340 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\007\323\060\202\005\273\240\003\002\001\002\002\010\136 -\303\267\246\103\177\244\340\060\015\006\011\052\206\110\206\367 -\015\001\001\005\005\000\060\102\061\022\060\020\006\003\125\004 -\003\014\011\101\103\103\126\122\101\111\132\061\061\020\060\016 -\006\003\125\004\013\014\007\120\113\111\101\103\103\126\061\015 -\060\013\006\003\125\004\012\014\004\101\103\103\126\061\013\060 -\011\006\003\125\004\006\023\002\105\123\060\036\027\015\061\061 -\060\065\060\065\060\071\063\067\063\067\132\027\015\063\060\061 -\062\063\061\060\071\063\067\063\067\132\060\102\061\022\060\020 -\006\003\125\004\003\014\011\101\103\103\126\122\101\111\132\061 -\061\020\060\016\006\003\125\004\013\014\007\120\113\111\101\103 -\103\126\061\015\060\013\006\003\125\004\012\014\004\101\103\103 -\126\061\013\060\011\006\003\125\004\006\023\002\105\123\060\202 -\002\042\060\015\006\011\052\206\110\206\367\015\001\001\001\005 -\000\003\202\002\017\000\060\202\002\012\002\202\002\001\000\233 -\251\253\277\141\112\227\257\057\227\146\232\164\137\320\331\226 -\375\317\342\344\146\357\037\037\107\063\302\104\243\337\232\336 -\037\265\124\335\025\174\151\065\021\157\273\310\014\216\152\030 -\036\330\217\331\026\274\020\110\066\134\360\143\263\220\132\134 -\044\067\327\243\326\313\011\161\271\361\001\162\204\260\175\333 -\115\200\315\374\323\157\311\370\332\266\016\202\322\105\205\250 -\033\150\250\075\350\364\104\154\275\241\302\313\003\276\214\076 -\023\000\204\337\112\110\300\343\042\012\350\351\067\247\030\114 -\261\011\015\043\126\177\004\115\331\027\204\030\245\310\332\100 -\224\163\353\316\016\127\074\003\201\072\235\012\241\127\103\151 -\254\127\155\171\220\170\345\265\264\073\330\274\114\215\050\241 -\247\243\247\272\002\116\045\321\052\256\355\256\003\042\270\153 -\040\017\060\050\124\225\177\340\356\316\012\146\235\321\100\055 -\156\042\257\235\032\301\005\031\322\157\300\362\237\370\173\263 -\002\102\373\120\251\035\055\223\017\043\253\306\301\017\222\377 -\320\242\025\365\123\011\161\034\377\105\023\204\346\046\136\370 -\340\210\034\012\374\026\266\250\163\006\270\360\143\204\002\240 -\306\132\354\347\164\337\160\256\243\203\045\352\326\307\227\207 -\223\247\306\212\212\063\227\140\067\020\076\227\076\156\051\025 -\326\241\017\321\210\054\022\237\157\252\244\306\102\353\101\242 -\343\225\103\323\001\205\155\216\273\073\363\043\066\307\376\073 -\340\241\045\007\110\253\311\211\164\377\010\217\200\277\300\226 -\145\363\356\354\113\150\275\235\210\303\061\263\100\361\350\317 -\366\070\273\234\344\321\177\324\345\130\233\174\372\324\363\016 -\233\165\221\344\272\122\056\031\176\321\365\315\132\031\374\272 -\006\366\373\122\250\113\231\004\335\370\371\264\213\120\243\116 -\142\211\360\207\044\372\203\102\301\207\372\325\055\051\052\132 -\161\172\144\152\327\047\140\143\015\333\316\111\365\215\037\220 -\211\062\027\370\163\103\270\322\132\223\206\141\326\341\165\012 -\352\171\146\166\210\117\161\353\004\045\326\012\132\172\223\345 -\271\113\027\100\017\261\266\271\365\336\117\334\340\263\254\073 -\021\160\140\204\112\103\156\231\040\300\051\161\012\300\145\002 -\003\001\000\001\243\202\002\313\060\202\002\307\060\175\006\010 -\053\006\001\005\005\007\001\001\004\161\060\157\060\114\006\010 -\053\006\001\005\005\007\060\002\206\100\150\164\164\160\072\057 -\057\167\167\167\056\141\143\143\166\056\145\163\057\146\151\154 -\145\141\144\155\151\156\057\101\162\143\150\151\166\157\163\057 -\143\145\162\164\151\146\151\143\141\144\157\163\057\162\141\151 -\172\141\143\143\166\061\056\143\162\164\060\037\006\010\053\006 -\001\005\005\007\060\001\206\023\150\164\164\160\072\057\057\157 -\143\163\160\056\141\143\143\166\056\145\163\060\035\006\003\125 -\035\016\004\026\004\024\322\207\264\343\337\067\047\223\125\366 -\126\352\201\345\066\314\214\036\077\275\060\017\006\003\125\035 -\023\001\001\377\004\005\060\003\001\001\377\060\037\006\003\125 -\035\043\004\030\060\026\200\024\322\207\264\343\337\067\047\223 -\125\366\126\352\201\345\066\314\214\036\077\275\060\202\001\163 -\006\003\125\035\040\004\202\001\152\060\202\001\146\060\202\001 -\142\006\004\125\035\040\000\060\202\001\130\060\202\001\042\006 -\010\053\006\001\005\005\007\002\002\060\202\001\024\036\202\001 -\020\000\101\000\165\000\164\000\157\000\162\000\151\000\144\000 -\141\000\144\000\040\000\144\000\145\000\040\000\103\000\145\000 -\162\000\164\000\151\000\146\000\151\000\143\000\141\000\143\000 -\151\000\363\000\156\000\040\000\122\000\141\000\355\000\172\000 -\040\000\144\000\145\000\040\000\154\000\141\000\040\000\101\000 -\103\000\103\000\126\000\040\000\050\000\101\000\147\000\145\000 -\156\000\143\000\151\000\141\000\040\000\144\000\145\000\040\000 -\124\000\145\000\143\000\156\000\157\000\154\000\157\000\147\000 -\355\000\141\000\040\000\171\000\040\000\103\000\145\000\162\000 -\164\000\151\000\146\000\151\000\143\000\141\000\143\000\151\000 -\363\000\156\000\040\000\105\000\154\000\145\000\143\000\164\000 -\162\000\363\000\156\000\151\000\143\000\141\000\054\000\040\000 -\103\000\111\000\106\000\040\000\121\000\064\000\066\000\060\000 -\061\000\061\000\065\000\066\000\105\000\051\000\056\000\040\000 -\103\000\120\000\123\000\040\000\145\000\156\000\040\000\150\000 -\164\000\164\000\160\000\072\000\057\000\057\000\167\000\167\000 -\167\000\056\000\141\000\143\000\143\000\166\000\056\000\145\000 -\163\060\060\006\010\053\006\001\005\005\007\002\001\026\044\150 -\164\164\160\072\057\057\167\167\167\056\141\143\143\166\056\145 -\163\057\154\145\147\151\163\154\141\143\151\157\156\137\143\056 -\150\164\155\060\125\006\003\125\035\037\004\116\060\114\060\112 -\240\110\240\106\206\104\150\164\164\160\072\057\057\167\167\167 -\056\141\143\143\166\056\145\163\057\146\151\154\145\141\144\155 -\151\156\057\101\162\143\150\151\166\157\163\057\143\145\162\164 -\151\146\151\143\141\144\157\163\057\162\141\151\172\141\143\143 -\166\061\137\144\145\162\056\143\162\154\060\016\006\003\125\035 -\017\001\001\377\004\004\003\002\001\006\060\027\006\003\125\035 -\021\004\020\060\016\201\014\141\143\143\166\100\141\143\143\166 -\056\145\163\060\015\006\011\052\206\110\206\367\015\001\001\005 -\005\000\003\202\002\001\000\227\061\002\237\347\375\103\147\110 -\104\024\344\051\207\355\114\050\146\320\217\065\332\115\141\267 -\112\227\115\265\333\220\340\005\056\016\306\171\320\362\227\151 -\017\275\004\107\331\276\333\265\051\332\233\331\256\251\231\325 -\323\074\060\223\365\215\241\250\374\006\215\104\364\312\026\225 -\174\063\334\142\213\250\067\370\047\330\011\055\033\357\310\024 -\047\040\251\144\104\377\056\326\165\252\154\115\140\100\031\111 -\103\124\143\332\342\314\272\146\345\117\104\172\133\331\152\201 -\053\100\325\177\371\001\047\130\054\310\355\110\221\174\077\246 -\000\317\304\051\163\021\066\336\206\031\076\235\356\031\212\033 -\325\260\355\216\075\234\052\300\015\330\075\146\343\074\015\275 -\325\224\134\342\342\247\065\033\004\000\366\077\132\215\352\103 -\275\137\211\035\251\301\260\314\231\342\115\000\012\332\311\047 -\133\347\023\220\134\344\365\063\242\125\155\334\340\011\115\057 -\261\046\133\047\165\000\011\304\142\167\051\010\137\236\131\254 -\266\176\255\237\124\060\042\003\301\036\161\144\376\371\070\012 -\226\030\335\002\024\254\043\313\006\034\036\244\175\215\015\336 -\047\101\350\255\332\025\267\260\043\335\053\250\323\332\045\207 -\355\350\125\104\115\210\364\066\176\204\232\170\254\367\016\126 -\111\016\326\063\045\326\204\120\102\154\040\022\035\052\325\276 -\274\362\160\201\244\160\140\276\005\265\233\236\004\104\276\141 -\043\254\351\245\044\214\021\200\224\132\242\242\271\111\322\301 -\334\321\247\355\061\021\054\236\031\246\356\341\125\341\300\352 -\317\015\204\344\027\267\242\174\245\336\125\045\006\356\314\300 -\207\134\100\332\314\225\077\125\340\065\307\270\204\276\264\135 -\315\172\203\001\162\356\207\346\137\035\256\265\205\306\046\337 -\346\301\232\351\036\002\107\237\052\250\155\251\133\317\354\105 -\167\177\230\047\232\062\135\052\343\204\356\305\230\146\057\226 -\040\035\335\330\303\047\327\260\371\376\331\175\315\320\237\217 -\013\024\130\121\237\057\213\303\070\055\336\350\217\326\215\207 -\244\365\126\103\026\231\054\364\244\126\264\064\270\141\067\311 -\302\130\200\033\240\227\241\374\131\215\351\021\366\321\017\113 -\125\064\106\052\213\206\073 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "ACCVRAIZ1" -# Issuer: C=ES,O=ACCV,OU=PKIACCV,CN=ACCVRAIZ1 -# Serial Number:5e:c3:b7:a6:43:7f:a4:e0 -# Subject: C=ES,O=ACCV,OU=PKIACCV,CN=ACCVRAIZ1 -# Not Valid Before: Thu May 05 09:37:37 2011 -# Not Valid After : Tue Dec 31 09:37:37 2030 -# Fingerprint (SHA-256): 9A:6E:C0:12:E1:A7:DA:9D:BE:34:19:4D:47:8A:D7:C0:DB:18:22:FB:07:1D:F1:29:81:49:6E:D1:04:38:41:13 -# Fingerprint (SHA1): 93:05:7A:88:15:C6:4F:CE:88:2F:FA:91:16:52:28:78:BC:53:64:17 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "ACCVRAIZ1" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\223\005\172\210\025\306\117\316\210\057\372\221\026\122\050\170 -\274\123\144\027 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\320\240\132\356\005\266\011\224\041\241\175\361\262\051\202\002 -END -CKA_ISSUER MULTILINE_OCTAL -\060\102\061\022\060\020\006\003\125\004\003\014\011\101\103\103 -\126\122\101\111\132\061\061\020\060\016\006\003\125\004\013\014 -\007\120\113\111\101\103\103\126\061\015\060\013\006\003\125\004 -\012\014\004\101\103\103\126\061\013\060\011\006\003\125\004\006 -\023\002\105\123 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\010\136\303\267\246\103\177\244\340 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "TWCA Global Root CA" -# -# Issuer: CN=TWCA Global Root CA,OU=Root CA,O=TAIWAN-CA,C=TW -# Serial Number: 3262 (0xcbe) -# Subject: CN=TWCA Global Root CA,OU=Root CA,O=TAIWAN-CA,C=TW -# Not Valid Before: Wed Jun 27 06:28:33 2012 -# Not Valid After : Tue Dec 31 15:59:59 2030 -# Fingerprint (SHA-256): 59:76:90:07:F7:68:5D:0F:CD:50:87:2F:9F:95:D5:75:5A:5B:2B:45:7D:81:F3:69:2B:61:0A:98:67:2F:0E:1B -# Fingerprint (SHA1): 9C:BB:48:53:F6:A4:F6:D3:52:A4:E8:32:52:55:60:13:F5:AD:AF:65 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "TWCA Global Root CA" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\121\061\013\060\011\006\003\125\004\006\023\002\124\127\061 -\022\060\020\006\003\125\004\012\023\011\124\101\111\127\101\116 -\055\103\101\061\020\060\016\006\003\125\004\013\023\007\122\157 -\157\164\040\103\101\061\034\060\032\006\003\125\004\003\023\023 -\124\127\103\101\040\107\154\157\142\141\154\040\122\157\157\164 -\040\103\101 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\121\061\013\060\011\006\003\125\004\006\023\002\124\127\061 -\022\060\020\006\003\125\004\012\023\011\124\101\111\127\101\116 -\055\103\101\061\020\060\016\006\003\125\004\013\023\007\122\157 -\157\164\040\103\101\061\034\060\032\006\003\125\004\003\023\023 -\124\127\103\101\040\107\154\157\142\141\154\040\122\157\157\164 -\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\002\014\276 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\101\060\202\003\051\240\003\002\001\002\002\002\014 -\276\060\015\006\011\052\206\110\206\367\015\001\001\013\005\000 -\060\121\061\013\060\011\006\003\125\004\006\023\002\124\127\061 -\022\060\020\006\003\125\004\012\023\011\124\101\111\127\101\116 -\055\103\101\061\020\060\016\006\003\125\004\013\023\007\122\157 -\157\164\040\103\101\061\034\060\032\006\003\125\004\003\023\023 -\124\127\103\101\040\107\154\157\142\141\154\040\122\157\157\164 -\040\103\101\060\036\027\015\061\062\060\066\062\067\060\066\062 -\070\063\063\132\027\015\063\060\061\062\063\061\061\065\065\071 -\065\071\132\060\121\061\013\060\011\006\003\125\004\006\023\002 -\124\127\061\022\060\020\006\003\125\004\012\023\011\124\101\111 -\127\101\116\055\103\101\061\020\060\016\006\003\125\004\013\023 -\007\122\157\157\164\040\103\101\061\034\060\032\006\003\125\004 -\003\023\023\124\127\103\101\040\107\154\157\142\141\154\040\122 -\157\157\164\040\103\101\060\202\002\042\060\015\006\011\052\206 -\110\206\367\015\001\001\001\005\000\003\202\002\017\000\060\202 -\002\012\002\202\002\001\000\260\005\333\310\353\214\304\156\212 -\041\357\216\115\234\161\012\037\122\160\355\155\202\234\227\305 -\327\114\116\105\111\313\100\102\265\022\064\154\031\302\164\244 -\061\137\205\002\227\354\103\063\012\123\322\234\214\216\267\270 -\171\333\053\325\152\362\216\146\304\356\053\001\007\222\324\263 -\320\002\337\120\366\125\257\146\016\313\340\107\140\057\053\062 -\071\065\122\072\050\203\370\173\026\306\030\270\142\326\107\045 -\221\316\360\031\022\115\255\143\365\323\077\165\137\051\360\241 -\060\034\052\240\230\246\025\275\356\375\031\066\360\342\221\103 -\217\372\312\326\020\047\111\114\357\335\301\361\205\160\233\312 -\352\250\132\103\374\155\206\157\163\351\067\105\251\360\066\307 -\314\210\165\036\273\154\006\377\233\153\076\027\354\141\252\161 -\174\306\035\242\367\111\351\025\265\074\326\241\141\365\021\367 -\005\157\035\375\021\276\320\060\007\302\051\260\011\116\046\334 -\343\242\250\221\152\037\302\221\105\210\134\345\230\270\161\245 -\025\031\311\174\165\021\314\160\164\117\055\233\035\221\104\375 -\126\050\240\376\273\206\152\310\372\134\013\130\334\306\113\166 -\310\253\042\331\163\017\245\364\132\002\211\077\117\236\042\202 -\356\242\164\123\052\075\123\047\151\035\154\216\062\054\144\000 -\046\143\141\066\116\243\106\267\077\175\263\055\254\155\220\242 -\225\242\316\317\332\202\347\007\064\031\226\351\270\041\252\051 -\176\246\070\276\216\051\112\041\146\171\037\263\303\265\011\147 -\336\326\324\007\106\363\052\332\346\042\067\140\313\201\266\017 -\240\017\351\310\225\177\277\125\221\005\172\317\075\025\300\157 -\336\011\224\001\203\327\064\033\314\100\245\360\270\233\147\325 -\230\221\073\247\204\170\225\046\244\132\010\370\053\164\264\000 -\004\074\337\270\024\216\350\337\251\215\154\147\222\063\035\300 -\267\322\354\222\310\276\011\277\054\051\005\157\002\153\236\357 -\274\277\052\274\133\300\120\217\101\160\161\207\262\115\267\004 -\251\204\243\062\257\256\356\153\027\213\262\261\376\154\341\220 -\214\210\250\227\110\316\310\115\313\363\006\317\137\152\012\102 -\261\036\036\167\057\216\240\346\222\016\006\374\005\042\322\046 -\341\061\121\175\062\334\017\002\003\001\000\001\243\043\060\041 -\060\016\006\003\125\035\017\001\001\377\004\004\003\002\001\006 -\060\017\006\003\125\035\023\001\001\377\004\005\060\003\001\001 -\377\060\015\006\011\052\206\110\206\367\015\001\001\013\005\000 -\003\202\002\001\000\137\064\201\166\357\226\035\325\345\265\331 -\002\143\204\026\301\256\240\160\121\247\367\114\107\065\310\013 -\327\050\075\211\161\331\252\063\101\352\024\033\154\041\000\300 -\154\102\031\176\237\151\133\040\102\337\242\322\332\304\174\227 -\113\215\260\350\254\310\356\245\151\004\231\012\222\246\253\047 -\056\032\115\201\277\204\324\160\036\255\107\376\375\112\235\063 -\340\362\271\304\105\010\041\012\332\151\151\163\162\015\276\064 -\376\224\213\255\303\036\065\327\242\203\357\345\070\307\245\205 -\037\253\317\064\354\077\050\376\014\361\127\206\116\311\125\367 -\034\324\330\245\175\006\172\157\325\337\020\337\201\116\041\145 -\261\266\341\027\171\225\105\006\316\137\314\334\106\211\143\150 -\104\215\223\364\144\160\240\075\235\050\005\303\071\160\270\142 -\173\040\375\344\333\351\010\241\270\236\075\011\307\117\373\054 -\370\223\166\101\336\122\340\341\127\322\235\003\274\167\236\376 -\236\051\136\367\301\121\140\037\336\332\013\262\055\165\267\103 -\110\223\347\366\171\306\204\135\200\131\140\224\374\170\230\217 -\074\223\121\355\100\220\007\337\144\143\044\313\116\161\005\241 -\327\224\032\210\062\361\042\164\042\256\245\246\330\022\151\114 -\140\243\002\356\053\354\324\143\222\013\136\276\057\166\153\243 -\266\046\274\217\003\330\012\362\114\144\106\275\071\142\345\226 -\353\064\143\021\050\314\225\361\255\357\357\334\200\130\110\351 -\113\270\352\145\254\351\374\200\265\265\310\105\371\254\301\237 -\331\271\352\142\210\216\304\361\113\203\022\255\346\213\204\326 -\236\302\353\203\030\237\152\273\033\044\140\063\160\314\354\367 -\062\363\134\331\171\175\357\236\244\376\311\043\303\044\356\025 -\222\261\075\221\117\046\206\275\146\163\044\023\352\244\256\143 -\301\255\175\204\003\074\020\170\206\033\171\343\304\363\362\004 -\225\040\256\043\202\304\263\072\000\142\277\346\066\044\341\127 -\272\307\036\220\165\325\137\077\225\141\053\301\073\315\345\263 -\150\141\320\106\046\251\041\122\151\055\353\056\307\353\167\316 -\246\072\265\003\063\117\166\321\347\134\124\001\135\313\170\364 -\311\014\277\317\022\216\027\055\043\150\224\347\253\376\251\262 -\053\006\320\004\315 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "TWCA Global Root CA" -# Issuer: CN=TWCA Global Root CA,OU=Root CA,O=TAIWAN-CA,C=TW -# Serial Number: 3262 (0xcbe) -# Subject: CN=TWCA Global Root CA,OU=Root CA,O=TAIWAN-CA,C=TW -# Not Valid Before: Wed Jun 27 06:28:33 2012 -# Not Valid After : Tue Dec 31 15:59:59 2030 -# Fingerprint (SHA-256): 59:76:90:07:F7:68:5D:0F:CD:50:87:2F:9F:95:D5:75:5A:5B:2B:45:7D:81:F3:69:2B:61:0A:98:67:2F:0E:1B -# Fingerprint (SHA1): 9C:BB:48:53:F6:A4:F6:D3:52:A4:E8:32:52:55:60:13:F5:AD:AF:65 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "TWCA Global Root CA" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\234\273\110\123\366\244\366\323\122\244\350\062\122\125\140\023 -\365\255\257\145 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\371\003\176\317\346\236\074\163\172\052\220\007\151\377\053\226 -END -CKA_ISSUER MULTILINE_OCTAL -\060\121\061\013\060\011\006\003\125\004\006\023\002\124\127\061 -\022\060\020\006\003\125\004\012\023\011\124\101\111\127\101\116 -\055\103\101\061\020\060\016\006\003\125\004\013\023\007\122\157 -\157\164\040\103\101\061\034\060\032\006\003\125\004\003\023\023 -\124\127\103\101\040\107\154\157\142\141\154\040\122\157\157\164 -\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\002\014\276 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "T-TeleSec GlobalRoot Class 2" -# -# Issuer: CN=T-TeleSec GlobalRoot Class 2,OU=T-Systems Trust Center,O=T-Systems Enterprise Services GmbH,C=DE -# Serial Number: 1 (0x1) -# Subject: CN=T-TeleSec GlobalRoot Class 2,OU=T-Systems Trust Center,O=T-Systems Enterprise Services GmbH,C=DE -# Not Valid Before: Wed Oct 01 10:40:14 2008 -# Not Valid After : Sat Oct 01 23:59:59 2033 -# Fingerprint (SHA-256): 91:E2:F5:78:8D:58:10:EB:A7:BA:58:73:7D:E1:54:8A:8E:CA:CD:01:45:98:BC:0B:14:3E:04:1B:17:05:25:52 -# Fingerprint (SHA1): 59:0D:2D:7D:88:4F:40:2E:61:7E:A5:62:32:17:65:CF:17:D8:94:E9 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "T-TeleSec GlobalRoot Class 2" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\201\202\061\013\060\011\006\003\125\004\006\023\002\104\105 -\061\053\060\051\006\003\125\004\012\014\042\124\055\123\171\163 -\164\145\155\163\040\105\156\164\145\162\160\162\151\163\145\040 -\123\145\162\166\151\143\145\163\040\107\155\142\110\061\037\060 -\035\006\003\125\004\013\014\026\124\055\123\171\163\164\145\155 -\163\040\124\162\165\163\164\040\103\145\156\164\145\162\061\045 -\060\043\006\003\125\004\003\014\034\124\055\124\145\154\145\123 -\145\143\040\107\154\157\142\141\154\122\157\157\164\040\103\154 -\141\163\163\040\062 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\201\202\061\013\060\011\006\003\125\004\006\023\002\104\105 -\061\053\060\051\006\003\125\004\012\014\042\124\055\123\171\163 -\164\145\155\163\040\105\156\164\145\162\160\162\151\163\145\040 -\123\145\162\166\151\143\145\163\040\107\155\142\110\061\037\060 -\035\006\003\125\004\013\014\026\124\055\123\171\163\164\145\155 -\163\040\124\162\165\163\164\040\103\145\156\164\145\162\061\045 -\060\043\006\003\125\004\003\014\034\124\055\124\145\154\145\123 -\145\143\040\107\154\157\142\141\154\122\157\157\164\040\103\154 -\141\163\163\040\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\001 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\003\303\060\202\002\253\240\003\002\001\002\002\001\001 -\060\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060 -\201\202\061\013\060\011\006\003\125\004\006\023\002\104\105\061 -\053\060\051\006\003\125\004\012\014\042\124\055\123\171\163\164 -\145\155\163\040\105\156\164\145\162\160\162\151\163\145\040\123 -\145\162\166\151\143\145\163\040\107\155\142\110\061\037\060\035 -\006\003\125\004\013\014\026\124\055\123\171\163\164\145\155\163 -\040\124\162\165\163\164\040\103\145\156\164\145\162\061\045\060 -\043\006\003\125\004\003\014\034\124\055\124\145\154\145\123\145 -\143\040\107\154\157\142\141\154\122\157\157\164\040\103\154\141 -\163\163\040\062\060\036\027\015\060\070\061\060\060\061\061\060 -\064\060\061\064\132\027\015\063\063\061\060\060\061\062\063\065 -\071\065\071\132\060\201\202\061\013\060\011\006\003\125\004\006 -\023\002\104\105\061\053\060\051\006\003\125\004\012\014\042\124 -\055\123\171\163\164\145\155\163\040\105\156\164\145\162\160\162 -\151\163\145\040\123\145\162\166\151\143\145\163\040\107\155\142 -\110\061\037\060\035\006\003\125\004\013\014\026\124\055\123\171 -\163\164\145\155\163\040\124\162\165\163\164\040\103\145\156\164 -\145\162\061\045\060\043\006\003\125\004\003\014\034\124\055\124 -\145\154\145\123\145\143\040\107\154\157\142\141\154\122\157\157 -\164\040\103\154\141\163\163\040\062\060\202\001\042\060\015\006 -\011\052\206\110\206\367\015\001\001\001\005\000\003\202\001\017 -\000\060\202\001\012\002\202\001\001\000\252\137\332\033\137\350 -\163\221\345\332\134\364\242\346\107\345\363\150\125\140\005\035 -\002\244\263\233\131\363\036\212\257\064\255\374\015\302\331\110 -\031\356\151\217\311\040\374\041\252\007\031\355\260\134\254\145 -\307\137\355\002\174\173\174\055\033\326\272\271\200\302\030\202 -\026\204\372\146\260\010\306\124\043\201\344\315\271\111\077\366 -\117\156\067\110\050\070\017\305\276\347\150\160\375\071\227\115 -\322\307\230\221\120\252\304\104\263\043\175\071\107\351\122\142 -\326\022\223\136\267\061\226\102\005\373\166\247\036\243\365\302 -\374\351\172\305\154\251\161\117\352\313\170\274\140\257\307\336 -\364\331\313\276\176\063\245\156\224\203\360\064\372\041\253\352 -\216\162\240\077\244\336\060\133\357\206\115\152\225\133\103\104 -\250\020\025\034\345\001\127\305\230\361\346\006\050\221\252\040 -\305\267\123\046\121\103\262\013\021\225\130\341\300\017\166\331 -\300\215\174\201\363\162\160\236\157\376\032\216\331\137\065\306 -\262\157\064\174\276\110\117\342\132\071\327\330\235\170\236\237 -\206\076\003\136\031\213\104\242\325\307\002\003\001\000\001\243 -\102\060\100\060\017\006\003\125\035\023\001\001\377\004\005\060 -\003\001\001\377\060\016\006\003\125\035\017\001\001\377\004\004 -\003\002\001\006\060\035\006\003\125\035\016\004\026\004\024\277 -\131\040\066\000\171\240\240\042\153\214\325\362\141\322\270\054 -\313\202\112\060\015\006\011\052\206\110\206\367\015\001\001\013 -\005\000\003\202\001\001\000\061\003\242\141\013\037\164\350\162 -\066\306\155\371\115\236\372\042\250\341\201\126\317\315\273\237 -\352\253\221\031\070\257\252\174\025\115\363\266\243\215\245\364 -\216\366\104\251\247\350\041\225\255\076\000\142\026\210\360\002 -\272\374\141\043\346\063\233\060\172\153\066\142\173\255\004\043 -\204\130\145\342\333\053\212\347\045\123\067\142\123\137\274\332 -\001\142\051\242\246\047\161\346\072\042\176\301\157\035\225\160 -\040\112\007\064\337\352\377\025\200\345\272\327\172\330\133\165 -\174\005\172\051\107\176\100\250\061\023\167\315\100\073\264\121 -\107\172\056\021\343\107\021\336\235\146\320\213\325\124\146\372 -\203\125\352\174\302\051\211\033\351\157\263\316\342\005\204\311 -\057\076\170\205\142\156\311\137\301\170\143\164\130\300\110\030 -\014\231\071\353\244\314\032\265\171\132\215\025\234\330\024\015 -\366\172\007\127\307\042\203\005\055\074\233\045\046\075\030\263 -\251\103\174\310\310\253\144\217\016\243\277\234\033\235\060\333 -\332\320\031\056\252\074\361\373\063\200\166\344\315\255\031\117 -\005\047\216\023\241\156\302 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "T-TeleSec GlobalRoot Class 2" -# Issuer: CN=T-TeleSec GlobalRoot Class 2,OU=T-Systems Trust Center,O=T-Systems Enterprise Services GmbH,C=DE -# Serial Number: 1 (0x1) -# Subject: CN=T-TeleSec GlobalRoot Class 2,OU=T-Systems Trust Center,O=T-Systems Enterprise Services GmbH,C=DE -# Not Valid Before: Wed Oct 01 10:40:14 2008 -# Not Valid After : Sat Oct 01 23:59:59 2033 -# Fingerprint (SHA-256): 91:E2:F5:78:8D:58:10:EB:A7:BA:58:73:7D:E1:54:8A:8E:CA:CD:01:45:98:BC:0B:14:3E:04:1B:17:05:25:52 -# Fingerprint (SHA1): 59:0D:2D:7D:88:4F:40:2E:61:7E:A5:62:32:17:65:CF:17:D8:94:E9 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "T-TeleSec GlobalRoot Class 2" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\131\015\055\175\210\117\100\056\141\176\245\142\062\027\145\317 -\027\330\224\351 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\053\233\236\344\173\154\037\000\162\032\314\301\167\171\337\152 -END -CKA_ISSUER MULTILINE_OCTAL -\060\201\202\061\013\060\011\006\003\125\004\006\023\002\104\105 -\061\053\060\051\006\003\125\004\012\014\042\124\055\123\171\163 -\164\145\155\163\040\105\156\164\145\162\160\162\151\163\145\040 -\123\145\162\166\151\143\145\163\040\107\155\142\110\061\037\060 -\035\006\003\125\004\013\014\026\124\055\123\171\163\164\145\155 -\163\040\124\162\165\163\164\040\103\145\156\164\145\162\061\045 -\060\043\006\003\125\004\003\014\034\124\055\124\145\154\145\123 -\145\143\040\107\154\157\142\141\154\122\157\157\164\040\103\154 -\141\163\163\040\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\001 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Atos TrustedRoot 2011" -# -# Issuer: C=DE,O=Atos,CN=Atos TrustedRoot 2011 -# Serial Number:5c:33:cb:62:2c:5f:b3:32 -# Subject: C=DE,O=Atos,CN=Atos TrustedRoot 2011 -# Not Valid Before: Thu Jul 07 14:58:30 2011 -# Not Valid After : Tue Dec 31 23:59:59 2030 -# Fingerprint (SHA-256): F3:56:BE:A2:44:B7:A9:1E:B3:5D:53:CA:9A:D7:86:4A:CE:01:8E:2D:35:D5:F8:F9:6D:DF:68:A6:F4:1A:A4:74 -# Fingerprint (SHA1): 2B:B1:F5:3E:55:0C:1D:C5:F1:D4:E6:B7:6A:46:4B:55:06:02:AC:21 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Atos TrustedRoot 2011" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\074\061\036\060\034\006\003\125\004\003\014\025\101\164\157 -\163\040\124\162\165\163\164\145\144\122\157\157\164\040\062\060 -\061\061\061\015\060\013\006\003\125\004\012\014\004\101\164\157 -\163\061\013\060\011\006\003\125\004\006\023\002\104\105 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\074\061\036\060\034\006\003\125\004\003\014\025\101\164\157 -\163\040\124\162\165\163\164\145\144\122\157\157\164\040\062\060 -\061\061\061\015\060\013\006\003\125\004\012\014\004\101\164\157 -\163\061\013\060\011\006\003\125\004\006\023\002\104\105 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\010\134\063\313\142\054\137\263\062 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\003\167\060\202\002\137\240\003\002\001\002\002\010\134 -\063\313\142\054\137\263\062\060\015\006\011\052\206\110\206\367 -\015\001\001\013\005\000\060\074\061\036\060\034\006\003\125\004 -\003\014\025\101\164\157\163\040\124\162\165\163\164\145\144\122 -\157\157\164\040\062\060\061\061\061\015\060\013\006\003\125\004 -\012\014\004\101\164\157\163\061\013\060\011\006\003\125\004\006 -\023\002\104\105\060\036\027\015\061\061\060\067\060\067\061\064 -\065\070\063\060\132\027\015\063\060\061\062\063\061\062\063\065 -\071\065\071\132\060\074\061\036\060\034\006\003\125\004\003\014 -\025\101\164\157\163\040\124\162\165\163\164\145\144\122\157\157 -\164\040\062\060\061\061\061\015\060\013\006\003\125\004\012\014 -\004\101\164\157\163\061\013\060\011\006\003\125\004\006\023\002 -\104\105\060\202\001\042\060\015\006\011\052\206\110\206\367\015 -\001\001\001\005\000\003\202\001\017\000\060\202\001\012\002\202 -\001\001\000\225\205\073\227\157\052\073\056\073\317\246\363\051 -\065\276\317\030\254\076\252\331\370\115\240\076\032\107\271\274 -\232\337\362\376\314\076\107\350\172\226\302\044\216\065\364\251 -\014\374\202\375\155\301\162\142\047\275\352\153\353\347\212\314 -\124\076\220\120\317\200\324\225\373\350\265\202\324\024\305\266 -\251\125\045\127\333\261\120\366\260\140\144\131\172\151\317\003 -\267\157\015\276\312\076\157\164\162\352\252\060\052\163\142\276 -\111\221\141\310\021\376\016\003\052\367\152\040\334\002\025\015 -\136\025\152\374\343\202\301\265\305\235\144\011\154\243\131\230 -\007\047\307\033\226\053\141\164\161\154\103\361\367\065\211\020 -\340\236\354\125\241\067\042\242\207\004\005\054\107\175\264\034 -\271\142\051\146\050\312\267\341\223\365\244\224\003\231\271\160 -\205\265\346\110\352\215\120\374\331\336\314\157\007\016\335\013 -\162\235\200\060\026\007\225\077\050\016\375\305\165\117\123\326 -\164\232\264\044\056\216\002\221\317\166\305\233\036\125\164\234 -\170\041\261\360\055\361\013\237\302\325\226\030\037\360\124\042 -\172\214\007\002\003\001\000\001\243\175\060\173\060\035\006\003 -\125\035\016\004\026\004\024\247\245\006\261\054\246\011\140\356 -\321\227\351\160\256\274\073\031\154\333\041\060\017\006\003\125 -\035\023\001\001\377\004\005\060\003\001\001\377\060\037\006\003 -\125\035\043\004\030\060\026\200\024\247\245\006\261\054\246\011 -\140\356\321\227\351\160\256\274\073\031\154\333\041\060\030\006 -\003\125\035\040\004\021\060\017\060\015\006\013\053\006\001\004 -\001\260\055\003\004\001\001\060\016\006\003\125\035\017\001\001 -\377\004\004\003\002\001\206\060\015\006\011\052\206\110\206\367 -\015\001\001\013\005\000\003\202\001\001\000\046\167\064\333\224 -\110\206\052\101\235\054\076\006\220\140\304\214\254\013\124\270 -\037\271\173\323\007\071\344\372\076\173\262\075\116\355\237\043 -\275\227\363\153\134\357\356\375\100\246\337\241\223\241\012\206 -\254\357\040\320\171\001\275\170\367\031\330\044\061\064\004\001 -\246\272\025\232\303\047\334\330\117\017\314\030\143\377\231\017 -\016\221\153\165\026\341\041\374\330\046\307\107\267\246\317\130 -\162\161\176\272\341\115\225\107\073\311\257\155\241\264\301\354 -\211\366\264\017\070\265\342\144\334\045\317\246\333\353\232\134 -\231\241\305\010\336\375\346\332\325\326\132\105\014\304\267\302 -\265\024\357\264\021\377\016\025\265\365\365\333\306\275\353\132 -\247\360\126\042\251\074\145\124\306\025\250\275\206\236\315\203 -\226\150\172\161\201\211\341\013\341\352\021\033\150\010\314\151 -\236\354\236\101\236\104\062\046\172\342\207\012\161\075\353\344 -\132\244\322\333\305\315\306\336\140\177\271\363\117\104\222\357 -\052\267\030\076\247\031\331\013\175\261\067\101\102\260\272\140 -\035\362\376\011\021\260\360\207\173\247\235 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Atos TrustedRoot 2011" -# Issuer: C=DE,O=Atos,CN=Atos TrustedRoot 2011 -# Serial Number:5c:33:cb:62:2c:5f:b3:32 -# Subject: C=DE,O=Atos,CN=Atos TrustedRoot 2011 -# Not Valid Before: Thu Jul 07 14:58:30 2011 -# Not Valid After : Tue Dec 31 23:59:59 2030 -# Fingerprint (SHA-256): F3:56:BE:A2:44:B7:A9:1E:B3:5D:53:CA:9A:D7:86:4A:CE:01:8E:2D:35:D5:F8:F9:6D:DF:68:A6:F4:1A:A4:74 -# Fingerprint (SHA1): 2B:B1:F5:3E:55:0C:1D:C5:F1:D4:E6:B7:6A:46:4B:55:06:02:AC:21 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Atos TrustedRoot 2011" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\053\261\365\076\125\014\035\305\361\324\346\267\152\106\113\125 -\006\002\254\041 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\256\271\304\062\113\254\177\135\146\314\167\224\273\052\167\126 -END -CKA_ISSUER MULTILINE_OCTAL -\060\074\061\036\060\034\006\003\125\004\003\014\025\101\164\157 -\163\040\124\162\165\163\164\145\144\122\157\157\164\040\062\060 -\061\061\061\015\060\013\006\003\125\004\012\014\004\101\164\157 -\163\061\013\060\011\006\003\125\004\006\023\002\104\105 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\010\134\063\313\142\054\137\263\062 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "QuoVadis Root CA 1 G3" -# -# Issuer: CN=QuoVadis Root CA 1 G3,O=QuoVadis Limited,C=BM -# Serial Number:78:58:5f:2e:ad:2c:19:4b:e3:37:07:35:34:13:28:b5:96:d4:65:93 -# Subject: CN=QuoVadis Root CA 1 G3,O=QuoVadis Limited,C=BM -# Not Valid Before: Thu Jan 12 17:27:44 2012 -# Not Valid After : Sun Jan 12 17:27:44 2042 -# Fingerprint (SHA-256): 8A:86:6F:D1:B2:76:B5:7E:57:8E:92:1C:65:82:8A:2B:ED:58:E9:F2:F2:88:05:41:34:B7:F1:F4:BF:C9:CC:74 -# Fingerprint (SHA1): 1B:8E:EA:57:96:29:1A:C9:39:EA:B8:0A:81:1A:73:73:C0:93:79:67 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "QuoVadis Root CA 1 G3" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\110\061\013\060\011\006\003\125\004\006\023\002\102\115\061 -\031\060\027\006\003\125\004\012\023\020\121\165\157\126\141\144 -\151\163\040\114\151\155\151\164\145\144\061\036\060\034\006\003 -\125\004\003\023\025\121\165\157\126\141\144\151\163\040\122\157 -\157\164\040\103\101\040\061\040\107\063 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\110\061\013\060\011\006\003\125\004\006\023\002\102\115\061 -\031\060\027\006\003\125\004\012\023\020\121\165\157\126\141\144 -\151\163\040\114\151\155\151\164\145\144\061\036\060\034\006\003 -\125\004\003\023\025\121\165\157\126\141\144\151\163\040\122\157 -\157\164\040\103\101\040\061\040\107\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\170\130\137\056\255\054\031\113\343\067\007\065\064\023 -\050\265\226\324\145\223 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\140\060\202\003\110\240\003\002\001\002\002\024\170 -\130\137\056\255\054\031\113\343\067\007\065\064\023\050\265\226 -\324\145\223\060\015\006\011\052\206\110\206\367\015\001\001\013 -\005\000\060\110\061\013\060\011\006\003\125\004\006\023\002\102 -\115\061\031\060\027\006\003\125\004\012\023\020\121\165\157\126 -\141\144\151\163\040\114\151\155\151\164\145\144\061\036\060\034 -\006\003\125\004\003\023\025\121\165\157\126\141\144\151\163\040 -\122\157\157\164\040\103\101\040\061\040\107\063\060\036\027\015 -\061\062\060\061\061\062\061\067\062\067\064\064\132\027\015\064 -\062\060\061\061\062\061\067\062\067\064\064\132\060\110\061\013 -\060\011\006\003\125\004\006\023\002\102\115\061\031\060\027\006 -\003\125\004\012\023\020\121\165\157\126\141\144\151\163\040\114 -\151\155\151\164\145\144\061\036\060\034\006\003\125\004\003\023 -\025\121\165\157\126\141\144\151\163\040\122\157\157\164\040\103 -\101\040\061\040\107\063\060\202\002\042\060\015\006\011\052\206 -\110\206\367\015\001\001\001\005\000\003\202\002\017\000\060\202 -\002\012\002\202\002\001\000\240\276\120\020\216\351\362\154\100 -\264\004\234\205\271\061\312\334\055\344\021\251\004\074\033\125 -\301\347\130\060\035\044\264\303\357\205\336\214\054\341\301\075 -\337\202\346\117\255\107\207\154\354\133\111\301\112\325\273\217 -\354\207\254\177\202\232\206\354\075\003\231\122\001\322\065\236 -\254\332\360\123\311\146\074\324\254\002\001\332\044\323\073\250 -\002\106\257\244\034\343\370\163\130\166\267\366\016\220\015\265 -\360\317\314\372\371\306\114\345\303\206\060\012\215\027\176\065 -\353\305\337\273\016\234\300\215\207\343\210\070\205\147\372\076 -\307\253\340\023\234\005\030\230\317\223\365\261\222\264\374\043 -\323\317\325\304\047\111\340\236\074\233\010\243\213\135\052\041 -\340\374\071\252\123\332\175\176\317\032\011\123\274\135\005\004 -\317\241\112\217\213\166\202\015\241\370\322\307\024\167\133\220 -\066\007\201\233\076\006\372\122\136\143\305\246\000\376\245\351 -\122\033\122\265\222\071\162\003\011\142\275\260\140\026\156\246 -\335\045\302\003\146\335\363\004\321\100\342\116\213\206\364\157 -\345\203\240\047\204\136\004\301\365\220\275\060\075\304\357\250 -\151\274\070\233\244\244\226\321\142\332\151\300\001\226\256\313 -\304\121\064\352\014\252\377\041\216\131\217\112\134\344\141\232 -\247\322\351\052\170\215\121\075\072\025\356\242\131\216\251\134 -\336\305\371\220\042\345\210\105\161\335\221\231\154\172\237\075 -\075\230\174\136\366\276\026\150\240\136\256\013\043\374\132\017 -\252\042\166\055\311\241\020\035\344\323\104\043\220\210\237\306 -\052\346\327\365\232\263\130\036\057\060\211\010\033\124\242\265 -\230\043\354\010\167\034\225\135\141\321\313\211\234\137\242\112 -\221\232\357\041\252\111\026\010\250\275\141\050\061\311\164\255 -\205\366\331\305\261\213\321\345\020\062\115\137\213\040\072\074 -\111\037\063\205\131\015\333\313\011\165\103\151\163\373\153\161 -\175\360\337\304\114\175\306\243\056\310\225\171\313\163\242\216 -\116\115\044\373\136\344\004\276\162\033\246\047\055\111\132\231 -\172\327\134\011\040\267\177\224\271\117\361\015\034\136\210\102 -\033\021\267\347\221\333\236\154\364\152\337\214\006\230\003\255 -\314\050\357\245\107\363\123\002\003\001\000\001\243\102\060\100 -\060\017\006\003\125\035\023\001\001\377\004\005\060\003\001\001 -\377\060\016\006\003\125\035\017\001\001\377\004\004\003\002\001 -\006\060\035\006\003\125\035\016\004\026\004\024\243\227\326\363 -\136\242\020\341\253\105\237\074\027\144\074\356\001\160\234\314 -\060\015\006\011\052\206\110\206\367\015\001\001\013\005\000\003 -\202\002\001\000\030\372\133\165\374\076\172\307\137\167\307\312 -\337\317\137\303\022\304\100\135\324\062\252\270\152\327\325\025 -\025\106\230\043\245\346\220\133\030\231\114\343\255\102\243\202 -\061\066\210\315\351\373\304\004\226\110\213\001\307\215\001\317 -\133\063\006\226\106\146\164\035\117\355\301\266\271\264\015\141 -\314\143\176\327\056\167\214\226\034\052\043\150\153\205\127\166 -\160\063\023\376\341\117\246\043\167\030\372\032\214\350\275\145 -\311\317\077\364\311\027\334\353\307\274\300\004\056\055\106\057 -\151\146\303\033\217\376\354\076\323\312\224\277\166\012\045\015 -\251\173\002\034\251\320\073\137\013\300\201\072\075\144\341\277 -\247\055\116\275\115\304\330\051\306\042\030\320\305\254\162\002 -\202\077\252\072\242\072\042\227\061\335\010\143\303\165\024\271 -\140\050\055\133\150\340\026\251\146\202\043\121\365\353\123\330 -\061\233\173\351\267\235\113\353\210\026\317\371\135\070\212\111 -\060\217\355\361\353\031\364\167\032\061\030\115\147\124\154\057 -\157\145\371\333\075\354\041\354\136\364\364\213\312\140\145\124 -\321\161\144\364\371\246\243\201\063\066\063\161\360\244\170\137 -\116\255\203\041\336\064\111\215\350\131\254\235\362\166\132\066 -\362\023\364\257\340\011\307\141\052\154\367\340\235\256\273\206 -\112\050\157\056\356\264\171\315\220\063\303\263\166\372\365\360 -\154\235\001\220\372\236\220\366\234\162\317\107\332\303\037\344 -\065\040\123\362\124\321\337\141\203\246\002\342\045\070\336\205 -\062\055\136\163\220\122\135\102\304\316\075\113\341\371\031\204 -\035\325\242\120\314\101\373\101\024\303\275\326\311\132\243\143 -\146\002\200\275\005\072\073\107\234\354\000\046\114\365\210\121 -\277\250\043\177\030\007\260\013\355\213\046\241\144\323\141\112 -\353\134\237\336\263\257\147\003\263\037\335\155\135\151\150\151 -\253\136\072\354\174\151\274\307\073\205\116\236\025\271\264\025 -\117\303\225\172\130\327\311\154\351\154\271\363\051\143\136\264 -\054\360\055\075\355\132\145\340\251\133\100\302\110\231\201\155 -\236\037\006\052\074\022\264\213\017\233\242\044\360\246\215\326 -\172\340\113\266\144\226\143\225\204\302\112\315\034\056\044\207 -\063\140\345\303 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "QuoVadis Root CA 1 G3" -# Issuer: CN=QuoVadis Root CA 1 G3,O=QuoVadis Limited,C=BM -# Serial Number:78:58:5f:2e:ad:2c:19:4b:e3:37:07:35:34:13:28:b5:96:d4:65:93 -# Subject: CN=QuoVadis Root CA 1 G3,O=QuoVadis Limited,C=BM -# Not Valid Before: Thu Jan 12 17:27:44 2012 -# Not Valid After : Sun Jan 12 17:27:44 2042 -# Fingerprint (SHA-256): 8A:86:6F:D1:B2:76:B5:7E:57:8E:92:1C:65:82:8A:2B:ED:58:E9:F2:F2:88:05:41:34:B7:F1:F4:BF:C9:CC:74 -# Fingerprint (SHA1): 1B:8E:EA:57:96:29:1A:C9:39:EA:B8:0A:81:1A:73:73:C0:93:79:67 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "QuoVadis Root CA 1 G3" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\033\216\352\127\226\051\032\311\071\352\270\012\201\032\163\163 -\300\223\171\147 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\244\274\133\077\376\067\232\372\144\360\342\372\005\075\013\253 -END -CKA_ISSUER MULTILINE_OCTAL -\060\110\061\013\060\011\006\003\125\004\006\023\002\102\115\061 -\031\060\027\006\003\125\004\012\023\020\121\165\157\126\141\144 -\151\163\040\114\151\155\151\164\145\144\061\036\060\034\006\003 -\125\004\003\023\025\121\165\157\126\141\144\151\163\040\122\157 -\157\164\040\103\101\040\061\040\107\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\170\130\137\056\255\054\031\113\343\067\007\065\064\023 -\050\265\226\324\145\223 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "QuoVadis Root CA 2 G3" -# -# Issuer: CN=QuoVadis Root CA 2 G3,O=QuoVadis Limited,C=BM -# Serial Number:44:57:34:24:5b:81:89:9b:35:f2:ce:b8:2b:3b:5b:a7:26:f0:75:28 -# Subject: CN=QuoVadis Root CA 2 G3,O=QuoVadis Limited,C=BM -# Not Valid Before: Thu Jan 12 18:59:32 2012 -# Not Valid After : Sun Jan 12 18:59:32 2042 -# Fingerprint (SHA-256): 8F:E4:FB:0A:F9:3A:4D:0D:67:DB:0B:EB:B2:3E:37:C7:1B:F3:25:DC:BC:DD:24:0E:A0:4D:AF:58:B4:7E:18:40 -# Fingerprint (SHA1): 09:3C:61:F3:8B:8B:DC:7D:55:DF:75:38:02:05:00:E1:25:F5:C8:36 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "QuoVadis Root CA 2 G3" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\110\061\013\060\011\006\003\125\004\006\023\002\102\115\061 -\031\060\027\006\003\125\004\012\023\020\121\165\157\126\141\144 -\151\163\040\114\151\155\151\164\145\144\061\036\060\034\006\003 -\125\004\003\023\025\121\165\157\126\141\144\151\163\040\122\157 -\157\164\040\103\101\040\062\040\107\063 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\110\061\013\060\011\006\003\125\004\006\023\002\102\115\061 -\031\060\027\006\003\125\004\012\023\020\121\165\157\126\141\144 -\151\163\040\114\151\155\151\164\145\144\061\036\060\034\006\003 -\125\004\003\023\025\121\165\157\126\141\144\151\163\040\122\157 -\157\164\040\103\101\040\062\040\107\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\104\127\064\044\133\201\211\233\065\362\316\270\053\073 -\133\247\046\360\165\050 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\140\060\202\003\110\240\003\002\001\002\002\024\104 -\127\064\044\133\201\211\233\065\362\316\270\053\073\133\247\046 -\360\165\050\060\015\006\011\052\206\110\206\367\015\001\001\013 -\005\000\060\110\061\013\060\011\006\003\125\004\006\023\002\102 -\115\061\031\060\027\006\003\125\004\012\023\020\121\165\157\126 -\141\144\151\163\040\114\151\155\151\164\145\144\061\036\060\034 -\006\003\125\004\003\023\025\121\165\157\126\141\144\151\163\040 -\122\157\157\164\040\103\101\040\062\040\107\063\060\036\027\015 -\061\062\060\061\061\062\061\070\065\071\063\062\132\027\015\064 -\062\060\061\061\062\061\070\065\071\063\062\132\060\110\061\013 -\060\011\006\003\125\004\006\023\002\102\115\061\031\060\027\006 -\003\125\004\012\023\020\121\165\157\126\141\144\151\163\040\114 -\151\155\151\164\145\144\061\036\060\034\006\003\125\004\003\023 -\025\121\165\157\126\141\144\151\163\040\122\157\157\164\040\103 -\101\040\062\040\107\063\060\202\002\042\060\015\006\011\052\206 -\110\206\367\015\001\001\001\005\000\003\202\002\017\000\060\202 -\002\012\002\202\002\001\000\241\256\045\262\001\030\334\127\210 -\077\106\353\371\257\342\353\043\161\342\232\321\141\146\041\137 -\252\257\047\121\345\156\033\026\324\055\175\120\260\123\167\275 -\170\072\140\342\144\002\233\174\206\233\326\032\216\255\377\037 -\025\177\325\225\036\022\313\346\024\204\004\301\337\066\263\026 -\237\212\343\311\333\230\064\316\330\063\027\050\106\374\247\311 -\360\322\264\325\115\011\162\111\371\362\207\343\251\332\175\241 -\175\153\262\072\045\251\155\122\104\254\370\276\156\373\334\246 -\163\221\220\141\246\003\024\040\362\347\207\243\210\255\255\240 -\214\377\246\013\045\122\045\347\026\001\325\313\270\065\201\014 -\243\073\360\341\341\374\132\135\316\200\161\155\370\111\253\076 -\073\272\270\327\200\001\373\245\353\133\263\305\136\140\052\061 -\240\257\067\350\040\072\237\250\062\054\014\314\011\035\323\236 -\216\135\274\114\230\356\305\032\150\173\354\123\246\351\024\065 -\243\337\315\200\237\014\110\373\034\364\361\277\112\270\372\325 -\214\161\112\307\037\255\376\101\232\263\203\135\362\204\126\357 -\245\127\103\316\051\255\214\253\125\277\304\373\133\001\335\043 -\041\241\130\000\216\303\320\152\023\355\023\343\022\053\200\334 -\147\346\225\262\315\036\042\156\052\370\101\324\362\312\024\007 -\215\212\125\022\306\151\365\270\206\150\057\123\136\260\322\252 -\041\301\230\346\060\343\147\125\307\233\156\254\031\250\125\246 -\105\006\320\043\072\333\353\145\135\052\021\021\360\073\117\312 -\155\364\064\304\161\344\377\000\132\366\134\256\043\140\205\163 -\361\344\020\261\045\256\325\222\273\023\301\014\340\071\332\264 -\071\127\265\253\065\252\162\041\073\203\065\347\061\337\172\041 -\156\270\062\010\175\035\062\221\025\112\142\162\317\343\167\241 -\274\325\021\033\166\001\147\010\340\101\013\303\353\025\156\370 -\244\031\331\242\253\257\342\047\122\126\053\002\212\054\024\044 -\371\277\102\002\277\046\310\306\217\340\156\070\175\123\055\345 -\355\230\263\225\143\150\177\371\065\364\337\210\305\140\065\222 -\300\174\151\034\141\225\026\320\353\336\013\257\076\004\020\105 -\145\130\120\070\257\110\362\131\266\026\362\074\015\220\002\306 -\160\056\001\255\074\025\327\002\003\001\000\001\243\102\060\100 -\060\017\006\003\125\035\023\001\001\377\004\005\060\003\001\001 -\377\060\016\006\003\125\035\017\001\001\377\004\004\003\002\001 -\006\060\035\006\003\125\035\016\004\026\004\024\355\347\157\166 -\132\277\140\354\111\133\306\245\167\273\162\026\161\233\304\075 -\060\015\006\011\052\206\110\206\367\015\001\001\013\005\000\003 -\202\002\001\000\221\337\200\077\103\011\176\161\302\367\353\263 -\210\217\341\121\262\274\075\165\371\050\135\310\274\231\233\173 -\135\252\345\312\341\012\367\350\262\323\237\335\147\061\176\272 -\001\252\307\152\101\073\220\324\010\134\262\140\152\220\360\310 -\316\003\142\371\213\355\373\156\052\334\006\115\074\051\017\211 -\026\212\130\114\110\017\350\204\141\352\074\162\246\167\344\102 -\256\210\243\103\130\171\176\256\312\245\123\015\251\075\160\275 -\040\031\141\244\154\070\374\103\062\341\301\107\377\370\354\361 -\021\042\062\226\234\302\366\133\151\226\173\040\014\103\101\232 -\133\366\131\031\210\336\125\210\067\121\013\170\134\012\036\243 -\102\375\307\235\210\017\300\362\170\002\044\124\223\257\211\207 -\210\311\112\200\035\352\320\156\076\141\056\066\273\065\016\047 -\226\375\146\064\073\141\162\163\361\026\134\107\006\124\111\000 -\172\130\022\260\012\357\205\375\261\270\063\165\152\223\034\022 -\346\140\136\157\035\177\311\037\043\313\204\141\237\036\202\104 -\371\137\255\142\125\044\232\122\230\355\121\347\241\176\227\072 -\346\057\037\021\332\123\200\054\205\236\253\065\020\333\042\137 -\152\305\136\227\123\362\062\002\011\060\243\130\360\015\001\325 -\162\306\261\174\151\173\303\365\066\105\314\141\156\136\114\224 -\305\136\256\350\016\136\213\277\367\315\340\355\241\016\033\063 -\356\124\030\376\017\276\357\176\204\153\103\343\160\230\333\135 -\165\262\015\131\007\205\025\043\071\326\361\337\251\046\017\326 -\110\307\263\246\042\365\063\067\132\225\107\237\173\272\030\025 -\157\377\326\024\144\203\111\322\012\147\041\333\017\065\143\140 -\050\042\343\261\225\203\315\205\246\335\057\017\347\147\122\156 -\273\057\205\174\365\112\163\347\305\076\300\275\041\022\005\077 -\374\267\003\111\002\133\310\045\346\342\124\070\365\171\207\214 -\035\123\262\116\205\173\006\070\307\054\370\370\260\162\215\045 -\345\167\122\364\003\034\110\246\120\137\210\040\060\156\362\202 -\103\253\075\227\204\347\123\373\041\301\117\017\042\232\206\270 -\131\052\366\107\075\031\210\055\350\205\341\236\354\205\010\152 -\261\154\064\311\035\354\110\053\073\170\355\146\304\216\171\151 -\203\336\177\214 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "QuoVadis Root CA 2 G3" -# Issuer: CN=QuoVadis Root CA 2 G3,O=QuoVadis Limited,C=BM -# Serial Number:44:57:34:24:5b:81:89:9b:35:f2:ce:b8:2b:3b:5b:a7:26:f0:75:28 -# Subject: CN=QuoVadis Root CA 2 G3,O=QuoVadis Limited,C=BM -# Not Valid Before: Thu Jan 12 18:59:32 2012 -# Not Valid After : Sun Jan 12 18:59:32 2042 -# Fingerprint (SHA-256): 8F:E4:FB:0A:F9:3A:4D:0D:67:DB:0B:EB:B2:3E:37:C7:1B:F3:25:DC:BC:DD:24:0E:A0:4D:AF:58:B4:7E:18:40 -# Fingerprint (SHA1): 09:3C:61:F3:8B:8B:DC:7D:55:DF:75:38:02:05:00:E1:25:F5:C8:36 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "QuoVadis Root CA 2 G3" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\011\074\141\363\213\213\334\175\125\337\165\070\002\005\000\341 -\045\365\310\066 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\257\014\206\156\277\100\055\177\013\076\022\120\272\022\075\006 -END -CKA_ISSUER MULTILINE_OCTAL -\060\110\061\013\060\011\006\003\125\004\006\023\002\102\115\061 -\031\060\027\006\003\125\004\012\023\020\121\165\157\126\141\144 -\151\163\040\114\151\155\151\164\145\144\061\036\060\034\006\003 -\125\004\003\023\025\121\165\157\126\141\144\151\163\040\122\157 -\157\164\040\103\101\040\062\040\107\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\104\127\064\044\133\201\211\233\065\362\316\270\053\073 -\133\247\046\360\165\050 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "QuoVadis Root CA 3 G3" -# -# Issuer: CN=QuoVadis Root CA 3 G3,O=QuoVadis Limited,C=BM -# Serial Number:2e:f5:9b:02:28:a7:db:7a:ff:d5:a3:a9:ee:bd:03:a0:cf:12:6a:1d -# Subject: CN=QuoVadis Root CA 3 G3,O=QuoVadis Limited,C=BM -# Not Valid Before: Thu Jan 12 20:26:32 2012 -# Not Valid After : Sun Jan 12 20:26:32 2042 -# Fingerprint (SHA-256): 88:EF:81:DE:20:2E:B0:18:45:2E:43:F8:64:72:5C:EA:5F:BD:1F:C2:D9:D2:05:73:07:09:C5:D8:B8:69:0F:46 -# Fingerprint (SHA1): 48:12:BD:92:3C:A8:C4:39:06:E7:30:6D:27:96:E6:A4:CF:22:2E:7D -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "QuoVadis Root CA 3 G3" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\110\061\013\060\011\006\003\125\004\006\023\002\102\115\061 -\031\060\027\006\003\125\004\012\023\020\121\165\157\126\141\144 -\151\163\040\114\151\155\151\164\145\144\061\036\060\034\006\003 -\125\004\003\023\025\121\165\157\126\141\144\151\163\040\122\157 -\157\164\040\103\101\040\063\040\107\063 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\110\061\013\060\011\006\003\125\004\006\023\002\102\115\061 -\031\060\027\006\003\125\004\012\023\020\121\165\157\126\141\144 -\151\163\040\114\151\155\151\164\145\144\061\036\060\034\006\003 -\125\004\003\023\025\121\165\157\126\141\144\151\163\040\122\157 -\157\164\040\103\101\040\063\040\107\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\056\365\233\002\050\247\333\172\377\325\243\251\356\275 -\003\240\317\022\152\035 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\140\060\202\003\110\240\003\002\001\002\002\024\056 -\365\233\002\050\247\333\172\377\325\243\251\356\275\003\240\317 -\022\152\035\060\015\006\011\052\206\110\206\367\015\001\001\013 -\005\000\060\110\061\013\060\011\006\003\125\004\006\023\002\102 -\115\061\031\060\027\006\003\125\004\012\023\020\121\165\157\126 -\141\144\151\163\040\114\151\155\151\164\145\144\061\036\060\034 -\006\003\125\004\003\023\025\121\165\157\126\141\144\151\163\040 -\122\157\157\164\040\103\101\040\063\040\107\063\060\036\027\015 -\061\062\060\061\061\062\062\060\062\066\063\062\132\027\015\064 -\062\060\061\061\062\062\060\062\066\063\062\132\060\110\061\013 -\060\011\006\003\125\004\006\023\002\102\115\061\031\060\027\006 -\003\125\004\012\023\020\121\165\157\126\141\144\151\163\040\114 -\151\155\151\164\145\144\061\036\060\034\006\003\125\004\003\023 -\025\121\165\157\126\141\144\151\163\040\122\157\157\164\040\103 -\101\040\063\040\107\063\060\202\002\042\060\015\006\011\052\206 -\110\206\367\015\001\001\001\005\000\003\202\002\017\000\060\202 -\002\012\002\202\002\001\000\263\313\016\020\147\216\352\024\227 -\247\062\052\012\126\066\177\150\114\307\263\157\072\043\024\221 -\377\031\177\245\312\254\356\263\166\235\172\351\213\033\253\153 -\061\333\372\013\123\114\257\305\245\032\171\074\212\114\377\254 -\337\045\336\116\331\202\062\013\104\336\312\333\214\254\243\156 -\026\203\073\246\144\113\062\211\373\026\026\070\176\353\103\342 -\323\164\112\302\142\012\163\012\335\111\263\127\322\260\012\205 -\235\161\074\336\243\313\300\062\363\001\071\040\103\033\065\321 -\123\263\261\356\305\223\151\202\076\026\265\050\106\241\336\352 -\211\011\355\103\270\005\106\212\206\365\131\107\276\033\157\001 -\041\020\271\375\251\322\050\312\020\071\011\312\023\066\317\234 -\255\255\100\164\171\053\002\077\064\377\372\040\151\175\323\356 -\141\365\272\263\347\060\320\067\043\206\162\141\105\051\110\131 -\150\157\167\246\056\201\276\007\115\157\257\316\304\105\023\221 -\024\160\006\217\037\237\370\207\151\261\016\357\303\211\031\353 -\352\034\141\374\172\154\212\334\326\003\013\236\046\272\022\335 -\324\124\071\253\046\243\063\352\165\201\332\055\315\017\117\344 -\003\321\357\025\227\033\153\220\305\002\220\223\146\002\041\261 -\107\336\213\232\112\200\271\125\217\265\242\057\300\326\063\147 -\332\176\304\247\264\004\104\353\107\373\346\130\271\367\014\360 -\173\053\261\300\160\051\303\100\142\055\073\110\151\334\043\074 -\110\353\173\011\171\251\155\332\250\060\230\317\200\162\003\210 -\246\133\106\256\162\171\174\010\003\041\145\256\267\341\034\245 -\261\052\242\061\336\146\004\367\300\164\350\161\336\377\075\131 -\314\226\046\022\213\205\225\127\032\253\153\165\013\104\075\021 -\050\074\173\141\267\342\217\147\117\345\354\074\114\140\200\151 -\127\070\036\001\133\215\125\350\307\337\300\314\167\043\064\111 -\165\174\366\230\021\353\055\336\355\101\056\024\005\002\177\340 -\376\040\353\065\347\021\254\042\316\127\075\336\311\060\155\020 -\003\205\315\361\377\214\026\265\301\262\076\210\154\140\177\220 -\117\225\367\366\055\255\001\071\007\004\372\165\200\175\277\111 -\120\355\357\311\304\174\034\353\200\176\333\266\320\335\023\376 -\311\323\234\327\262\227\251\002\003\001\000\001\243\102\060\100 -\060\017\006\003\125\035\023\001\001\377\004\005\060\003\001\001 -\377\060\016\006\003\125\035\017\001\001\377\004\004\003\002\001 -\006\060\035\006\003\125\035\016\004\026\004\024\306\027\320\274 -\250\352\002\103\362\033\006\231\135\053\220\040\271\327\234\344 -\060\015\006\011\052\206\110\206\367\015\001\001\013\005\000\003 -\202\002\001\000\064\141\331\126\265\022\207\125\115\335\243\065 -\061\106\273\244\007\162\274\137\141\142\350\245\373\013\067\261 -\074\266\263\372\051\235\177\002\365\244\311\250\223\267\172\161 -\050\151\217\163\341\122\220\332\325\276\072\345\267\166\152\126 -\200\041\337\135\346\351\072\236\345\076\366\242\151\307\052\012 -\260\030\107\334\040\160\175\122\243\076\131\174\301\272\311\310 -\025\100\141\312\162\326\160\254\322\267\360\034\344\206\051\360 -\316\357\150\143\320\265\040\212\025\141\232\176\206\230\264\311 -\302\166\373\314\272\060\026\314\243\141\306\164\023\345\153\357 -\243\025\352\003\376\023\213\144\344\323\301\322\350\204\373\111 -\321\020\115\171\146\353\252\375\364\215\061\036\160\024\255\334 -\336\147\023\114\201\025\141\274\267\331\221\167\161\031\201\140 -\273\360\130\245\265\234\013\367\217\042\125\047\300\113\001\155 -\073\231\015\324\035\233\143\147\057\320\356\015\312\146\274\224 -\117\246\255\355\374\356\143\254\127\077\145\045\317\262\206\217 -\320\010\377\270\166\024\156\336\345\047\354\253\170\265\123\271 -\266\077\350\040\371\322\250\276\141\106\312\207\214\204\363\371 -\361\240\150\233\042\036\201\046\233\020\004\221\161\300\006\037 -\334\240\323\271\126\247\343\230\055\177\203\235\337\214\053\234 -\062\216\062\224\360\001\074\042\052\237\103\302\056\303\230\071 -\007\070\173\374\136\000\102\037\363\062\046\171\203\204\366\345 -\360\301\121\022\300\013\036\004\043\014\124\245\114\057\111\305 -\112\321\266\156\140\015\153\374\153\213\205\044\144\267\211\016 -\253\045\107\133\074\317\176\111\275\307\351\012\306\332\367\176 -\016\027\010\323\110\227\320\161\222\360\017\071\076\064\152\034 -\175\330\362\042\256\273\151\364\063\264\246\110\125\321\017\016 -\046\350\354\266\013\055\247\205\065\315\375\131\310\237\321\315 -\076\132\051\064\271\075\204\316\261\145\324\131\221\221\126\165 -\041\301\167\236\371\172\341\140\235\323\255\004\030\364\174\353 -\136\223\217\123\112\042\051\370\110\053\076\115\206\254\133\177 -\313\006\231\131\140\330\130\145\225\215\104\321\367\177\176\047 -\177\175\256\200\365\007\114\266\076\234\161\124\231\004\113\375 -\130\371\230\364 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "QuoVadis Root CA 3 G3" -# Issuer: CN=QuoVadis Root CA 3 G3,O=QuoVadis Limited,C=BM -# Serial Number:2e:f5:9b:02:28:a7:db:7a:ff:d5:a3:a9:ee:bd:03:a0:cf:12:6a:1d -# Subject: CN=QuoVadis Root CA 3 G3,O=QuoVadis Limited,C=BM -# Not Valid Before: Thu Jan 12 20:26:32 2012 -# Not Valid After : Sun Jan 12 20:26:32 2042 -# Fingerprint (SHA-256): 88:EF:81:DE:20:2E:B0:18:45:2E:43:F8:64:72:5C:EA:5F:BD:1F:C2:D9:D2:05:73:07:09:C5:D8:B8:69:0F:46 -# Fingerprint (SHA1): 48:12:BD:92:3C:A8:C4:39:06:E7:30:6D:27:96:E6:A4:CF:22:2E:7D -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "QuoVadis Root CA 3 G3" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\110\022\275\222\074\250\304\071\006\347\060\155\047\226\346\244 -\317\042\056\175 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\337\175\271\255\124\157\150\241\337\211\127\003\227\103\260\327 -END -CKA_ISSUER MULTILINE_OCTAL -\060\110\061\013\060\011\006\003\125\004\006\023\002\102\115\061 -\031\060\027\006\003\125\004\012\023\020\121\165\157\126\141\144 -\151\163\040\114\151\155\151\164\145\144\061\036\060\034\006\003 -\125\004\003\023\025\121\165\157\126\141\144\151\163\040\122\157 -\157\164\040\103\101\040\063\040\107\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\056\365\233\002\050\247\333\172\377\325\243\251\356\275 -\003\240\317\022\152\035 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "DigiCert Assured ID Root G2" -# -# Issuer: CN=DigiCert Assured ID Root G2,OU=www.digicert.com,O=DigiCert Inc,C=US -# Serial Number:0b:93:1c:3a:d6:39:67:ea:67:23:bf:c3:af:9a:f4:4b -# Subject: CN=DigiCert Assured ID Root G2,OU=www.digicert.com,O=DigiCert Inc,C=US -# Not Valid Before: Thu Aug 01 12:00:00 2013 -# Not Valid After : Fri Jan 15 12:00:00 2038 -# Fingerprint (SHA-256): 7D:05:EB:B6:82:33:9F:8C:94:51:EE:09:4E:EB:FE:FA:79:53:A1:14:ED:B2:F4:49:49:45:2F:AB:7D:2F:C1:85 -# Fingerprint (SHA1): A1:4B:48:D9:43:EE:0A:0E:40:90:4F:3C:E0:A4:C0:91:93:51:5D:3F -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "DigiCert Assured ID Root G2" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\145\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\025\060\023\006\003\125\004\012\023\014\104\151\147\151\103\145 -\162\164\040\111\156\143\061\031\060\027\006\003\125\004\013\023 -\020\167\167\167\056\144\151\147\151\143\145\162\164\056\143\157 -\155\061\044\060\042\006\003\125\004\003\023\033\104\151\147\151 -\103\145\162\164\040\101\163\163\165\162\145\144\040\111\104\040 -\122\157\157\164\040\107\062 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\145\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\025\060\023\006\003\125\004\012\023\014\104\151\147\151\103\145 -\162\164\040\111\156\143\061\031\060\027\006\003\125\004\013\023 -\020\167\167\167\056\144\151\147\151\143\145\162\164\056\143\157 -\155\061\044\060\042\006\003\125\004\003\023\033\104\151\147\151 -\103\145\162\164\040\101\163\163\165\162\145\144\040\111\104\040 -\122\157\157\164\040\107\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\013\223\034\072\326\071\147\352\147\043\277\303\257\232 -\364\113 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\003\226\060\202\002\176\240\003\002\001\002\002\020\013 -\223\034\072\326\071\147\352\147\043\277\303\257\232\364\113\060 -\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060\145 -\061\013\060\011\006\003\125\004\006\023\002\125\123\061\025\060 -\023\006\003\125\004\012\023\014\104\151\147\151\103\145\162\164 -\040\111\156\143\061\031\060\027\006\003\125\004\013\023\020\167 -\167\167\056\144\151\147\151\143\145\162\164\056\143\157\155\061 -\044\060\042\006\003\125\004\003\023\033\104\151\147\151\103\145 -\162\164\040\101\163\163\165\162\145\144\040\111\104\040\122\157 -\157\164\040\107\062\060\036\027\015\061\063\060\070\060\061\061 -\062\060\060\060\060\132\027\015\063\070\060\061\061\065\061\062 -\060\060\060\060\132\060\145\061\013\060\011\006\003\125\004\006 -\023\002\125\123\061\025\060\023\006\003\125\004\012\023\014\104 -\151\147\151\103\145\162\164\040\111\156\143\061\031\060\027\006 -\003\125\004\013\023\020\167\167\167\056\144\151\147\151\143\145 -\162\164\056\143\157\155\061\044\060\042\006\003\125\004\003\023 -\033\104\151\147\151\103\145\162\164\040\101\163\163\165\162\145 -\144\040\111\104\040\122\157\157\164\040\107\062\060\202\001\042 -\060\015\006\011\052\206\110\206\367\015\001\001\001\005\000\003 -\202\001\017\000\060\202\001\012\002\202\001\001\000\331\347\050 -\057\122\077\066\162\111\210\223\064\363\370\152\036\061\124\200 -\237\255\124\101\265\107\337\226\250\324\257\200\055\271\012\317 -\165\375\211\245\175\044\372\343\042\014\053\274\225\027\013\063 -\277\031\115\101\006\220\000\275\014\115\020\376\007\265\347\034 -\156\042\125\061\145\227\275\323\027\322\036\142\363\333\352\154 -\120\214\077\204\014\226\317\267\313\003\340\312\155\241\024\114 -\033\211\335\355\000\260\122\174\257\221\154\261\070\023\321\351 -\022\010\300\000\260\034\053\021\332\167\160\066\233\256\316\171 -\207\334\202\160\346\011\164\160\125\151\257\243\150\237\277\335 -\266\171\263\362\235\160\051\125\364\253\377\225\141\363\311\100 -\157\035\321\276\223\273\323\210\052\273\235\277\162\132\126\161 -\073\077\324\363\321\012\376\050\357\243\356\331\231\257\003\323 -\217\140\267\362\222\241\261\275\211\211\037\060\315\303\246\056 -\142\063\256\026\002\167\104\132\347\201\012\074\247\104\056\171 -\270\077\004\274\134\240\207\341\033\257\121\216\315\354\054\372 -\370\376\155\360\072\174\252\213\344\147\225\061\215\002\003\001 -\000\001\243\102\060\100\060\017\006\003\125\035\023\001\001\377 -\004\005\060\003\001\001\377\060\016\006\003\125\035\017\001\001 -\377\004\004\003\002\001\206\060\035\006\003\125\035\016\004\026 -\004\024\316\303\112\271\231\125\362\270\333\140\277\251\176\275 -\126\265\227\066\247\326\060\015\006\011\052\206\110\206\367\015 -\001\001\013\005\000\003\202\001\001\000\312\245\125\214\343\310 -\101\156\151\047\247\165\021\357\074\206\066\157\322\235\306\170 -\070\035\151\226\242\222\151\056\070\154\233\175\004\324\211\245 -\261\061\067\212\311\041\314\253\154\315\213\034\232\326\277\110 -\322\062\146\301\212\300\363\057\072\357\300\343\324\221\206\321 -\120\343\003\333\163\167\157\112\071\123\355\336\046\307\265\175 -\257\053\102\321\165\142\343\112\053\002\307\120\113\340\151\342 -\226\154\016\104\146\020\104\217\255\005\353\370\171\254\246\033 -\350\067\064\235\123\311\141\252\242\122\257\112\160\026\206\302 -\072\310\261\023\160\066\330\317\356\364\012\064\325\133\114\375 -\007\234\242\272\331\001\162\134\363\115\301\335\016\261\034\015 -\304\143\276\255\364\024\373\211\354\242\101\016\114\314\310\127 -\100\320\156\003\252\315\014\216\211\231\231\154\360\074\060\257 -\070\337\157\274\243\276\051\040\047\253\164\377\023\042\170\336 -\227\122\125\036\203\265\124\040\003\356\256\300\117\126\336\067 -\314\303\177\252\004\047\273\323\167\270\142\333\027\174\234\050 -\042\023\163\154\317\046\365\212\051\347 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "DigiCert Assured ID Root G2" -# Issuer: CN=DigiCert Assured ID Root G2,OU=www.digicert.com,O=DigiCert Inc,C=US -# Serial Number:0b:93:1c:3a:d6:39:67:ea:67:23:bf:c3:af:9a:f4:4b -# Subject: CN=DigiCert Assured ID Root G2,OU=www.digicert.com,O=DigiCert Inc,C=US -# Not Valid Before: Thu Aug 01 12:00:00 2013 -# Not Valid After : Fri Jan 15 12:00:00 2038 -# Fingerprint (SHA-256): 7D:05:EB:B6:82:33:9F:8C:94:51:EE:09:4E:EB:FE:FA:79:53:A1:14:ED:B2:F4:49:49:45:2F:AB:7D:2F:C1:85 -# Fingerprint (SHA1): A1:4B:48:D9:43:EE:0A:0E:40:90:4F:3C:E0:A4:C0:91:93:51:5D:3F -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "DigiCert Assured ID Root G2" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\241\113\110\331\103\356\012\016\100\220\117\074\340\244\300\221 -\223\121\135\077 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\222\070\271\370\143\044\202\145\054\127\063\346\376\201\217\235 -END -CKA_ISSUER MULTILINE_OCTAL -\060\145\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\025\060\023\006\003\125\004\012\023\014\104\151\147\151\103\145 -\162\164\040\111\156\143\061\031\060\027\006\003\125\004\013\023 -\020\167\167\167\056\144\151\147\151\143\145\162\164\056\143\157 -\155\061\044\060\042\006\003\125\004\003\023\033\104\151\147\151 -\103\145\162\164\040\101\163\163\165\162\145\144\040\111\104\040 -\122\157\157\164\040\107\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\013\223\034\072\326\071\147\352\147\043\277\303\257\232 -\364\113 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "DigiCert Assured ID Root G3" -# -# Issuer: CN=DigiCert Assured ID Root G3,OU=www.digicert.com,O=DigiCert Inc,C=US -# Serial Number:0b:a1:5a:fa:1d:df:a0:b5:49:44:af:cd:24:a0:6c:ec -# Subject: CN=DigiCert Assured ID Root G3,OU=www.digicert.com,O=DigiCert Inc,C=US -# Not Valid Before: Thu Aug 01 12:00:00 2013 -# Not Valid After : Fri Jan 15 12:00:00 2038 -# Fingerprint (SHA-256): 7E:37:CB:8B:4C:47:09:0C:AB:36:55:1B:A6:F4:5D:B8:40:68:0F:BA:16:6A:95:2D:B1:00:71:7F:43:05:3F:C2 -# Fingerprint (SHA1): F5:17:A2:4F:9A:48:C6:C9:F8:A2:00:26:9F:DC:0F:48:2C:AB:30:89 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "DigiCert Assured ID Root G3" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\145\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\025\060\023\006\003\125\004\012\023\014\104\151\147\151\103\145 -\162\164\040\111\156\143\061\031\060\027\006\003\125\004\013\023 -\020\167\167\167\056\144\151\147\151\143\145\162\164\056\143\157 -\155\061\044\060\042\006\003\125\004\003\023\033\104\151\147\151 -\103\145\162\164\040\101\163\163\165\162\145\144\040\111\104\040 -\122\157\157\164\040\107\063 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\145\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\025\060\023\006\003\125\004\012\023\014\104\151\147\151\103\145 -\162\164\040\111\156\143\061\031\060\027\006\003\125\004\013\023 -\020\167\167\167\056\144\151\147\151\143\145\162\164\056\143\157 -\155\061\044\060\042\006\003\125\004\003\023\033\104\151\147\151 -\103\145\162\164\040\101\163\163\165\162\145\144\040\111\104\040 -\122\157\157\164\040\107\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\013\241\132\372\035\337\240\265\111\104\257\315\044\240 -\154\354 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\106\060\202\001\315\240\003\002\001\002\002\020\013 -\241\132\372\035\337\240\265\111\104\257\315\044\240\154\354\060 -\012\006\010\052\206\110\316\075\004\003\003\060\145\061\013\060 -\011\006\003\125\004\006\023\002\125\123\061\025\060\023\006\003 -\125\004\012\023\014\104\151\147\151\103\145\162\164\040\111\156 -\143\061\031\060\027\006\003\125\004\013\023\020\167\167\167\056 -\144\151\147\151\143\145\162\164\056\143\157\155\061\044\060\042 -\006\003\125\004\003\023\033\104\151\147\151\103\145\162\164\040 -\101\163\163\165\162\145\144\040\111\104\040\122\157\157\164\040 -\107\063\060\036\027\015\061\063\060\070\060\061\061\062\060\060 -\060\060\132\027\015\063\070\060\061\061\065\061\062\060\060\060 -\060\132\060\145\061\013\060\011\006\003\125\004\006\023\002\125 -\123\061\025\060\023\006\003\125\004\012\023\014\104\151\147\151 -\103\145\162\164\040\111\156\143\061\031\060\027\006\003\125\004 -\013\023\020\167\167\167\056\144\151\147\151\143\145\162\164\056 -\143\157\155\061\044\060\042\006\003\125\004\003\023\033\104\151 -\147\151\103\145\162\164\040\101\163\163\165\162\145\144\040\111 -\104\040\122\157\157\164\040\107\063\060\166\060\020\006\007\052 -\206\110\316\075\002\001\006\005\053\201\004\000\042\003\142\000 -\004\031\347\274\254\104\145\355\315\270\077\130\373\215\261\127 -\251\104\055\005\025\362\357\013\377\020\164\237\265\142\122\137 -\146\176\037\345\334\033\105\171\013\314\306\123\012\235\215\135 -\002\331\251\131\336\002\132\366\225\052\016\215\070\112\212\111 -\306\274\306\003\070\007\137\125\332\176\011\156\342\177\136\320 -\105\040\017\131\166\020\326\240\044\360\055\336\066\362\154\051 -\071\243\102\060\100\060\017\006\003\125\035\023\001\001\377\004 -\005\060\003\001\001\377\060\016\006\003\125\035\017\001\001\377 -\004\004\003\002\001\206\060\035\006\003\125\035\016\004\026\004 -\024\313\320\275\251\341\230\005\121\241\115\067\242\203\171\316 -\215\035\052\344\204\060\012\006\010\052\206\110\316\075\004\003 -\003\003\147\000\060\144\002\060\045\244\201\105\002\153\022\113 -\165\164\117\310\043\343\160\362\165\162\336\174\211\360\317\221 -\162\141\236\136\020\222\131\126\271\203\307\020\347\070\351\130 -\046\066\175\325\344\064\206\071\002\060\174\066\123\360\060\345 -\142\143\072\231\342\266\243\073\233\064\372\036\332\020\222\161 -\136\221\023\247\335\244\156\222\314\062\326\365\041\146\307\057 -\352\226\143\152\145\105\222\225\001\264 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "DigiCert Assured ID Root G3" -# Issuer: CN=DigiCert Assured ID Root G3,OU=www.digicert.com,O=DigiCert Inc,C=US -# Serial Number:0b:a1:5a:fa:1d:df:a0:b5:49:44:af:cd:24:a0:6c:ec -# Subject: CN=DigiCert Assured ID Root G3,OU=www.digicert.com,O=DigiCert Inc,C=US -# Not Valid Before: Thu Aug 01 12:00:00 2013 -# Not Valid After : Fri Jan 15 12:00:00 2038 -# Fingerprint (SHA-256): 7E:37:CB:8B:4C:47:09:0C:AB:36:55:1B:A6:F4:5D:B8:40:68:0F:BA:16:6A:95:2D:B1:00:71:7F:43:05:3F:C2 -# Fingerprint (SHA1): F5:17:A2:4F:9A:48:C6:C9:F8:A2:00:26:9F:DC:0F:48:2C:AB:30:89 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "DigiCert Assured ID Root G3" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\365\027\242\117\232\110\306\311\370\242\000\046\237\334\017\110 -\054\253\060\211 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\174\177\145\061\014\201\337\215\272\076\231\342\134\255\156\373 -END -CKA_ISSUER MULTILINE_OCTAL -\060\145\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\025\060\023\006\003\125\004\012\023\014\104\151\147\151\103\145 -\162\164\040\111\156\143\061\031\060\027\006\003\125\004\013\023 -\020\167\167\167\056\144\151\147\151\143\145\162\164\056\143\157 -\155\061\044\060\042\006\003\125\004\003\023\033\104\151\147\151 -\103\145\162\164\040\101\163\163\165\162\145\144\040\111\104\040 -\122\157\157\164\040\107\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\013\241\132\372\035\337\240\265\111\104\257\315\044\240 -\154\354 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "DigiCert Global Root G2" -# -# Issuer: CN=DigiCert Global Root G2,OU=www.digicert.com,O=DigiCert Inc,C=US -# Serial Number:03:3a:f1:e6:a7:11:a9:a0:bb:28:64:b1:1d:09:fa:e5 -# Subject: CN=DigiCert Global Root G2,OU=www.digicert.com,O=DigiCert Inc,C=US -# Not Valid Before: Thu Aug 01 12:00:00 2013 -# Not Valid After : Fri Jan 15 12:00:00 2038 -# Fingerprint (SHA-256): CB:3C:CB:B7:60:31:E5:E0:13:8F:8D:D3:9A:23:F9:DE:47:FF:C3:5E:43:C1:14:4C:EA:27:D4:6A:5A:B1:CB:5F -# Fingerprint (SHA1): DF:3C:24:F9:BF:D6:66:76:1B:26:80:73:FE:06:D1:CC:8D:4F:82:A4 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "DigiCert Global Root G2" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\141\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\025\060\023\006\003\125\004\012\023\014\104\151\147\151\103\145 -\162\164\040\111\156\143\061\031\060\027\006\003\125\004\013\023 -\020\167\167\167\056\144\151\147\151\143\145\162\164\056\143\157 -\155\061\040\060\036\006\003\125\004\003\023\027\104\151\147\151 -\103\145\162\164\040\107\154\157\142\141\154\040\122\157\157\164 -\040\107\062 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\141\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\025\060\023\006\003\125\004\012\023\014\104\151\147\151\103\145 -\162\164\040\111\156\143\061\031\060\027\006\003\125\004\013\023 -\020\167\167\167\056\144\151\147\151\143\145\162\164\056\143\157 -\155\061\040\060\036\006\003\125\004\003\023\027\104\151\147\151 -\103\145\162\164\040\107\154\157\142\141\154\040\122\157\157\164 -\040\107\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\003\072\361\346\247\021\251\240\273\050\144\261\035\011 -\372\345 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\003\216\060\202\002\166\240\003\002\001\002\002\020\003 -\072\361\346\247\021\251\240\273\050\144\261\035\011\372\345\060 -\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060\141 -\061\013\060\011\006\003\125\004\006\023\002\125\123\061\025\060 -\023\006\003\125\004\012\023\014\104\151\147\151\103\145\162\164 -\040\111\156\143\061\031\060\027\006\003\125\004\013\023\020\167 -\167\167\056\144\151\147\151\143\145\162\164\056\143\157\155\061 -\040\060\036\006\003\125\004\003\023\027\104\151\147\151\103\145 -\162\164\040\107\154\157\142\141\154\040\122\157\157\164\040\107 -\062\060\036\027\015\061\063\060\070\060\061\061\062\060\060\060 -\060\132\027\015\063\070\060\061\061\065\061\062\060\060\060\060 -\132\060\141\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\025\060\023\006\003\125\004\012\023\014\104\151\147\151\103 -\145\162\164\040\111\156\143\061\031\060\027\006\003\125\004\013 -\023\020\167\167\167\056\144\151\147\151\143\145\162\164\056\143 -\157\155\061\040\060\036\006\003\125\004\003\023\027\104\151\147 -\151\103\145\162\164\040\107\154\157\142\141\154\040\122\157\157 -\164\040\107\062\060\202\001\042\060\015\006\011\052\206\110\206 -\367\015\001\001\001\005\000\003\202\001\017\000\060\202\001\012 -\002\202\001\001\000\273\067\315\064\334\173\153\311\262\150\220 -\255\112\165\377\106\272\041\012\010\215\365\031\124\311\373\210 -\333\363\256\362\072\211\221\074\172\346\253\006\032\153\317\254 -\055\350\136\011\044\104\272\142\232\176\326\243\250\176\340\124 -\165\040\005\254\120\267\234\143\032\154\060\334\332\037\031\261 -\327\036\336\375\327\340\313\224\203\067\256\354\037\103\116\335 -\173\054\322\275\056\245\057\344\251\270\255\072\324\231\244\266 -\045\351\233\153\000\140\222\140\377\117\041\111\030\367\147\220 -\253\141\006\234\217\362\272\351\264\351\222\062\153\265\363\127 -\350\135\033\315\214\035\253\225\004\225\111\363\065\055\226\343 -\111\155\335\167\343\373\111\113\264\254\125\007\251\217\225\263 -\264\043\273\114\155\105\360\366\251\262\225\060\264\375\114\125 -\214\047\112\127\024\174\202\235\315\163\222\323\026\112\006\014 -\214\120\321\217\036\011\276\027\241\346\041\312\375\203\345\020 -\274\203\245\012\304\147\050\366\163\024\024\075\106\166\303\207 -\024\211\041\064\115\257\017\105\014\246\111\241\272\273\234\305 -\261\063\203\051\205\002\003\001\000\001\243\102\060\100\060\017 -\006\003\125\035\023\001\001\377\004\005\060\003\001\001\377\060 -\016\006\003\125\035\017\001\001\377\004\004\003\002\001\206\060 -\035\006\003\125\035\016\004\026\004\024\116\042\124\040\030\225 -\346\343\156\346\017\372\372\271\022\355\006\027\217\071\060\015 -\006\011\052\206\110\206\367\015\001\001\013\005\000\003\202\001 -\001\000\140\147\050\224\157\016\110\143\353\061\335\352\147\030 -\325\211\175\074\305\213\112\177\351\276\333\053\027\337\260\137 -\163\167\052\062\023\071\201\147\102\204\043\362\105\147\065\354 -\210\277\370\217\260\141\014\064\244\256\040\114\204\306\333\370 -\065\341\166\331\337\246\102\273\307\104\010\206\177\066\164\044 -\132\332\154\015\024\131\065\275\362\111\335\266\037\311\263\015 -\107\052\075\231\057\273\134\273\265\324\040\341\231\137\123\106 -\025\333\150\233\360\363\060\325\076\061\342\215\204\236\343\212 -\332\332\226\076\065\023\245\137\360\371\160\120\160\107\101\021 -\127\031\116\300\217\256\006\304\225\023\027\057\033\045\237\165 -\362\261\216\231\241\157\023\261\101\161\376\210\052\310\117\020 -\040\125\327\363\024\105\345\340\104\364\352\207\225\062\223\016 -\376\123\106\372\054\235\377\213\042\271\113\331\011\105\244\336 -\244\270\232\130\335\033\175\122\237\216\131\103\210\201\244\236 -\046\325\157\255\335\015\306\067\175\355\003\222\033\345\167\137 -\166\356\074\215\304\135\126\133\242\331\146\156\263\065\067\345 -\062\266 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "DigiCert Global Root G2" -# Issuer: CN=DigiCert Global Root G2,OU=www.digicert.com,O=DigiCert Inc,C=US -# Serial Number:03:3a:f1:e6:a7:11:a9:a0:bb:28:64:b1:1d:09:fa:e5 -# Subject: CN=DigiCert Global Root G2,OU=www.digicert.com,O=DigiCert Inc,C=US -# Not Valid Before: Thu Aug 01 12:00:00 2013 -# Not Valid After : Fri Jan 15 12:00:00 2038 -# Fingerprint (SHA-256): CB:3C:CB:B7:60:31:E5:E0:13:8F:8D:D3:9A:23:F9:DE:47:FF:C3:5E:43:C1:14:4C:EA:27:D4:6A:5A:B1:CB:5F -# Fingerprint (SHA1): DF:3C:24:F9:BF:D6:66:76:1B:26:80:73:FE:06:D1:CC:8D:4F:82:A4 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "DigiCert Global Root G2" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\337\074\044\371\277\326\146\166\033\046\200\163\376\006\321\314 -\215\117\202\244 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\344\246\212\310\124\254\122\102\106\012\375\162\110\033\052\104 -END -CKA_ISSUER MULTILINE_OCTAL -\060\141\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\025\060\023\006\003\125\004\012\023\014\104\151\147\151\103\145 -\162\164\040\111\156\143\061\031\060\027\006\003\125\004\013\023 -\020\167\167\167\056\144\151\147\151\143\145\162\164\056\143\157 -\155\061\040\060\036\006\003\125\004\003\023\027\104\151\147\151 -\103\145\162\164\040\107\154\157\142\141\154\040\122\157\157\164 -\040\107\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\003\072\361\346\247\021\251\240\273\050\144\261\035\011 -\372\345 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "DigiCert Global Root G3" -# -# Issuer: CN=DigiCert Global Root G3,OU=www.digicert.com,O=DigiCert Inc,C=US -# Serial Number:05:55:56:bc:f2:5e:a4:35:35:c3:a4:0f:d5:ab:45:72 -# Subject: CN=DigiCert Global Root G3,OU=www.digicert.com,O=DigiCert Inc,C=US -# Not Valid Before: Thu Aug 01 12:00:00 2013 -# Not Valid After : Fri Jan 15 12:00:00 2038 -# Fingerprint (SHA-256): 31:AD:66:48:F8:10:41:38:C7:38:F3:9E:A4:32:01:33:39:3E:3A:18:CC:02:29:6E:F9:7C:2A:C9:EF:67:31:D0 -# Fingerprint (SHA1): 7E:04:DE:89:6A:3E:66:6D:00:E6:87:D3:3F:FA:D9:3B:E8:3D:34:9E -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "DigiCert Global Root G3" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\141\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\025\060\023\006\003\125\004\012\023\014\104\151\147\151\103\145 -\162\164\040\111\156\143\061\031\060\027\006\003\125\004\013\023 -\020\167\167\167\056\144\151\147\151\143\145\162\164\056\143\157 -\155\061\040\060\036\006\003\125\004\003\023\027\104\151\147\151 -\103\145\162\164\040\107\154\157\142\141\154\040\122\157\157\164 -\040\107\063 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\141\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\025\060\023\006\003\125\004\012\023\014\104\151\147\151\103\145 -\162\164\040\111\156\143\061\031\060\027\006\003\125\004\013\023 -\020\167\167\167\056\144\151\147\151\143\145\162\164\056\143\157 -\155\061\040\060\036\006\003\125\004\003\023\027\104\151\147\151 -\103\145\162\164\040\107\154\157\142\141\154\040\122\157\157\164 -\040\107\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\005\125\126\274\362\136\244\065\065\303\244\017\325\253 -\105\162 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\077\060\202\001\305\240\003\002\001\002\002\020\005 -\125\126\274\362\136\244\065\065\303\244\017\325\253\105\162\060 -\012\006\010\052\206\110\316\075\004\003\003\060\141\061\013\060 -\011\006\003\125\004\006\023\002\125\123\061\025\060\023\006\003 -\125\004\012\023\014\104\151\147\151\103\145\162\164\040\111\156 -\143\061\031\060\027\006\003\125\004\013\023\020\167\167\167\056 -\144\151\147\151\143\145\162\164\056\143\157\155\061\040\060\036 -\006\003\125\004\003\023\027\104\151\147\151\103\145\162\164\040 -\107\154\157\142\141\154\040\122\157\157\164\040\107\063\060\036 -\027\015\061\063\060\070\060\061\061\062\060\060\060\060\132\027 -\015\063\070\060\061\061\065\061\062\060\060\060\060\132\060\141 -\061\013\060\011\006\003\125\004\006\023\002\125\123\061\025\060 -\023\006\003\125\004\012\023\014\104\151\147\151\103\145\162\164 -\040\111\156\143\061\031\060\027\006\003\125\004\013\023\020\167 -\167\167\056\144\151\147\151\143\145\162\164\056\143\157\155\061 -\040\060\036\006\003\125\004\003\023\027\104\151\147\151\103\145 -\162\164\040\107\154\157\142\141\154\040\122\157\157\164\040\107 -\063\060\166\060\020\006\007\052\206\110\316\075\002\001\006\005 -\053\201\004\000\042\003\142\000\004\335\247\331\273\212\270\013 -\373\013\177\041\322\360\276\276\163\363\063\135\032\274\064\352 -\336\306\233\274\320\225\366\360\314\320\013\272\141\133\121\106 -\176\236\055\237\356\216\143\014\027\354\007\160\365\317\204\056 -\100\203\234\350\077\101\155\073\255\323\244\024\131\066\170\235 -\003\103\356\020\023\154\162\336\256\210\247\241\153\265\103\316 -\147\334\043\377\003\034\243\342\076\243\102\060\100\060\017\006 -\003\125\035\023\001\001\377\004\005\060\003\001\001\377\060\016 -\006\003\125\035\017\001\001\377\004\004\003\002\001\206\060\035 -\006\003\125\035\016\004\026\004\024\263\333\110\244\371\241\305 -\330\256\066\101\314\021\143\151\142\051\274\113\306\060\012\006 -\010\052\206\110\316\075\004\003\003\003\150\000\060\145\002\061 -\000\255\274\362\154\077\022\112\321\055\071\303\012\011\227\163 -\364\210\066\214\210\047\273\346\210\215\120\205\247\143\371\236 -\062\336\146\223\017\361\314\261\011\217\335\154\253\372\153\177 -\240\002\060\071\146\133\302\144\215\270\236\120\334\250\325\111 -\242\355\307\334\321\111\177\027\001\270\310\206\217\116\214\210 -\053\250\232\251\212\305\321\000\275\370\124\342\232\345\133\174 -\263\047\027 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "DigiCert Global Root G3" -# Issuer: CN=DigiCert Global Root G3,OU=www.digicert.com,O=DigiCert Inc,C=US -# Serial Number:05:55:56:bc:f2:5e:a4:35:35:c3:a4:0f:d5:ab:45:72 -# Subject: CN=DigiCert Global Root G3,OU=www.digicert.com,O=DigiCert Inc,C=US -# Not Valid Before: Thu Aug 01 12:00:00 2013 -# Not Valid After : Fri Jan 15 12:00:00 2038 -# Fingerprint (SHA-256): 31:AD:66:48:F8:10:41:38:C7:38:F3:9E:A4:32:01:33:39:3E:3A:18:CC:02:29:6E:F9:7C:2A:C9:EF:67:31:D0 -# Fingerprint (SHA1): 7E:04:DE:89:6A:3E:66:6D:00:E6:87:D3:3F:FA:D9:3B:E8:3D:34:9E -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "DigiCert Global Root G3" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\176\004\336\211\152\076\146\155\000\346\207\323\077\372\331\073 -\350\075\064\236 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\365\135\244\120\245\373\050\176\036\017\015\314\226\127\126\312 -END -CKA_ISSUER MULTILINE_OCTAL -\060\141\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\025\060\023\006\003\125\004\012\023\014\104\151\147\151\103\145 -\162\164\040\111\156\143\061\031\060\027\006\003\125\004\013\023 -\020\167\167\167\056\144\151\147\151\143\145\162\164\056\143\157 -\155\061\040\060\036\006\003\125\004\003\023\027\104\151\147\151 -\103\145\162\164\040\107\154\157\142\141\154\040\122\157\157\164 -\040\107\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\005\125\126\274\362\136\244\065\065\303\244\017\325\253 -\105\162 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "DigiCert Trusted Root G4" -# -# Issuer: CN=DigiCert Trusted Root G4,OU=www.digicert.com,O=DigiCert Inc,C=US -# Serial Number:05:9b:1b:57:9e:8e:21:32:e2:39:07:bd:a7:77:75:5c -# Subject: CN=DigiCert Trusted Root G4,OU=www.digicert.com,O=DigiCert Inc,C=US -# Not Valid Before: Thu Aug 01 12:00:00 2013 -# Not Valid After : Fri Jan 15 12:00:00 2038 -# Fingerprint (SHA-256): 55:2F:7B:DC:F1:A7:AF:9E:6C:E6:72:01:7F:4F:12:AB:F7:72:40:C7:8E:76:1A:C2:03:D1:D9:D2:0A:C8:99:88 -# Fingerprint (SHA1): DD:FB:16:CD:49:31:C9:73:A2:03:7D:3F:C8:3A:4D:7D:77:5D:05:E4 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "DigiCert Trusted Root G4" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\142\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\025\060\023\006\003\125\004\012\023\014\104\151\147\151\103\145 -\162\164\040\111\156\143\061\031\060\027\006\003\125\004\013\023 -\020\167\167\167\056\144\151\147\151\143\145\162\164\056\143\157 -\155\061\041\060\037\006\003\125\004\003\023\030\104\151\147\151 -\103\145\162\164\040\124\162\165\163\164\145\144\040\122\157\157 -\164\040\107\064 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\142\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\025\060\023\006\003\125\004\012\023\014\104\151\147\151\103\145 -\162\164\040\111\156\143\061\031\060\027\006\003\125\004\013\023 -\020\167\167\167\056\144\151\147\151\143\145\162\164\056\143\157 -\155\061\041\060\037\006\003\125\004\003\023\030\104\151\147\151 -\103\145\162\164\040\124\162\165\163\164\145\144\040\122\157\157 -\164\040\107\064 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\005\233\033\127\236\216\041\062\342\071\007\275\247\167 -\165\134 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\220\060\202\003\170\240\003\002\001\002\002\020\005 -\233\033\127\236\216\041\062\342\071\007\275\247\167\165\134\060 -\015\006\011\052\206\110\206\367\015\001\001\014\005\000\060\142 -\061\013\060\011\006\003\125\004\006\023\002\125\123\061\025\060 -\023\006\003\125\004\012\023\014\104\151\147\151\103\145\162\164 -\040\111\156\143\061\031\060\027\006\003\125\004\013\023\020\167 -\167\167\056\144\151\147\151\143\145\162\164\056\143\157\155\061 -\041\060\037\006\003\125\004\003\023\030\104\151\147\151\103\145 -\162\164\040\124\162\165\163\164\145\144\040\122\157\157\164\040 -\107\064\060\036\027\015\061\063\060\070\060\061\061\062\060\060 -\060\060\132\027\015\063\070\060\061\061\065\061\062\060\060\060 -\060\132\060\142\061\013\060\011\006\003\125\004\006\023\002\125 -\123\061\025\060\023\006\003\125\004\012\023\014\104\151\147\151 -\103\145\162\164\040\111\156\143\061\031\060\027\006\003\125\004 -\013\023\020\167\167\167\056\144\151\147\151\143\145\162\164\056 -\143\157\155\061\041\060\037\006\003\125\004\003\023\030\104\151 -\147\151\103\145\162\164\040\124\162\165\163\164\145\144\040\122 -\157\157\164\040\107\064\060\202\002\042\060\015\006\011\052\206 -\110\206\367\015\001\001\001\005\000\003\202\002\017\000\060\202 -\002\012\002\202\002\001\000\277\346\220\163\150\336\273\344\135 -\112\074\060\042\060\151\063\354\302\247\045\056\311\041\075\362 -\212\330\131\302\341\051\247\075\130\253\166\232\315\256\173\033 -\204\015\304\060\037\363\033\244\070\026\353\126\306\227\155\035 -\253\262\171\362\312\021\322\344\137\326\005\074\122\017\122\037 -\306\236\025\245\176\276\237\251\127\026\131\125\162\257\150\223 -\160\302\262\272\165\231\152\163\062\224\321\020\104\020\056\337 -\202\363\007\204\346\164\073\155\161\342\055\014\033\356\040\325 -\311\040\035\143\051\055\316\354\136\116\310\223\370\041\141\233 -\064\353\005\306\136\354\133\032\274\353\311\317\315\254\064\100 -\137\261\172\146\356\167\310\110\250\146\127\127\237\124\130\216 -\014\053\267\117\247\060\331\126\356\312\173\135\343\255\311\117 -\136\345\065\347\061\313\332\223\136\334\216\217\200\332\266\221 -\230\100\220\171\303\170\307\266\261\304\265\152\030\070\003\020 -\215\330\324\067\244\056\005\175\210\365\202\076\020\221\160\253 -\125\202\101\062\327\333\004\163\052\156\221\001\174\041\114\324 -\274\256\033\003\165\135\170\146\331\072\061\104\232\063\100\277 -\010\327\132\111\244\302\346\251\240\147\335\244\047\274\241\117 -\071\265\021\130\027\367\044\134\106\217\144\367\301\151\210\166 -\230\166\075\131\135\102\166\207\211\227\151\172\110\360\340\242 -\022\033\146\232\164\312\336\113\036\347\016\143\256\346\324\357 -\222\222\072\236\075\334\000\344\105\045\211\266\232\104\031\053 -\176\300\224\264\322\141\155\353\063\331\305\337\113\004\000\314 -\175\034\225\303\217\367\041\262\262\021\267\273\177\362\325\214 -\160\054\101\140\252\261\143\030\104\225\032\166\142\176\366\200 -\260\373\350\144\246\063\321\211\007\341\275\267\346\103\244\030 -\270\246\167\001\341\017\224\014\041\035\262\124\051\045\211\154 -\345\016\122\121\107\164\276\046\254\266\101\165\336\172\254\137 -\215\077\311\274\323\101\021\022\133\345\020\120\353\061\305\312 -\162\026\042\011\337\174\114\165\077\143\354\041\137\304\040\121 -\153\157\261\253\206\213\117\302\326\105\137\235\040\374\241\036 -\305\300\217\242\261\176\012\046\231\365\344\151\057\230\035\055 -\365\331\251\262\035\345\033\002\003\001\000\001\243\102\060\100 -\060\017\006\003\125\035\023\001\001\377\004\005\060\003\001\001 -\377\060\016\006\003\125\035\017\001\001\377\004\004\003\002\001 -\206\060\035\006\003\125\035\016\004\026\004\024\354\327\343\202 -\322\161\135\144\114\337\056\147\077\347\272\230\256\034\017\117 -\060\015\006\011\052\206\110\206\367\015\001\001\014\005\000\003 -\202\002\001\000\273\141\331\175\251\154\276\027\304\221\033\303 -\241\242\000\215\343\144\150\017\126\317\167\256\160\371\375\232 -\112\231\271\311\170\134\014\014\137\344\346\024\051\126\013\066 -\111\135\104\143\340\255\234\226\030\146\033\043\015\075\171\351 -\155\153\326\124\370\322\074\301\103\100\256\035\120\365\122\374 -\220\073\273\230\231\151\153\307\301\247\250\150\244\047\334\235 -\371\047\256\060\205\271\366\147\115\072\076\217\131\071\042\123 -\104\353\310\135\003\312\355\120\172\175\142\041\012\200\310\163 -\146\321\240\005\140\137\350\245\264\247\257\250\367\155\065\234 -\174\132\212\326\242\070\231\363\170\213\364\115\322\040\013\336 -\004\356\214\233\107\201\162\015\300\024\062\357\060\131\056\256 -\340\161\362\126\344\152\227\157\222\120\155\226\215\150\172\232 -\262\066\024\172\006\362\044\271\011\021\120\327\010\261\270\211 -\172\204\043\141\102\051\345\243\315\242\040\101\327\321\234\144 -\331\352\046\241\213\024\327\114\031\262\120\101\161\075\077\115 -\160\043\206\014\112\334\201\322\314\062\224\204\015\010\011\227 -\034\117\300\356\153\040\164\060\322\340\071\064\020\205\041\025 -\001\010\350\125\062\336\161\111\331\050\027\120\115\346\276\115 -\321\165\254\320\312\373\101\270\103\245\252\323\303\005\104\117 -\054\066\233\342\372\342\105\270\043\123\154\006\157\147\125\177 -\106\265\114\077\156\050\132\171\046\322\244\250\142\227\322\036 -\342\355\112\213\274\033\375\107\112\015\337\147\146\176\262\133 -\101\320\073\344\364\073\364\004\143\351\357\302\124\000\121\240 -\212\052\311\316\170\314\325\352\207\004\030\263\316\257\111\210 -\257\363\222\231\266\263\346\141\017\322\205\000\347\120\032\344 -\033\225\235\031\241\271\234\261\233\261\000\036\357\320\017\117 -\102\154\311\012\274\356\103\372\072\161\245\310\115\046\245\065 -\375\211\135\274\205\142\035\062\322\240\053\124\355\232\127\301 -\333\372\020\317\031\267\213\112\033\217\001\266\047\225\123\350 -\266\211\155\133\274\150\324\043\350\213\121\242\126\371\360\246 -\200\240\326\036\263\274\017\017\123\165\051\252\352\023\167\344 -\336\214\201\041\255\007\020\107\021\255\207\075\007\321\165\274 -\317\363\146\176 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "DigiCert Trusted Root G4" -# Issuer: CN=DigiCert Trusted Root G4,OU=www.digicert.com,O=DigiCert Inc,C=US -# Serial Number:05:9b:1b:57:9e:8e:21:32:e2:39:07:bd:a7:77:75:5c -# Subject: CN=DigiCert Trusted Root G4,OU=www.digicert.com,O=DigiCert Inc,C=US -# Not Valid Before: Thu Aug 01 12:00:00 2013 -# Not Valid After : Fri Jan 15 12:00:00 2038 -# Fingerprint (SHA-256): 55:2F:7B:DC:F1:A7:AF:9E:6C:E6:72:01:7F:4F:12:AB:F7:72:40:C7:8E:76:1A:C2:03:D1:D9:D2:0A:C8:99:88 -# Fingerprint (SHA1): DD:FB:16:CD:49:31:C9:73:A2:03:7D:3F:C8:3A:4D:7D:77:5D:05:E4 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "DigiCert Trusted Root G4" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\335\373\026\315\111\061\311\163\242\003\175\077\310\072\115\175 -\167\135\005\344 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\170\362\374\252\140\037\057\264\353\311\067\272\123\056\165\111 -END -CKA_ISSUER MULTILINE_OCTAL -\060\142\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\025\060\023\006\003\125\004\012\023\014\104\151\147\151\103\145 -\162\164\040\111\156\143\061\031\060\027\006\003\125\004\013\023 -\020\167\167\167\056\144\151\147\151\143\145\162\164\056\143\157 -\155\061\041\060\037\006\003\125\004\003\023\030\104\151\147\151 -\103\145\162\164\040\124\162\165\163\164\145\144\040\122\157\157 -\164\040\107\064 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\005\233\033\127\236\216\041\062\342\071\007\275\247\167 -\165\134 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "COMODO RSA Certification Authority" -# -# Issuer: CN=COMODO RSA Certification Authority,O=COMODO CA Limited,L=Salford,ST=Greater Manchester,C=GB -# Serial Number:4c:aa:f9:ca:db:63:6f:e0:1f:f7:4e:d8:5b:03:86:9d -# Subject: CN=COMODO RSA Certification Authority,O=COMODO CA Limited,L=Salford,ST=Greater Manchester,C=GB -# Not Valid Before: Tue Jan 19 00:00:00 2010 -# Not Valid After : Mon Jan 18 23:59:59 2038 -# Fingerprint (SHA-256): 52:F0:E1:C4:E5:8E:C6:29:29:1B:60:31:7F:07:46:71:B8:5D:7E:A8:0D:5B:07:27:34:63:53:4B:32:B4:02:34 -# Fingerprint (SHA1): AF:E5:D2:44:A8:D1:19:42:30:FF:47:9F:E2:F8:97:BB:CD:7A:8C:B4 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "COMODO RSA Certification Authority" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\201\205\061\013\060\011\006\003\125\004\006\023\002\107\102 -\061\033\060\031\006\003\125\004\010\023\022\107\162\145\141\164 -\145\162\040\115\141\156\143\150\145\163\164\145\162\061\020\060 -\016\006\003\125\004\007\023\007\123\141\154\146\157\162\144\061 -\032\060\030\006\003\125\004\012\023\021\103\117\115\117\104\117 -\040\103\101\040\114\151\155\151\164\145\144\061\053\060\051\006 -\003\125\004\003\023\042\103\117\115\117\104\117\040\122\123\101 -\040\103\145\162\164\151\146\151\143\141\164\151\157\156\040\101 -\165\164\150\157\162\151\164\171 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\201\205\061\013\060\011\006\003\125\004\006\023\002\107\102 -\061\033\060\031\006\003\125\004\010\023\022\107\162\145\141\164 -\145\162\040\115\141\156\143\150\145\163\164\145\162\061\020\060 -\016\006\003\125\004\007\023\007\123\141\154\146\157\162\144\061 -\032\060\030\006\003\125\004\012\023\021\103\117\115\117\104\117 -\040\103\101\040\114\151\155\151\164\145\144\061\053\060\051\006 -\003\125\004\003\023\042\103\117\115\117\104\117\040\122\123\101 -\040\103\145\162\164\151\146\151\143\141\164\151\157\156\040\101 -\165\164\150\157\162\151\164\171 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\114\252\371\312\333\143\157\340\037\367\116\330\133\003 -\206\235 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\330\060\202\003\300\240\003\002\001\002\002\020\114 -\252\371\312\333\143\157\340\037\367\116\330\133\003\206\235\060 -\015\006\011\052\206\110\206\367\015\001\001\014\005\000\060\201 -\205\061\013\060\011\006\003\125\004\006\023\002\107\102\061\033 -\060\031\006\003\125\004\010\023\022\107\162\145\141\164\145\162 -\040\115\141\156\143\150\145\163\164\145\162\061\020\060\016\006 -\003\125\004\007\023\007\123\141\154\146\157\162\144\061\032\060 -\030\006\003\125\004\012\023\021\103\117\115\117\104\117\040\103 -\101\040\114\151\155\151\164\145\144\061\053\060\051\006\003\125 -\004\003\023\042\103\117\115\117\104\117\040\122\123\101\040\103 -\145\162\164\151\146\151\143\141\164\151\157\156\040\101\165\164 -\150\157\162\151\164\171\060\036\027\015\061\060\060\061\061\071 -\060\060\060\060\060\060\132\027\015\063\070\060\061\061\070\062 -\063\065\071\065\071\132\060\201\205\061\013\060\011\006\003\125 -\004\006\023\002\107\102\061\033\060\031\006\003\125\004\010\023 -\022\107\162\145\141\164\145\162\040\115\141\156\143\150\145\163 -\164\145\162\061\020\060\016\006\003\125\004\007\023\007\123\141 -\154\146\157\162\144\061\032\060\030\006\003\125\004\012\023\021 -\103\117\115\117\104\117\040\103\101\040\114\151\155\151\164\145 -\144\061\053\060\051\006\003\125\004\003\023\042\103\117\115\117 -\104\117\040\122\123\101\040\103\145\162\164\151\146\151\143\141 -\164\151\157\156\040\101\165\164\150\157\162\151\164\171\060\202 -\002\042\060\015\006\011\052\206\110\206\367\015\001\001\001\005 -\000\003\202\002\017\000\060\202\002\012\002\202\002\001\000\221 -\350\124\222\322\012\126\261\254\015\044\335\305\317\104\147\164 -\231\053\067\243\175\043\160\000\161\274\123\337\304\372\052\022 -\217\113\177\020\126\275\237\160\162\267\141\177\311\113\017\027 -\247\075\343\260\004\141\356\377\021\227\307\364\206\076\012\372 -\076\134\371\223\346\064\172\331\024\153\347\234\263\205\240\202 -\172\166\257\161\220\327\354\375\015\372\234\154\372\337\260\202 -\364\024\176\371\276\304\246\057\117\177\231\177\265\374\147\103 -\162\275\014\000\326\211\353\153\054\323\355\217\230\034\024\253 -\176\345\343\156\374\330\250\344\222\044\332\103\153\142\270\125 -\375\352\301\274\154\266\213\363\016\215\232\344\233\154\151\231 -\370\170\110\060\105\325\255\341\015\074\105\140\374\062\226\121 -\047\274\147\303\312\056\266\153\352\106\307\307\040\240\261\037 -\145\336\110\010\272\244\116\251\362\203\106\067\204\353\350\314 -\201\110\103\147\116\162\052\233\134\275\114\033\050\212\134\042 -\173\264\253\230\331\356\340\121\203\303\011\106\116\155\076\231 -\372\225\027\332\174\063\127\101\074\215\121\355\013\266\134\257 -\054\143\032\337\127\310\077\274\351\135\304\233\257\105\231\342 -\243\132\044\264\272\251\126\075\317\157\252\377\111\130\276\360 -\250\377\364\270\255\351\067\373\272\270\364\013\072\371\350\103 -\102\036\211\330\204\313\023\361\331\273\341\211\140\270\214\050 -\126\254\024\035\234\012\347\161\353\317\016\335\075\251\226\241 -\110\275\074\367\257\265\015\042\114\300\021\201\354\126\073\366 -\323\242\342\133\267\262\004\042\122\225\200\223\151\350\216\114 -\145\361\221\003\055\160\164\002\352\213\147\025\051\151\122\002 -\273\327\337\120\152\125\106\277\240\243\050\141\177\160\320\303 -\242\252\054\041\252\107\316\050\234\006\105\166\277\202\030\047 -\264\325\256\264\313\120\346\153\364\114\206\161\060\351\246\337 -\026\206\340\330\377\100\335\373\320\102\210\177\243\063\072\056 -\134\036\101\021\201\143\316\030\161\153\053\354\246\212\267\061 -\134\072\152\107\340\303\171\131\326\040\032\257\362\152\230\252 -\162\274\127\112\322\113\235\273\020\374\260\114\101\345\355\035 -\075\136\050\235\234\314\277\263\121\332\247\107\345\204\123\002 -\003\001\000\001\243\102\060\100\060\035\006\003\125\035\016\004 -\026\004\024\273\257\176\002\075\372\246\361\074\204\216\255\356 -\070\230\354\331\062\062\324\060\016\006\003\125\035\017\001\001 -\377\004\004\003\002\001\006\060\017\006\003\125\035\023\001\001 -\377\004\005\060\003\001\001\377\060\015\006\011\052\206\110\206 -\367\015\001\001\014\005\000\003\202\002\001\000\012\361\325\106 -\204\267\256\121\273\154\262\115\101\024\000\223\114\234\313\345 -\300\124\317\240\045\216\002\371\375\260\242\015\365\040\230\074 -\023\055\254\126\242\260\326\176\021\222\351\056\272\236\056\232 -\162\261\275\031\104\154\141\065\242\232\264\026\022\151\132\214 -\341\327\076\244\032\350\057\003\364\256\141\035\020\033\052\244 -\213\172\305\376\005\246\341\300\326\310\376\236\256\217\053\272 -\075\231\370\330\163\011\130\106\156\246\234\364\327\047\323\225 -\332\067\203\162\034\323\163\340\242\107\231\003\070\135\325\111 -\171\000\051\034\307\354\233\040\034\007\044\151\127\170\262\071 -\374\072\204\240\265\234\174\215\277\056\223\142\047\267\071\332 -\027\030\256\275\074\011\150\377\204\233\074\325\326\013\003\343 -\127\236\024\367\321\353\117\310\275\207\043\267\266\111\103\171 -\205\134\272\353\222\013\241\306\350\150\250\114\026\261\032\231 -\012\350\123\054\222\273\241\011\030\165\014\145\250\173\313\043 -\267\032\302\050\205\303\033\377\320\053\142\357\244\173\011\221 -\230\147\214\024\001\315\150\006\152\143\041\165\003\200\210\212 -\156\201\306\205\362\251\244\055\347\364\245\044\020\107\203\312 -\315\364\215\171\130\261\006\233\347\032\052\331\235\001\327\224 -\175\355\003\112\312\360\333\350\251\001\076\365\126\231\311\036 -\216\111\075\273\345\011\271\340\117\111\222\075\026\202\100\314 -\314\131\306\346\072\355\022\056\151\074\154\225\261\375\252\035 -\173\177\206\276\036\016\062\106\373\373\023\217\165\177\114\213 -\113\106\143\376\000\064\100\160\301\303\271\241\335\246\160\342 -\004\263\101\274\351\200\221\352\144\234\172\341\042\003\251\234 -\156\157\016\145\117\154\207\207\136\363\156\240\371\165\245\233 -\100\350\123\262\047\235\112\271\300\167\041\215\377\207\362\336 -\274\214\357\027\337\267\111\013\321\362\156\060\013\032\016\116 -\166\355\021\374\365\351\126\262\175\277\307\155\012\223\214\245 -\320\300\266\035\276\072\116\224\242\327\156\154\013\302\212\174 -\372\040\363\304\344\345\315\015\250\313\221\222\261\174\205\354 -\265\024\151\146\016\202\347\315\316\310\055\246\121\177\041\301 -\065\123\205\006\112\135\237\255\273\033\137\164 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "COMODO RSA Certification Authority" -# Issuer: CN=COMODO RSA Certification Authority,O=COMODO CA Limited,L=Salford,ST=Greater Manchester,C=GB -# Serial Number:4c:aa:f9:ca:db:63:6f:e0:1f:f7:4e:d8:5b:03:86:9d -# Subject: CN=COMODO RSA Certification Authority,O=COMODO CA Limited,L=Salford,ST=Greater Manchester,C=GB -# Not Valid Before: Tue Jan 19 00:00:00 2010 -# Not Valid After : Mon Jan 18 23:59:59 2038 -# Fingerprint (SHA-256): 52:F0:E1:C4:E5:8E:C6:29:29:1B:60:31:7F:07:46:71:B8:5D:7E:A8:0D:5B:07:27:34:63:53:4B:32:B4:02:34 -# Fingerprint (SHA1): AF:E5:D2:44:A8:D1:19:42:30:FF:47:9F:E2:F8:97:BB:CD:7A:8C:B4 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "COMODO RSA Certification Authority" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\257\345\322\104\250\321\031\102\060\377\107\237\342\370\227\273 -\315\172\214\264 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\033\061\260\161\100\066\314\024\066\221\255\304\076\375\354\030 -END -CKA_ISSUER MULTILINE_OCTAL -\060\201\205\061\013\060\011\006\003\125\004\006\023\002\107\102 -\061\033\060\031\006\003\125\004\010\023\022\107\162\145\141\164 -\145\162\040\115\141\156\143\150\145\163\164\145\162\061\020\060 -\016\006\003\125\004\007\023\007\123\141\154\146\157\162\144\061 -\032\060\030\006\003\125\004\012\023\021\103\117\115\117\104\117 -\040\103\101\040\114\151\155\151\164\145\144\061\053\060\051\006 -\003\125\004\003\023\042\103\117\115\117\104\117\040\122\123\101 -\040\103\145\162\164\151\146\151\143\141\164\151\157\156\040\101 -\165\164\150\157\162\151\164\171 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\114\252\371\312\333\143\157\340\037\367\116\330\133\003 -\206\235 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "USERTrust RSA Certification Authority" -# -# Issuer: CN=USERTrust RSA Certification Authority,O=The USERTRUST Network,L=Jersey City,ST=New Jersey,C=US -# Serial Number:01:fd:6d:30:fc:a3:ca:51:a8:1b:bc:64:0e:35:03:2d -# Subject: CN=USERTrust RSA Certification Authority,O=The USERTRUST Network,L=Jersey City,ST=New Jersey,C=US -# Not Valid Before: Mon Feb 01 00:00:00 2010 -# Not Valid After : Mon Jan 18 23:59:59 2038 -# Fingerprint (SHA-256): E7:93:C9:B0:2F:D8:AA:13:E2:1C:31:22:8A:CC:B0:81:19:64:3B:74:9C:89:89:64:B1:74:6D:46:C3:D4:CB:D2 -# Fingerprint (SHA1): 2B:8F:1B:57:33:0D:BB:A2:D0:7A:6C:51:F7:0E:E9:0D:DA:B9:AD:8E -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "USERTrust RSA Certification Authority" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\201\210\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\023\060\021\006\003\125\004\010\023\012\116\145\167\040\112 -\145\162\163\145\171\061\024\060\022\006\003\125\004\007\023\013 -\112\145\162\163\145\171\040\103\151\164\171\061\036\060\034\006 -\003\125\004\012\023\025\124\150\145\040\125\123\105\122\124\122 -\125\123\124\040\116\145\164\167\157\162\153\061\056\060\054\006 -\003\125\004\003\023\045\125\123\105\122\124\162\165\163\164\040 -\122\123\101\040\103\145\162\164\151\146\151\143\141\164\151\157 -\156\040\101\165\164\150\157\162\151\164\171 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\201\210\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\023\060\021\006\003\125\004\010\023\012\116\145\167\040\112 -\145\162\163\145\171\061\024\060\022\006\003\125\004\007\023\013 -\112\145\162\163\145\171\040\103\151\164\171\061\036\060\034\006 -\003\125\004\012\023\025\124\150\145\040\125\123\105\122\124\122 -\125\123\124\040\116\145\164\167\157\162\153\061\056\060\054\006 -\003\125\004\003\023\045\125\123\105\122\124\162\165\163\164\040 -\122\123\101\040\103\145\162\164\151\146\151\143\141\164\151\157 -\156\040\101\165\164\150\157\162\151\164\171 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\001\375\155\060\374\243\312\121\250\033\274\144\016\065 -\003\055 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\336\060\202\003\306\240\003\002\001\002\002\020\001 -\375\155\060\374\243\312\121\250\033\274\144\016\065\003\055\060 -\015\006\011\052\206\110\206\367\015\001\001\014\005\000\060\201 -\210\061\013\060\011\006\003\125\004\006\023\002\125\123\061\023 -\060\021\006\003\125\004\010\023\012\116\145\167\040\112\145\162 -\163\145\171\061\024\060\022\006\003\125\004\007\023\013\112\145 -\162\163\145\171\040\103\151\164\171\061\036\060\034\006\003\125 -\004\012\023\025\124\150\145\040\125\123\105\122\124\122\125\123 -\124\040\116\145\164\167\157\162\153\061\056\060\054\006\003\125 -\004\003\023\045\125\123\105\122\124\162\165\163\164\040\122\123 -\101\040\103\145\162\164\151\146\151\143\141\164\151\157\156\040 -\101\165\164\150\157\162\151\164\171\060\036\027\015\061\060\060 -\062\060\061\060\060\060\060\060\060\132\027\015\063\070\060\061 -\061\070\062\063\065\071\065\071\132\060\201\210\061\013\060\011 -\006\003\125\004\006\023\002\125\123\061\023\060\021\006\003\125 -\004\010\023\012\116\145\167\040\112\145\162\163\145\171\061\024 -\060\022\006\003\125\004\007\023\013\112\145\162\163\145\171\040 -\103\151\164\171\061\036\060\034\006\003\125\004\012\023\025\124 -\150\145\040\125\123\105\122\124\122\125\123\124\040\116\145\164 -\167\157\162\153\061\056\060\054\006\003\125\004\003\023\045\125 -\123\105\122\124\162\165\163\164\040\122\123\101\040\103\145\162 -\164\151\146\151\143\141\164\151\157\156\040\101\165\164\150\157 -\162\151\164\171\060\202\002\042\060\015\006\011\052\206\110\206 -\367\015\001\001\001\005\000\003\202\002\017\000\060\202\002\012 -\002\202\002\001\000\200\022\145\027\066\016\303\333\010\263\320 -\254\127\015\166\355\315\047\323\114\255\120\203\141\342\252\040 -\115\011\055\144\011\334\316\211\237\314\075\251\354\366\317\301 -\334\361\323\261\326\173\067\050\021\053\107\332\071\306\274\072 -\031\264\137\246\275\175\235\243\143\102\266\166\362\251\073\053 -\221\370\342\157\320\354\026\040\220\011\076\342\350\164\311\030 -\264\221\324\142\144\333\177\243\006\361\210\030\152\220\042\074 -\274\376\023\360\207\024\173\366\344\037\216\324\344\121\306\021 -\147\106\010\121\313\206\024\124\077\274\063\376\176\154\234\377 -\026\235\030\275\121\216\065\246\247\146\310\162\147\333\041\146 -\261\324\233\170\003\300\120\072\350\314\360\334\274\236\114\376 -\257\005\226\065\037\127\132\267\377\316\371\075\267\054\266\366 -\124\335\310\347\022\072\115\256\114\212\267\134\232\264\267\040 -\075\312\177\042\064\256\176\073\150\146\001\104\347\001\116\106 -\123\233\063\140\367\224\276\123\067\220\163\103\363\062\303\123 -\357\333\252\376\164\116\151\307\153\214\140\223\336\304\307\014 -\337\341\062\256\314\223\073\121\170\225\147\213\356\075\126\376 -\014\320\151\017\033\017\363\045\046\153\063\155\367\156\107\372 -\163\103\345\176\016\245\146\261\051\174\062\204\143\125\211\304 -\015\301\223\124\060\031\023\254\323\175\067\247\353\135\072\154 -\065\134\333\101\327\022\332\251\111\013\337\330\200\212\011\223 -\142\216\265\146\317\045\210\315\204\270\261\077\244\071\017\331 -\002\236\353\022\114\225\174\363\153\005\251\136\026\203\314\270 -\147\342\350\023\235\314\133\202\323\114\263\355\133\377\336\345 -\163\254\043\073\055\000\277\065\125\164\011\111\330\111\130\032 -\177\222\066\346\121\222\016\363\046\175\034\115\027\274\311\354 -\103\046\320\277\101\137\100\251\104\104\364\231\347\127\207\236 -\120\037\127\124\250\076\375\164\143\057\261\120\145\011\346\130 -\102\056\103\032\114\264\360\045\107\131\372\004\036\223\324\046 -\106\112\120\201\262\336\276\170\267\374\147\025\341\311\127\204 -\036\017\143\326\351\142\272\326\137\125\056\352\134\306\050\010 -\004\045\071\270\016\053\251\362\114\227\034\007\077\015\122\365 -\355\357\057\202\017\002\003\001\000\001\243\102\060\100\060\035 -\006\003\125\035\016\004\026\004\024\123\171\277\132\252\053\112 -\317\124\200\341\330\233\300\235\362\262\003\146\313\060\016\006 -\003\125\035\017\001\001\377\004\004\003\002\001\006\060\017\006 -\003\125\035\023\001\001\377\004\005\060\003\001\001\377\060\015 -\006\011\052\206\110\206\367\015\001\001\014\005\000\003\202\002 -\001\000\134\324\174\015\317\367\001\175\101\231\145\014\163\305 -\122\237\313\370\317\231\006\177\033\332\103\025\237\236\002\125 -\127\226\024\361\122\074\047\207\224\050\355\037\072\001\067\242 -\166\374\123\120\300\204\233\306\153\116\272\214\041\117\242\216 -\125\142\221\363\151\025\330\274\210\343\304\252\013\375\357\250 -\351\113\125\052\006\040\155\125\170\051\031\356\137\060\134\113 -\044\021\125\377\044\232\156\136\052\053\356\013\115\237\177\367 -\001\070\224\024\225\103\007\011\373\140\251\356\034\253\022\214 -\240\232\136\247\230\152\131\155\213\077\010\373\310\321\105\257 -\030\025\144\220\022\017\163\050\056\305\342\044\116\374\130\354 -\360\364\105\376\042\263\353\057\216\322\331\105\141\005\301\227 -\157\250\166\162\217\213\214\066\257\277\015\005\316\161\215\346 -\246\157\037\154\246\161\142\305\330\320\203\162\014\361\147\021 -\211\014\234\023\114\162\064\337\274\325\161\337\252\161\335\341 -\271\154\214\074\022\135\145\332\275\127\022\266\103\153\377\345 -\336\115\146\021\121\317\231\256\354\027\266\350\161\221\214\336 -\111\376\335\065\161\242\025\047\224\034\317\141\343\046\273\157 -\243\147\045\041\135\346\335\035\013\056\150\033\073\202\257\354 -\203\147\205\324\230\121\164\261\271\231\200\211\377\177\170\031 -\134\171\112\140\056\222\100\256\114\067\052\054\311\307\142\310 -\016\135\367\066\133\312\340\045\045\001\264\335\032\007\234\167 -\000\077\320\334\325\354\075\324\372\273\077\314\205\326\157\177 -\251\055\337\271\002\367\365\227\232\265\065\332\303\147\260\207 -\112\251\050\236\043\216\377\134\047\153\341\260\117\363\007\356 -\000\056\324\131\207\313\122\101\225\352\364\107\327\356\144\101 -\125\174\215\131\002\225\335\142\235\302\271\356\132\050\164\204 -\245\233\267\220\307\014\007\337\365\211\066\164\062\326\050\301 -\260\260\013\340\234\114\303\034\326\374\343\151\265\107\106\201 -\057\242\202\253\323\143\104\160\304\215\377\055\063\272\255\217 -\173\265\160\210\256\076\031\317\100\050\330\374\310\220\273\135 -\231\042\365\122\346\130\305\037\210\061\103\356\210\035\327\306 -\216\074\103\152\035\247\030\336\175\075\026\361\142\371\312\220 -\250\375 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "USERTrust RSA Certification Authority" -# Issuer: CN=USERTrust RSA Certification Authority,O=The USERTRUST Network,L=Jersey City,ST=New Jersey,C=US -# Serial Number:01:fd:6d:30:fc:a3:ca:51:a8:1b:bc:64:0e:35:03:2d -# Subject: CN=USERTrust RSA Certification Authority,O=The USERTRUST Network,L=Jersey City,ST=New Jersey,C=US -# Not Valid Before: Mon Feb 01 00:00:00 2010 -# Not Valid After : Mon Jan 18 23:59:59 2038 -# Fingerprint (SHA-256): E7:93:C9:B0:2F:D8:AA:13:E2:1C:31:22:8A:CC:B0:81:19:64:3B:74:9C:89:89:64:B1:74:6D:46:C3:D4:CB:D2 -# Fingerprint (SHA1): 2B:8F:1B:57:33:0D:BB:A2:D0:7A:6C:51:F7:0E:E9:0D:DA:B9:AD:8E -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "USERTrust RSA Certification Authority" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\053\217\033\127\063\015\273\242\320\172\154\121\367\016\351\015 -\332\271\255\216 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\033\376\151\321\221\267\031\063\243\162\250\017\341\125\345\265 -END -CKA_ISSUER MULTILINE_OCTAL -\060\201\210\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\023\060\021\006\003\125\004\010\023\012\116\145\167\040\112 -\145\162\163\145\171\061\024\060\022\006\003\125\004\007\023\013 -\112\145\162\163\145\171\040\103\151\164\171\061\036\060\034\006 -\003\125\004\012\023\025\124\150\145\040\125\123\105\122\124\122 -\125\123\124\040\116\145\164\167\157\162\153\061\056\060\054\006 -\003\125\004\003\023\045\125\123\105\122\124\162\165\163\164\040 -\122\123\101\040\103\145\162\164\151\146\151\143\141\164\151\157 -\156\040\101\165\164\150\157\162\151\164\171 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\001\375\155\060\374\243\312\121\250\033\274\144\016\065 -\003\055 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "USERTrust ECC Certification Authority" -# -# Issuer: CN=USERTrust ECC Certification Authority,O=The USERTRUST Network,L=Jersey City,ST=New Jersey,C=US -# Serial Number:5c:8b:99:c5:5a:94:c5:d2:71:56:de:cd:89:80:cc:26 -# Subject: CN=USERTrust ECC Certification Authority,O=The USERTRUST Network,L=Jersey City,ST=New Jersey,C=US -# Not Valid Before: Mon Feb 01 00:00:00 2010 -# Not Valid After : Mon Jan 18 23:59:59 2038 -# Fingerprint (SHA-256): 4F:F4:60:D5:4B:9C:86:DA:BF:BC:FC:57:12:E0:40:0D:2B:ED:3F:BC:4D:4F:BD:AA:86:E0:6A:DC:D2:A9:AD:7A -# Fingerprint (SHA1): D1:CB:CA:5D:B2:D5:2A:7F:69:3B:67:4D:E5:F0:5A:1D:0C:95:7D:F0 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "USERTrust ECC Certification Authority" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\201\210\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\023\060\021\006\003\125\004\010\023\012\116\145\167\040\112 -\145\162\163\145\171\061\024\060\022\006\003\125\004\007\023\013 -\112\145\162\163\145\171\040\103\151\164\171\061\036\060\034\006 -\003\125\004\012\023\025\124\150\145\040\125\123\105\122\124\122 -\125\123\124\040\116\145\164\167\157\162\153\061\056\060\054\006 -\003\125\004\003\023\045\125\123\105\122\124\162\165\163\164\040 -\105\103\103\040\103\145\162\164\151\146\151\143\141\164\151\157 -\156\040\101\165\164\150\157\162\151\164\171 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\201\210\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\023\060\021\006\003\125\004\010\023\012\116\145\167\040\112 -\145\162\163\145\171\061\024\060\022\006\003\125\004\007\023\013 -\112\145\162\163\145\171\040\103\151\164\171\061\036\060\034\006 -\003\125\004\012\023\025\124\150\145\040\125\123\105\122\124\122 -\125\123\124\040\116\145\164\167\157\162\153\061\056\060\054\006 -\003\125\004\003\023\045\125\123\105\122\124\162\165\163\164\040 -\105\103\103\040\103\145\162\164\151\146\151\143\141\164\151\157 -\156\040\101\165\164\150\157\162\151\164\171 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\134\213\231\305\132\224\305\322\161\126\336\315\211\200 -\314\046 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\217\060\202\002\025\240\003\002\001\002\002\020\134 -\213\231\305\132\224\305\322\161\126\336\315\211\200\314\046\060 -\012\006\010\052\206\110\316\075\004\003\003\060\201\210\061\013 -\060\011\006\003\125\004\006\023\002\125\123\061\023\060\021\006 -\003\125\004\010\023\012\116\145\167\040\112\145\162\163\145\171 -\061\024\060\022\006\003\125\004\007\023\013\112\145\162\163\145 -\171\040\103\151\164\171\061\036\060\034\006\003\125\004\012\023 -\025\124\150\145\040\125\123\105\122\124\122\125\123\124\040\116 -\145\164\167\157\162\153\061\056\060\054\006\003\125\004\003\023 -\045\125\123\105\122\124\162\165\163\164\040\105\103\103\040\103 -\145\162\164\151\146\151\143\141\164\151\157\156\040\101\165\164 -\150\157\162\151\164\171\060\036\027\015\061\060\060\062\060\061 -\060\060\060\060\060\060\132\027\015\063\070\060\061\061\070\062 -\063\065\071\065\071\132\060\201\210\061\013\060\011\006\003\125 -\004\006\023\002\125\123\061\023\060\021\006\003\125\004\010\023 -\012\116\145\167\040\112\145\162\163\145\171\061\024\060\022\006 -\003\125\004\007\023\013\112\145\162\163\145\171\040\103\151\164 -\171\061\036\060\034\006\003\125\004\012\023\025\124\150\145\040 -\125\123\105\122\124\122\125\123\124\040\116\145\164\167\157\162 -\153\061\056\060\054\006\003\125\004\003\023\045\125\123\105\122 -\124\162\165\163\164\040\105\103\103\040\103\145\162\164\151\146 -\151\143\141\164\151\157\156\040\101\165\164\150\157\162\151\164 -\171\060\166\060\020\006\007\052\206\110\316\075\002\001\006\005 -\053\201\004\000\042\003\142\000\004\032\254\124\132\251\371\150 -\043\347\172\325\044\157\123\306\132\330\113\253\306\325\266\321 -\346\163\161\256\335\234\326\014\141\375\333\240\211\003\270\005 -\024\354\127\316\356\135\077\342\041\263\316\367\324\212\171\340 -\243\203\176\055\227\320\141\304\361\231\334\045\221\143\253\177 -\060\243\264\160\342\307\241\063\234\363\277\056\134\123\261\137 -\263\175\062\177\212\064\343\171\171\243\102\060\100\060\035\006 -\003\125\035\016\004\026\004\024\072\341\011\206\324\317\031\302 -\226\166\164\111\166\334\340\065\306\143\143\232\060\016\006\003 -\125\035\017\001\001\377\004\004\003\002\001\006\060\017\006\003 -\125\035\023\001\001\377\004\005\060\003\001\001\377\060\012\006 -\010\052\206\110\316\075\004\003\003\003\150\000\060\145\002\060 -\066\147\241\026\010\334\344\227\000\101\035\116\276\341\143\001 -\317\073\252\102\021\144\240\235\224\071\002\021\171\134\173\035 -\372\144\271\356\026\102\263\277\212\302\011\304\354\344\261\115 -\002\061\000\351\052\141\107\214\122\112\113\116\030\160\366\326 -\104\326\156\365\203\272\155\130\275\044\331\126\110\352\357\304 -\242\106\201\210\152\072\106\321\251\233\115\311\141\332\321\135 -\127\152\030 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "USERTrust ECC Certification Authority" -# Issuer: CN=USERTrust ECC Certification Authority,O=The USERTRUST Network,L=Jersey City,ST=New Jersey,C=US -# Serial Number:5c:8b:99:c5:5a:94:c5:d2:71:56:de:cd:89:80:cc:26 -# Subject: CN=USERTrust ECC Certification Authority,O=The USERTRUST Network,L=Jersey City,ST=New Jersey,C=US -# Not Valid Before: Mon Feb 01 00:00:00 2010 -# Not Valid After : Mon Jan 18 23:59:59 2038 -# Fingerprint (SHA-256): 4F:F4:60:D5:4B:9C:86:DA:BF:BC:FC:57:12:E0:40:0D:2B:ED:3F:BC:4D:4F:BD:AA:86:E0:6A:DC:D2:A9:AD:7A -# Fingerprint (SHA1): D1:CB:CA:5D:B2:D5:2A:7F:69:3B:67:4D:E5:F0:5A:1D:0C:95:7D:F0 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "USERTrust ECC Certification Authority" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\321\313\312\135\262\325\052\177\151\073\147\115\345\360\132\035 -\014\225\175\360 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\372\150\274\331\265\177\255\375\311\035\006\203\050\314\044\301 -END -CKA_ISSUER MULTILINE_OCTAL -\060\201\210\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\023\060\021\006\003\125\004\010\023\012\116\145\167\040\112 -\145\162\163\145\171\061\024\060\022\006\003\125\004\007\023\013 -\112\145\162\163\145\171\040\103\151\164\171\061\036\060\034\006 -\003\125\004\012\023\025\124\150\145\040\125\123\105\122\124\122 -\125\123\124\040\116\145\164\167\157\162\153\061\056\060\054\006 -\003\125\004\003\023\045\125\123\105\122\124\162\165\163\164\040 -\105\103\103\040\103\145\162\164\151\146\151\143\141\164\151\157 -\156\040\101\165\164\150\157\162\151\164\171 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\134\213\231\305\132\224\305\322\161\126\336\315\211\200 -\314\046 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "GlobalSign ECC Root CA - R5" -# -# Issuer: CN=GlobalSign,O=GlobalSign,OU=GlobalSign ECC Root CA - R5 -# Serial Number:60:59:49:e0:26:2e:bb:55:f9:0a:77:8a:71:f9:4a:d8:6c -# Subject: CN=GlobalSign,O=GlobalSign,OU=GlobalSign ECC Root CA - R5 -# Not Valid Before: Tue Nov 13 00:00:00 2012 -# Not Valid After : Tue Jan 19 03:14:07 2038 -# Fingerprint (SHA-256): 17:9F:BC:14:8A:3D:D0:0F:D2:4E:A1:34:58:CC:43:BF:A7:F5:9C:81:82:D7:83:A5:13:F6:EB:EC:10:0C:89:24 -# Fingerprint (SHA1): 1F:24:C6:30:CD:A4:18:EF:20:69:FF:AD:4F:DD:5F:46:3A:1B:69:AA -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "GlobalSign ECC Root CA - R5" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\120\061\044\060\042\006\003\125\004\013\023\033\107\154\157 -\142\141\154\123\151\147\156\040\105\103\103\040\122\157\157\164 -\040\103\101\040\055\040\122\065\061\023\060\021\006\003\125\004 -\012\023\012\107\154\157\142\141\154\123\151\147\156\061\023\060 -\021\006\003\125\004\003\023\012\107\154\157\142\141\154\123\151 -\147\156 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\120\061\044\060\042\006\003\125\004\013\023\033\107\154\157 -\142\141\154\123\151\147\156\040\105\103\103\040\122\157\157\164 -\040\103\101\040\055\040\122\065\061\023\060\021\006\003\125\004 -\012\023\012\107\154\157\142\141\154\123\151\147\156\061\023\060 -\021\006\003\125\004\003\023\012\107\154\157\142\141\154\123\151 -\147\156 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\021\140\131\111\340\046\056\273\125\371\012\167\212\161\371 -\112\330\154 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\036\060\202\001\244\240\003\002\001\002\002\021\140 -\131\111\340\046\056\273\125\371\012\167\212\161\371\112\330\154 -\060\012\006\010\052\206\110\316\075\004\003\003\060\120\061\044 -\060\042\006\003\125\004\013\023\033\107\154\157\142\141\154\123 -\151\147\156\040\105\103\103\040\122\157\157\164\040\103\101\040 -\055\040\122\065\061\023\060\021\006\003\125\004\012\023\012\107 -\154\157\142\141\154\123\151\147\156\061\023\060\021\006\003\125 -\004\003\023\012\107\154\157\142\141\154\123\151\147\156\060\036 -\027\015\061\062\061\061\061\063\060\060\060\060\060\060\132\027 -\015\063\070\060\061\061\071\060\063\061\064\060\067\132\060\120 -\061\044\060\042\006\003\125\004\013\023\033\107\154\157\142\141 -\154\123\151\147\156\040\105\103\103\040\122\157\157\164\040\103 -\101\040\055\040\122\065\061\023\060\021\006\003\125\004\012\023 -\012\107\154\157\142\141\154\123\151\147\156\061\023\060\021\006 -\003\125\004\003\023\012\107\154\157\142\141\154\123\151\147\156 -\060\166\060\020\006\007\052\206\110\316\075\002\001\006\005\053 -\201\004\000\042\003\142\000\004\107\105\016\226\373\175\135\277 -\351\071\321\041\370\237\013\266\325\173\036\222\072\110\131\034 -\360\142\061\055\300\172\050\376\032\247\134\263\266\314\227\347 -\105\324\130\372\321\167\155\103\242\300\207\145\064\012\037\172 -\335\353\074\063\241\305\235\115\244\157\101\225\070\177\311\036 -\204\353\321\236\111\222\207\224\207\014\072\205\112\146\237\235 -\131\223\115\227\141\006\206\112\243\102\060\100\060\016\006\003 -\125\035\017\001\001\377\004\004\003\002\001\006\060\017\006\003 -\125\035\023\001\001\377\004\005\060\003\001\001\377\060\035\006 -\003\125\035\016\004\026\004\024\075\346\051\110\233\352\007\312 -\041\104\112\046\336\156\336\322\203\320\237\131\060\012\006\010 -\052\206\110\316\075\004\003\003\003\150\000\060\145\002\061\000 -\345\151\022\311\156\333\306\061\272\011\101\341\227\370\373\375 -\232\342\175\022\311\355\174\144\323\313\005\045\213\126\331\240 -\347\136\135\116\013\203\234\133\166\051\240\011\046\041\152\142 -\002\060\161\322\265\217\134\352\073\341\170\011\205\250\165\222 -\073\310\134\375\110\357\015\164\042\250\010\342\156\305\111\316 -\307\014\274\247\141\151\361\367\073\341\052\313\371\053\363\146 -\220\067 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "GlobalSign ECC Root CA - R5" -# Issuer: CN=GlobalSign,O=GlobalSign,OU=GlobalSign ECC Root CA - R5 -# Serial Number:60:59:49:e0:26:2e:bb:55:f9:0a:77:8a:71:f9:4a:d8:6c -# Subject: CN=GlobalSign,O=GlobalSign,OU=GlobalSign ECC Root CA - R5 -# Not Valid Before: Tue Nov 13 00:00:00 2012 -# Not Valid After : Tue Jan 19 03:14:07 2038 -# Fingerprint (SHA-256): 17:9F:BC:14:8A:3D:D0:0F:D2:4E:A1:34:58:CC:43:BF:A7:F5:9C:81:82:D7:83:A5:13:F6:EB:EC:10:0C:89:24 -# Fingerprint (SHA1): 1F:24:C6:30:CD:A4:18:EF:20:69:FF:AD:4F:DD:5F:46:3A:1B:69:AA -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "GlobalSign ECC Root CA - R5" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\037\044\306\060\315\244\030\357\040\151\377\255\117\335\137\106 -\072\033\151\252 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\237\255\073\034\002\036\212\272\027\164\070\201\014\242\274\010 -END -CKA_ISSUER MULTILINE_OCTAL -\060\120\061\044\060\042\006\003\125\004\013\023\033\107\154\157 -\142\141\154\123\151\147\156\040\105\103\103\040\122\157\157\164 -\040\103\101\040\055\040\122\065\061\023\060\021\006\003\125\004 -\012\023\012\107\154\157\142\141\154\123\151\147\156\061\023\060 -\021\006\003\125\004\003\023\012\107\154\157\142\141\154\123\151 -\147\156 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\021\140\131\111\340\046\056\273\125\371\012\167\212\161\371 -\112\330\154 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Staat der Nederlanden Root CA - G3" -# -# Issuer: CN=Staat der Nederlanden Root CA - G3,O=Staat der Nederlanden,C=NL -# Serial Number: 10003001 (0x98a239) -# Subject: CN=Staat der Nederlanden Root CA - G3,O=Staat der Nederlanden,C=NL -# Not Valid Before: Thu Nov 14 11:28:42 2013 -# Not Valid After : Mon Nov 13 23:00:00 2028 -# Fingerprint (SHA-256): 3C:4F:B0:B9:5A:B8:B3:00:32:F4:32:B8:6F:53:5F:E1:72:C1:85:D0:FD:39:86:58:37:CF:36:18:7F:A6:F4:28 -# Fingerprint (SHA1): D8:EB:6B:41:51:92:59:E0:F3:E7:85:00:C0:3D:B6:88:97:C9:EE:FC -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Staat der Nederlanden Root CA - G3" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\132\061\013\060\011\006\003\125\004\006\023\002\116\114\061 -\036\060\034\006\003\125\004\012\014\025\123\164\141\141\164\040 -\144\145\162\040\116\145\144\145\162\154\141\156\144\145\156\061 -\053\060\051\006\003\125\004\003\014\042\123\164\141\141\164\040 -\144\145\162\040\116\145\144\145\162\154\141\156\144\145\156\040 -\122\157\157\164\040\103\101\040\055\040\107\063 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\132\061\013\060\011\006\003\125\004\006\023\002\116\114\061 -\036\060\034\006\003\125\004\012\014\025\123\164\141\141\164\040 -\144\145\162\040\116\145\144\145\162\154\141\156\144\145\156\061 -\053\060\051\006\003\125\004\003\014\042\123\164\141\141\164\040 -\144\145\162\040\116\145\144\145\162\154\141\156\144\145\156\040 -\122\157\157\164\040\103\101\040\055\040\107\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\004\000\230\242\071 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\164\060\202\003\134\240\003\002\001\002\002\004\000 -\230\242\071\060\015\006\011\052\206\110\206\367\015\001\001\013 -\005\000\060\132\061\013\060\011\006\003\125\004\006\023\002\116 -\114\061\036\060\034\006\003\125\004\012\014\025\123\164\141\141 -\164\040\144\145\162\040\116\145\144\145\162\154\141\156\144\145 -\156\061\053\060\051\006\003\125\004\003\014\042\123\164\141\141 -\164\040\144\145\162\040\116\145\144\145\162\154\141\156\144\145 -\156\040\122\157\157\164\040\103\101\040\055\040\107\063\060\036 -\027\015\061\063\061\061\061\064\061\061\062\070\064\062\132\027 -\015\062\070\061\061\061\063\062\063\060\060\060\060\132\060\132 -\061\013\060\011\006\003\125\004\006\023\002\116\114\061\036\060 -\034\006\003\125\004\012\014\025\123\164\141\141\164\040\144\145 -\162\040\116\145\144\145\162\154\141\156\144\145\156\061\053\060 -\051\006\003\125\004\003\014\042\123\164\141\141\164\040\144\145 -\162\040\116\145\144\145\162\154\141\156\144\145\156\040\122\157 -\157\164\040\103\101\040\055\040\107\063\060\202\002\042\060\015 -\006\011\052\206\110\206\367\015\001\001\001\005\000\003\202\002 -\017\000\060\202\002\012\002\202\002\001\000\276\062\242\124\017 -\160\373\054\134\131\353\154\304\244\121\350\205\052\263\314\112 -\064\362\260\137\363\016\307\034\075\123\036\210\010\150\330\157 -\075\255\302\236\314\202\147\007\047\207\150\161\072\237\165\226 -\042\106\005\260\355\255\307\133\236\052\336\234\374\072\306\225 -\247\365\027\147\030\347\057\111\010\014\134\317\346\314\064\355 -\170\373\120\261\334\153\062\360\242\376\266\074\344\354\132\227 -\307\077\036\160\010\060\240\334\305\263\155\157\320\202\162\021 -\253\322\201\150\131\202\027\267\170\222\140\372\314\336\077\204 -\353\215\070\063\220\012\162\043\372\065\314\046\161\061\321\162 -\050\222\331\133\043\155\146\265\155\007\102\353\246\063\316\222 -\333\300\366\154\143\170\315\312\116\075\265\345\122\233\361\276 -\073\346\124\140\260\146\036\011\253\007\376\124\211\021\102\321 -\367\044\272\140\170\032\230\367\311\021\375\026\301\065\032\124 -\165\357\103\323\345\256\116\316\347\173\303\306\116\141\121\113 -\253\232\105\113\241\037\101\275\110\123\025\161\144\013\206\263 -\345\056\276\316\244\033\301\051\204\242\265\313\010\043\166\103 -\042\044\037\027\004\324\156\234\306\374\177\053\146\032\354\212 -\345\326\317\115\365\143\011\267\025\071\326\173\254\353\343\174 -\351\116\374\165\102\310\355\130\225\014\006\102\242\234\367\344 -\160\263\337\162\157\132\067\100\211\330\205\244\327\361\013\336 -\103\031\324\112\130\054\214\212\071\236\277\204\207\361\026\073 -\066\014\351\323\264\312\154\031\101\122\011\241\035\260\152\277 -\202\357\160\121\041\062\334\005\166\214\313\367\144\344\003\120 -\257\214\221\147\253\305\362\356\130\330\336\276\367\347\061\317 -\154\311\073\161\301\325\210\265\145\274\300\350\027\027\007\022 -\265\134\322\253\040\223\264\346\202\203\160\066\305\315\243\215 -\255\213\354\243\301\103\207\346\103\342\064\276\225\213\065\355 -\007\071\332\250\035\172\237\066\236\022\260\014\145\022\220\025 -\140\331\046\100\104\343\126\140\245\020\324\152\074\375\101\334 -\016\132\107\266\357\227\141\165\117\331\376\307\262\035\324\355 -\135\111\263\251\152\313\146\204\023\325\134\240\334\337\156\167 -\006\321\161\165\310\127\157\257\017\167\133\002\003\001\000\001 -\243\102\060\100\060\017\006\003\125\035\023\001\001\377\004\005 -\060\003\001\001\377\060\016\006\003\125\035\017\001\001\377\004 -\004\003\002\001\006\060\035\006\003\125\035\016\004\026\004\024 -\124\255\372\307\222\127\256\312\065\234\056\022\373\344\272\135 -\040\334\224\127\060\015\006\011\052\206\110\206\367\015\001\001 -\013\005\000\003\202\002\001\000\060\231\235\005\062\310\136\016 -\073\230\001\072\212\244\347\007\367\172\370\347\232\337\120\103 -\123\227\052\075\312\074\107\230\056\341\025\173\361\222\363\141 -\332\220\045\026\145\300\237\124\135\016\003\073\133\167\002\234 -\204\266\015\230\137\064\335\073\143\302\303\050\201\302\234\051 -\056\051\342\310\303\001\362\063\352\052\252\314\011\010\367\145 -\147\306\315\337\323\266\053\247\275\314\321\016\160\137\270\043 -\321\313\221\116\012\364\310\172\345\331\143\066\301\324\337\374 -\042\227\367\140\135\352\051\057\130\262\275\130\275\215\226\117 -\020\165\277\110\173\075\121\207\241\074\164\042\302\374\007\177 -\200\334\304\254\376\152\301\160\060\260\351\216\151\342\054\151 -\201\224\011\272\335\376\115\300\203\214\224\130\300\106\040\257 -\234\037\002\370\065\125\111\057\106\324\300\360\240\226\002\017 -\063\305\161\363\236\043\175\224\267\375\072\323\011\203\006\041 -\375\140\075\256\062\300\322\356\215\246\360\347\264\202\174\012 -\314\160\311\171\200\370\376\114\367\065\204\031\212\061\373\012 -\331\327\177\233\360\242\232\153\303\005\112\355\101\140\024\060 -\321\252\021\102\156\323\043\002\004\013\306\145\335\335\122\167 -\332\201\153\262\250\372\001\070\271\226\352\052\154\147\227\211 -\224\236\274\341\124\325\344\152\170\357\112\275\053\232\075\100 -\176\306\300\165\322\156\373\150\060\354\354\213\235\371\111\065 -\232\032\054\331\263\225\071\325\036\222\367\246\271\145\057\345 -\075\155\072\110\114\010\334\344\050\022\050\276\175\065\134\352 -\340\026\176\023\033\152\327\076\327\236\374\055\165\262\301\024 -\325\043\003\333\133\157\013\076\170\057\015\336\063\215\026\267 -\110\347\203\232\201\017\173\301\103\115\125\004\027\070\112\121 -\325\131\242\211\164\323\237\276\036\113\327\306\155\267\210\044 -\157\140\221\244\202\205\133\126\101\274\320\104\253\152\023\276 -\321\054\130\267\022\063\130\262\067\143\334\023\365\224\035\077 -\100\121\365\117\365\072\355\310\305\353\302\036\035\026\225\172 -\307\176\102\161\223\156\113\025\267\060\337\252\355\127\205\110 -\254\035\152\335\071\151\344\341\171\170\276\316\005\277\241\014 -\367\200\173\041\147\047\060\131 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Staat der Nederlanden Root CA - G3" -# Issuer: CN=Staat der Nederlanden Root CA - G3,O=Staat der Nederlanden,C=NL -# Serial Number: 10003001 (0x98a239) -# Subject: CN=Staat der Nederlanden Root CA - G3,O=Staat der Nederlanden,C=NL -# Not Valid Before: Thu Nov 14 11:28:42 2013 -# Not Valid After : Mon Nov 13 23:00:00 2028 -# Fingerprint (SHA-256): 3C:4F:B0:B9:5A:B8:B3:00:32:F4:32:B8:6F:53:5F:E1:72:C1:85:D0:FD:39:86:58:37:CF:36:18:7F:A6:F4:28 -# Fingerprint (SHA1): D8:EB:6B:41:51:92:59:E0:F3:E7:85:00:C0:3D:B6:88:97:C9:EE:FC -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Staat der Nederlanden Root CA - G3" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\330\353\153\101\121\222\131\340\363\347\205\000\300\075\266\210 -\227\311\356\374 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\013\106\147\007\333\020\057\031\214\065\120\140\321\013\364\067 -END -CKA_ISSUER MULTILINE_OCTAL -\060\132\061\013\060\011\006\003\125\004\006\023\002\116\114\061 -\036\060\034\006\003\125\004\012\014\025\123\164\141\141\164\040 -\144\145\162\040\116\145\144\145\162\154\141\156\144\145\156\061 -\053\060\051\006\003\125\004\003\014\042\123\164\141\141\164\040 -\144\145\162\040\116\145\144\145\162\154\141\156\144\145\156\040 -\122\157\157\164\040\103\101\040\055\040\107\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\004\000\230\242\071 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "IdenTrust Commercial Root CA 1" -# -# Issuer: CN=IdenTrust Commercial Root CA 1,O=IdenTrust,C=US -# Serial Number:0a:01:42:80:00:00:01:45:23:c8:44:b5:00:00:00:02 -# Subject: CN=IdenTrust Commercial Root CA 1,O=IdenTrust,C=US -# Not Valid Before: Thu Jan 16 18:12:23 2014 -# Not Valid After : Mon Jan 16 18:12:23 2034 -# Fingerprint (SHA-256): 5D:56:49:9B:E4:D2:E0:8B:CF:CA:D0:8A:3E:38:72:3D:50:50:3B:DE:70:69:48:E4:2F:55:60:30:19:E5:28:AE -# Fingerprint (SHA1): DF:71:7E:AA:4A:D9:4E:C9:55:84:99:60:2D:48:DE:5F:BC:F0:3A:25 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "IdenTrust Commercial Root CA 1" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\112\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\022\060\020\006\003\125\004\012\023\011\111\144\145\156\124\162 -\165\163\164\061\047\060\045\006\003\125\004\003\023\036\111\144 -\145\156\124\162\165\163\164\040\103\157\155\155\145\162\143\151 -\141\154\040\122\157\157\164\040\103\101\040\061 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\112\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\022\060\020\006\003\125\004\012\023\011\111\144\145\156\124\162 -\165\163\164\061\047\060\045\006\003\125\004\003\023\036\111\144 -\145\156\124\162\165\163\164\040\103\157\155\155\145\162\143\151 -\141\154\040\122\157\157\164\040\103\101\040\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\012\001\102\200\000\000\001\105\043\310\104\265\000\000 -\000\002 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\140\060\202\003\110\240\003\002\001\002\002\020\012 -\001\102\200\000\000\001\105\043\310\104\265\000\000\000\002\060 -\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060\112 -\061\013\060\011\006\003\125\004\006\023\002\125\123\061\022\060 -\020\006\003\125\004\012\023\011\111\144\145\156\124\162\165\163 -\164\061\047\060\045\006\003\125\004\003\023\036\111\144\145\156 -\124\162\165\163\164\040\103\157\155\155\145\162\143\151\141\154 -\040\122\157\157\164\040\103\101\040\061\060\036\027\015\061\064 -\060\061\061\066\061\070\061\062\062\063\132\027\015\063\064\060 -\061\061\066\061\070\061\062\062\063\132\060\112\061\013\060\011 -\006\003\125\004\006\023\002\125\123\061\022\060\020\006\003\125 -\004\012\023\011\111\144\145\156\124\162\165\163\164\061\047\060 -\045\006\003\125\004\003\023\036\111\144\145\156\124\162\165\163 -\164\040\103\157\155\155\145\162\143\151\141\154\040\122\157\157 -\164\040\103\101\040\061\060\202\002\042\060\015\006\011\052\206 -\110\206\367\015\001\001\001\005\000\003\202\002\017\000\060\202 -\002\012\002\202\002\001\000\247\120\031\336\077\231\075\324\063 -\106\361\157\121\141\202\262\251\117\217\147\211\135\204\331\123 -\335\014\050\331\327\360\377\256\225\103\162\231\371\265\135\174 -\212\301\102\341\061\120\164\321\201\015\174\315\233\041\253\103 -\342\254\255\136\206\156\363\011\212\037\132\062\275\242\353\224 -\371\350\134\012\354\377\230\322\257\161\263\264\123\237\116\207 -\357\222\274\275\354\117\062\060\210\113\027\136\127\304\123\302 -\366\002\227\215\331\142\053\277\044\037\142\215\337\303\270\051 -\113\111\170\074\223\140\210\042\374\231\332\066\310\302\242\324 -\054\124\000\147\065\156\163\277\002\130\360\244\335\345\260\242 -\046\172\312\340\066\245\031\026\365\375\267\357\256\077\100\365 -\155\132\004\375\316\064\312\044\334\164\043\033\135\063\023\022 -\135\304\001\045\366\060\335\002\135\237\340\325\107\275\264\353 -\033\241\273\111\111\330\237\133\002\363\212\344\044\220\344\142 -\117\117\301\257\213\016\164\027\250\321\162\210\152\172\001\111 -\314\264\106\171\306\027\261\332\230\036\007\131\372\165\041\205 -\145\335\220\126\316\373\253\245\140\235\304\235\371\122\260\213 -\275\207\371\217\053\043\012\043\166\073\367\063\341\311\000\363 -\151\371\113\242\340\116\274\176\223\071\204\007\367\104\160\176 -\376\007\132\345\261\254\321\030\314\362\065\345\111\111\010\312 -\126\311\075\373\017\030\175\213\073\301\023\302\115\217\311\117 -\016\067\351\037\241\016\152\337\142\056\313\065\006\121\171\054 -\310\045\070\364\372\113\247\211\134\234\322\343\015\071\206\112 -\164\174\325\131\207\302\077\116\014\134\122\364\075\367\122\202 -\361\352\243\254\375\111\064\032\050\363\101\210\072\023\356\350 -\336\377\231\035\137\272\313\350\036\362\271\120\140\300\061\323 -\163\345\357\276\240\355\063\013\164\276\040\040\304\147\154\360 -\010\003\172\125\200\177\106\116\226\247\364\036\076\341\366\330 -\011\341\063\144\053\143\327\062\136\237\371\300\173\017\170\157 -\227\274\223\232\371\234\022\220\170\172\200\207\025\327\162\164 -\234\125\164\170\261\272\341\156\160\004\272\117\240\272\150\303 -\173\377\061\360\163\075\075\224\052\261\013\101\016\240\376\115 -\210\145\153\171\063\264\327\002\003\001\000\001\243\102\060\100 -\060\016\006\003\125\035\017\001\001\377\004\004\003\002\001\006 -\060\017\006\003\125\035\023\001\001\377\004\005\060\003\001\001 -\377\060\035\006\003\125\035\016\004\026\004\024\355\104\031\300 -\323\360\006\213\356\244\173\276\102\347\046\124\310\216\066\166 -\060\015\006\011\052\206\110\206\367\015\001\001\013\005\000\003 -\202\002\001\000\015\256\220\062\366\246\113\174\104\166\031\141 -\036\047\050\315\136\124\357\045\274\343\010\220\371\051\327\256 -\150\010\341\224\000\130\357\056\056\176\123\122\214\266\134\007 -\352\210\272\231\213\120\224\327\202\200\337\141\011\000\223\255 -\015\024\346\316\301\362\067\224\170\260\137\234\263\242\163\270 -\217\005\223\070\315\215\076\260\270\373\300\317\261\362\354\055 -\055\033\314\354\252\232\263\252\140\202\033\055\073\303\204\075 -\127\212\226\036\234\165\270\323\060\315\140\010\203\220\323\216 -\124\361\115\146\300\135\164\003\100\243\356\205\176\302\037\167 -\234\006\350\301\247\030\135\122\225\355\311\335\045\236\155\372 -\251\355\243\072\064\320\131\173\332\355\120\363\065\277\355\353 -\024\115\061\307\140\364\332\361\207\234\342\110\342\306\305\067 -\373\006\020\372\165\131\146\061\107\051\332\166\232\034\351\202 -\256\357\232\271\121\367\210\043\232\151\225\142\074\345\125\200 -\066\327\124\002\377\361\271\135\316\324\043\157\330\105\204\112 -\133\145\357\211\014\335\024\247\040\313\030\245\045\264\015\371 -\001\360\242\322\364\000\310\164\216\241\052\110\216\145\333\023 -\304\342\045\027\175\353\276\207\133\027\040\124\121\223\112\123 -\003\013\354\135\312\063\355\142\375\105\307\057\133\334\130\240 -\200\071\346\372\327\376\023\024\246\355\075\224\112\102\164\324 -\303\167\131\163\315\217\106\276\125\070\357\372\350\221\062\352 -\227\130\004\042\336\070\303\314\274\155\311\063\072\152\012\151 -\077\240\310\352\162\217\214\143\206\043\275\155\074\226\236\225 -\340\111\114\252\242\271\052\033\234\066\201\170\355\303\350\106 -\342\046\131\104\165\036\331\165\211\121\315\020\204\235\141\140 -\313\135\371\227\042\115\216\230\346\343\177\366\133\273\256\315 -\312\112\201\153\136\013\363\121\341\164\053\351\176\047\247\331 -\231\111\116\370\245\200\333\045\017\034\143\142\212\311\063\147 -\153\074\020\203\306\255\336\250\315\026\216\215\360\007\067\161 -\237\362\253\374\101\365\301\213\354\000\067\135\011\345\116\200 -\357\372\261\134\070\006\245\033\112\341\334\070\055\074\334\253 -\037\220\032\325\112\234\356\321\160\154\314\356\364\127\370\030 -\272\204\156\207 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "IdenTrust Commercial Root CA 1" -# Issuer: CN=IdenTrust Commercial Root CA 1,O=IdenTrust,C=US -# Serial Number:0a:01:42:80:00:00:01:45:23:c8:44:b5:00:00:00:02 -# Subject: CN=IdenTrust Commercial Root CA 1,O=IdenTrust,C=US -# Not Valid Before: Thu Jan 16 18:12:23 2014 -# Not Valid After : Mon Jan 16 18:12:23 2034 -# Fingerprint (SHA-256): 5D:56:49:9B:E4:D2:E0:8B:CF:CA:D0:8A:3E:38:72:3D:50:50:3B:DE:70:69:48:E4:2F:55:60:30:19:E5:28:AE -# Fingerprint (SHA1): DF:71:7E:AA:4A:D9:4E:C9:55:84:99:60:2D:48:DE:5F:BC:F0:3A:25 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "IdenTrust Commercial Root CA 1" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\337\161\176\252\112\331\116\311\125\204\231\140\055\110\336\137 -\274\360\072\045 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\263\076\167\163\165\356\240\323\343\176\111\143\111\131\273\307 -END -CKA_ISSUER MULTILINE_OCTAL -\060\112\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\022\060\020\006\003\125\004\012\023\011\111\144\145\156\124\162 -\165\163\164\061\047\060\045\006\003\125\004\003\023\036\111\144 -\145\156\124\162\165\163\164\040\103\157\155\155\145\162\143\151 -\141\154\040\122\157\157\164\040\103\101\040\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\012\001\102\200\000\000\001\105\043\310\104\265\000\000 -\000\002 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "IdenTrust Public Sector Root CA 1" -# -# Issuer: CN=IdenTrust Public Sector Root CA 1,O=IdenTrust,C=US -# Serial Number:0a:01:42:80:00:00:01:45:23:cf:46:7c:00:00:00:02 -# Subject: CN=IdenTrust Public Sector Root CA 1,O=IdenTrust,C=US -# Not Valid Before: Thu Jan 16 17:53:32 2014 -# Not Valid After : Mon Jan 16 17:53:32 2034 -# Fingerprint (SHA-256): 30:D0:89:5A:9A:44:8A:26:20:91:63:55:22:D1:F5:20:10:B5:86:7A:CA:E1:2C:78:EF:95:8F:D4:F4:38:9F:2F -# Fingerprint (SHA1): BA:29:41:60:77:98:3F:F4:F3:EF:F2:31:05:3B:2E:EA:6D:4D:45:FD -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "IdenTrust Public Sector Root CA 1" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\115\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\022\060\020\006\003\125\004\012\023\011\111\144\145\156\124\162 -\165\163\164\061\052\060\050\006\003\125\004\003\023\041\111\144 -\145\156\124\162\165\163\164\040\120\165\142\154\151\143\040\123 -\145\143\164\157\162\040\122\157\157\164\040\103\101\040\061 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\115\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\022\060\020\006\003\125\004\012\023\011\111\144\145\156\124\162 -\165\163\164\061\052\060\050\006\003\125\004\003\023\041\111\144 -\145\156\124\162\165\163\164\040\120\165\142\154\151\143\040\123 -\145\143\164\157\162\040\122\157\157\164\040\103\101\040\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\012\001\102\200\000\000\001\105\043\317\106\174\000\000 -\000\002 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\146\060\202\003\116\240\003\002\001\002\002\020\012 -\001\102\200\000\000\001\105\043\317\106\174\000\000\000\002\060 -\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060\115 -\061\013\060\011\006\003\125\004\006\023\002\125\123\061\022\060 -\020\006\003\125\004\012\023\011\111\144\145\156\124\162\165\163 -\164\061\052\060\050\006\003\125\004\003\023\041\111\144\145\156 -\124\162\165\163\164\040\120\165\142\154\151\143\040\123\145\143 -\164\157\162\040\122\157\157\164\040\103\101\040\061\060\036\027 -\015\061\064\060\061\061\066\061\067\065\063\063\062\132\027\015 -\063\064\060\061\061\066\061\067\065\063\063\062\132\060\115\061 -\013\060\011\006\003\125\004\006\023\002\125\123\061\022\060\020 -\006\003\125\004\012\023\011\111\144\145\156\124\162\165\163\164 -\061\052\060\050\006\003\125\004\003\023\041\111\144\145\156\124 -\162\165\163\164\040\120\165\142\154\151\143\040\123\145\143\164 -\157\162\040\122\157\157\164\040\103\101\040\061\060\202\002\042 -\060\015\006\011\052\206\110\206\367\015\001\001\001\005\000\003 -\202\002\017\000\060\202\002\012\002\202\002\001\000\266\042\224 -\374\244\110\257\350\107\153\012\373\047\166\344\362\077\212\073 -\172\112\054\061\052\214\215\260\251\303\061\153\250\167\166\204 -\046\266\254\201\102\015\010\353\125\130\273\172\370\274\145\175 -\362\240\155\213\250\107\351\142\166\036\021\356\010\024\321\262 -\104\026\364\352\320\372\036\057\136\333\313\163\101\256\274\000 -\260\112\053\100\262\254\341\073\113\302\055\235\344\241\233\354 -\032\072\036\360\010\263\320\344\044\065\007\237\234\264\311\122 -\155\333\007\312\217\265\133\360\203\363\117\307\055\245\310\255 -\313\225\040\244\061\050\127\130\132\344\215\033\232\253\236\015 -\014\362\012\063\071\042\071\012\227\056\363\123\167\271\104\105 -\375\204\313\066\040\201\131\055\232\157\155\110\110\141\312\114 -\337\123\321\257\122\274\104\237\253\057\153\203\162\357\165\200 -\332\006\063\033\135\310\332\143\306\115\315\254\146\061\315\321 -\336\076\207\020\066\341\271\244\172\357\140\120\262\313\312\246 -\126\340\067\257\253\064\023\071\045\350\071\146\344\230\172\252 -\022\230\234\131\146\206\076\255\361\260\312\076\006\017\173\360 -\021\113\067\240\104\155\173\313\250\214\161\364\325\265\221\066 -\314\360\025\306\053\336\121\027\261\227\114\120\075\261\225\131 -\174\005\175\055\041\325\000\277\001\147\242\136\173\246\134\362 -\367\042\361\220\015\223\333\252\104\121\146\314\175\166\003\353 -\152\250\052\070\031\227\166\015\153\212\141\371\274\366\356\166 -\375\160\053\335\051\074\370\012\036\133\102\034\213\126\057\125 -\033\034\241\056\265\307\026\346\370\252\074\222\216\151\266\001 -\301\265\206\235\211\017\013\070\224\124\350\352\334\236\075\045 -\274\123\046\355\325\253\071\252\305\100\114\124\253\262\264\331 -\331\370\327\162\333\034\274\155\275\145\137\357\210\065\052\146 -\057\356\366\263\145\360\063\215\174\230\101\151\106\017\103\034 -\151\372\233\265\320\141\152\315\312\113\331\114\220\106\253\025 -\131\241\107\124\051\056\203\050\137\034\302\242\253\162\027\000 -\006\216\105\354\213\342\063\075\177\332\031\104\344\142\162\303 -\337\042\306\362\126\324\335\137\225\162\355\155\137\367\110\003 -\133\375\305\052\240\366\163\043\204\020\033\001\347\002\003\001 -\000\001\243\102\060\100\060\016\006\003\125\035\017\001\001\377 -\004\004\003\002\001\006\060\017\006\003\125\035\023\001\001\377 -\004\005\060\003\001\001\377\060\035\006\003\125\035\016\004\026 -\004\024\343\161\340\236\330\247\102\331\333\161\221\153\224\223 -\353\303\243\321\024\243\060\015\006\011\052\206\110\206\367\015 -\001\001\013\005\000\003\202\002\001\000\107\372\335\012\260\021 -\221\070\255\115\135\367\345\016\227\124\031\202\110\207\124\214 -\252\144\231\330\132\376\210\001\305\130\245\231\261\043\124\043 -\267\152\035\040\127\345\001\142\101\027\323\011\333\165\313\156 -\124\220\165\376\032\237\201\012\302\335\327\367\011\320\133\162 -\025\344\036\011\152\075\063\363\041\232\346\025\176\255\121\325 -\015\020\355\175\102\300\217\356\300\232\010\325\101\326\134\016 -\041\151\156\200\141\016\025\300\270\317\305\111\022\122\314\276 -\072\314\324\056\070\005\336\065\375\037\157\270\200\150\230\075 -\115\240\312\100\145\322\163\174\365\213\331\012\225\077\330\077 -\043\155\032\321\052\044\031\331\205\263\027\357\170\156\251\130 -\321\043\323\307\023\355\162\045\177\135\261\163\160\320\177\006 -\227\011\204\051\200\141\035\372\136\377\163\254\240\343\211\270 -\034\161\025\306\336\061\177\022\334\341\155\233\257\347\350\237 -\165\170\114\253\106\073\232\316\277\005\030\135\115\025\074\026 -\232\031\120\004\232\262\232\157\145\213\122\137\074\130\004\050 -\045\300\146\141\061\176\271\340\165\271\032\250\201\326\162\027 -\263\305\003\061\065\021\170\170\242\340\351\060\214\177\200\337 -\130\337\074\272\047\226\342\200\064\155\343\230\323\144\047\254 -\110\176\050\167\134\306\045\141\045\370\205\014\145\372\304\062 -\057\245\230\005\344\370\013\147\026\026\306\202\270\062\031\371 -\371\271\171\334\037\315\353\257\253\016\335\033\333\105\344\172 -\347\002\342\225\135\374\151\360\123\151\141\225\165\171\013\136 -\125\346\070\034\224\251\131\063\236\310\161\164\171\177\121\211 -\266\310\152\270\060\310\152\070\303\156\236\341\067\026\352\005 -\142\114\133\022\107\355\247\264\263\130\126\307\111\363\177\022 -\150\011\061\161\360\155\370\116\107\373\326\205\356\305\130\100 -\031\244\035\247\371\113\103\067\334\150\132\117\317\353\302\144 -\164\336\264\025\331\364\124\124\032\057\034\327\227\161\124\220 -\216\331\040\235\123\053\177\253\217\342\352\060\274\120\067\357 -\361\107\265\175\174\054\004\354\150\235\264\111\104\020\364\162 -\113\034\144\347\374\346\153\220\335\151\175\151\375\000\126\245 -\267\254\266\255\267\312\076\001\357\234 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "IdenTrust Public Sector Root CA 1" -# Issuer: CN=IdenTrust Public Sector Root CA 1,O=IdenTrust,C=US -# Serial Number:0a:01:42:80:00:00:01:45:23:cf:46:7c:00:00:00:02 -# Subject: CN=IdenTrust Public Sector Root CA 1,O=IdenTrust,C=US -# Not Valid Before: Thu Jan 16 17:53:32 2014 -# Not Valid After : Mon Jan 16 17:53:32 2034 -# Fingerprint (SHA-256): 30:D0:89:5A:9A:44:8A:26:20:91:63:55:22:D1:F5:20:10:B5:86:7A:CA:E1:2C:78:EF:95:8F:D4:F4:38:9F:2F -# Fingerprint (SHA1): BA:29:41:60:77:98:3F:F4:F3:EF:F2:31:05:3B:2E:EA:6D:4D:45:FD -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "IdenTrust Public Sector Root CA 1" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\272\051\101\140\167\230\077\364\363\357\362\061\005\073\056\352 -\155\115\105\375 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\067\006\245\260\374\211\235\272\364\153\214\032\144\315\325\272 -END -CKA_ISSUER MULTILINE_OCTAL -\060\115\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\022\060\020\006\003\125\004\012\023\011\111\144\145\156\124\162 -\165\163\164\061\052\060\050\006\003\125\004\003\023\041\111\144 -\145\156\124\162\165\163\164\040\120\165\142\154\151\143\040\123 -\145\143\164\157\162\040\122\157\157\164\040\103\101\040\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\012\001\102\200\000\000\001\105\043\317\106\174\000\000 -\000\002 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Entrust Root Certification Authority - G2" -# -# Issuer: CN=Entrust Root Certification Authority - G2,OU="(c) 2009 Entrust, Inc. - for authorized use only",OU=See www.entrust.net/legal-terms,O="Entrust, Inc.",C=US -# Serial Number: 1246989352 (0x4a538c28) -# Subject: CN=Entrust Root Certification Authority - G2,OU="(c) 2009 Entrust, Inc. - for authorized use only",OU=See www.entrust.net/legal-terms,O="Entrust, Inc.",C=US -# Not Valid Before: Tue Jul 07 17:25:54 2009 -# Not Valid After : Sat Dec 07 17:55:54 2030 -# Fingerprint (SHA-256): 43:DF:57:74:B0:3E:7F:EF:5F:E4:0D:93:1A:7B:ED:F1:BB:2E:6B:42:73:8C:4E:6D:38:41:10:3D:3A:A7:F3:39 -# Fingerprint (SHA1): 8C:F4:27:FD:79:0C:3A:D1:66:06:8D:E8:1E:57:EF:BB:93:22:72:D4 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Entrust Root Certification Authority - G2" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\201\276\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\026\060\024\006\003\125\004\012\023\015\105\156\164\162\165 -\163\164\054\040\111\156\143\056\061\050\060\046\006\003\125\004 -\013\023\037\123\145\145\040\167\167\167\056\145\156\164\162\165 -\163\164\056\156\145\164\057\154\145\147\141\154\055\164\145\162 -\155\163\061\071\060\067\006\003\125\004\013\023\060\050\143\051 -\040\062\060\060\071\040\105\156\164\162\165\163\164\054\040\111 -\156\143\056\040\055\040\146\157\162\040\141\165\164\150\157\162 -\151\172\145\144\040\165\163\145\040\157\156\154\171\061\062\060 -\060\006\003\125\004\003\023\051\105\156\164\162\165\163\164\040 -\122\157\157\164\040\103\145\162\164\151\146\151\143\141\164\151 -\157\156\040\101\165\164\150\157\162\151\164\171\040\055\040\107 -\062 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\201\276\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\026\060\024\006\003\125\004\012\023\015\105\156\164\162\165 -\163\164\054\040\111\156\143\056\061\050\060\046\006\003\125\004 -\013\023\037\123\145\145\040\167\167\167\056\145\156\164\162\165 -\163\164\056\156\145\164\057\154\145\147\141\154\055\164\145\162 -\155\163\061\071\060\067\006\003\125\004\013\023\060\050\143\051 -\040\062\060\060\071\040\105\156\164\162\165\163\164\054\040\111 -\156\143\056\040\055\040\146\157\162\040\141\165\164\150\157\162 -\151\172\145\144\040\165\163\145\040\157\156\154\171\061\062\060 -\060\006\003\125\004\003\023\051\105\156\164\162\165\163\164\040 -\122\157\157\164\040\103\145\162\164\151\146\151\143\141\164\151 -\157\156\040\101\165\164\150\157\162\151\164\171\040\055\040\107 -\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\004\112\123\214\050 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\004\076\060\202\003\046\240\003\002\001\002\002\004\112 -\123\214\050\060\015\006\011\052\206\110\206\367\015\001\001\013 -\005\000\060\201\276\061\013\060\011\006\003\125\004\006\023\002 -\125\123\061\026\060\024\006\003\125\004\012\023\015\105\156\164 -\162\165\163\164\054\040\111\156\143\056\061\050\060\046\006\003 -\125\004\013\023\037\123\145\145\040\167\167\167\056\145\156\164 -\162\165\163\164\056\156\145\164\057\154\145\147\141\154\055\164 -\145\162\155\163\061\071\060\067\006\003\125\004\013\023\060\050 -\143\051\040\062\060\060\071\040\105\156\164\162\165\163\164\054 -\040\111\156\143\056\040\055\040\146\157\162\040\141\165\164\150 -\157\162\151\172\145\144\040\165\163\145\040\157\156\154\171\061 -\062\060\060\006\003\125\004\003\023\051\105\156\164\162\165\163 -\164\040\122\157\157\164\040\103\145\162\164\151\146\151\143\141 -\164\151\157\156\040\101\165\164\150\157\162\151\164\171\040\055 -\040\107\062\060\036\027\015\060\071\060\067\060\067\061\067\062 -\065\065\064\132\027\015\063\060\061\062\060\067\061\067\065\065 -\065\064\132\060\201\276\061\013\060\011\006\003\125\004\006\023 -\002\125\123\061\026\060\024\006\003\125\004\012\023\015\105\156 -\164\162\165\163\164\054\040\111\156\143\056\061\050\060\046\006 -\003\125\004\013\023\037\123\145\145\040\167\167\167\056\145\156 -\164\162\165\163\164\056\156\145\164\057\154\145\147\141\154\055 -\164\145\162\155\163\061\071\060\067\006\003\125\004\013\023\060 -\050\143\051\040\062\060\060\071\040\105\156\164\162\165\163\164 -\054\040\111\156\143\056\040\055\040\146\157\162\040\141\165\164 -\150\157\162\151\172\145\144\040\165\163\145\040\157\156\154\171 -\061\062\060\060\006\003\125\004\003\023\051\105\156\164\162\165 -\163\164\040\122\157\157\164\040\103\145\162\164\151\146\151\143 -\141\164\151\157\156\040\101\165\164\150\157\162\151\164\171\040 -\055\040\107\062\060\202\001\042\060\015\006\011\052\206\110\206 -\367\015\001\001\001\005\000\003\202\001\017\000\060\202\001\012 -\002\202\001\001\000\272\204\266\162\333\236\014\153\342\231\351 -\060\001\247\166\352\062\270\225\101\032\311\332\141\116\130\162 -\317\376\366\202\171\277\163\141\006\012\245\047\330\263\137\323 -\105\116\034\162\326\116\062\362\162\212\017\367\203\031\320\152 -\200\200\000\105\036\260\307\347\232\277\022\127\047\034\243\150 -\057\012\207\275\152\153\016\136\145\363\034\167\325\324\205\215 -\160\041\264\263\062\347\213\242\325\206\071\002\261\270\322\107 -\316\344\311\111\304\073\247\336\373\124\175\127\276\360\350\156 -\302\171\262\072\013\125\342\120\230\026\062\023\134\057\170\126 -\301\302\224\263\362\132\344\047\232\237\044\327\306\354\320\233 -\045\202\343\314\302\304\105\305\214\227\172\006\153\052\021\237 -\251\012\156\110\073\157\333\324\021\031\102\367\217\007\277\365 -\123\137\234\076\364\027\054\346\151\254\116\062\114\142\167\352 -\267\350\345\273\064\274\031\213\256\234\121\347\267\176\265\123 -\261\063\042\345\155\317\160\074\032\372\342\233\147\266\203\364 -\215\245\257\142\114\115\340\130\254\144\064\022\003\370\266\215 -\224\143\044\244\161\002\003\001\000\001\243\102\060\100\060\016 -\006\003\125\035\017\001\001\377\004\004\003\002\001\006\060\017 -\006\003\125\035\023\001\001\377\004\005\060\003\001\001\377\060 -\035\006\003\125\035\016\004\026\004\024\152\162\046\172\320\036 -\357\175\347\073\151\121\324\154\215\237\220\022\146\253\060\015 -\006\011\052\206\110\206\367\015\001\001\013\005\000\003\202\001 -\001\000\171\237\035\226\306\266\171\077\042\215\207\323\207\003 -\004\140\152\153\232\056\131\211\163\021\254\103\321\365\023\377 -\215\071\053\300\362\275\117\160\214\251\057\352\027\304\013\124 -\236\324\033\226\230\063\074\250\255\142\242\000\166\253\131\151 -\156\006\035\176\304\271\104\215\230\257\022\324\141\333\012\031 -\106\107\363\353\367\143\301\100\005\100\245\322\267\364\265\232 -\066\277\251\210\166\210\004\125\004\053\234\207\177\032\067\074 -\176\055\245\032\330\324\211\136\312\275\254\075\154\330\155\257 -\325\363\166\017\315\073\210\070\042\235\154\223\232\304\075\277 -\202\033\145\077\246\017\135\252\374\345\262\025\312\265\255\306 -\274\075\320\204\350\352\006\162\260\115\071\062\170\277\076\021 -\234\013\244\235\232\041\363\360\233\013\060\170\333\301\334\207 -\103\376\274\143\232\312\305\302\034\311\307\215\377\073\022\130 -\010\346\266\075\354\172\054\116\373\203\226\316\014\074\151\207 -\124\163\244\163\302\223\377\121\020\254\025\124\001\330\374\005 -\261\211\241\177\164\203\232\111\327\334\116\173\212\110\157\213 -\105\366 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -# For Server Distrust After: Sat Nov 30 23:59:59 2024 -CKA_NSS_SERVER_DISTRUST_AFTER MULTILINE_OCTAL -\062\064\061\061\063\060\062\063\065\071\065\071\132 -END -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Entrust Root Certification Authority - G2" -# Issuer: CN=Entrust Root Certification Authority - G2,OU="(c) 2009 Entrust, Inc. - for authorized use only",OU=See www.entrust.net/legal-terms,O="Entrust, Inc.",C=US -# Serial Number: 1246989352 (0x4a538c28) -# Subject: CN=Entrust Root Certification Authority - G2,OU="(c) 2009 Entrust, Inc. - for authorized use only",OU=See www.entrust.net/legal-terms,O="Entrust, Inc.",C=US -# Not Valid Before: Tue Jul 07 17:25:54 2009 -# Not Valid After : Sat Dec 07 17:55:54 2030 -# Fingerprint (SHA-256): 43:DF:57:74:B0:3E:7F:EF:5F:E4:0D:93:1A:7B:ED:F1:BB:2E:6B:42:73:8C:4E:6D:38:41:10:3D:3A:A7:F3:39 -# Fingerprint (SHA1): 8C:F4:27:FD:79:0C:3A:D1:66:06:8D:E8:1E:57:EF:BB:93:22:72:D4 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Entrust Root Certification Authority - G2" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\214\364\047\375\171\014\072\321\146\006\215\350\036\127\357\273 -\223\042\162\324 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\113\342\311\221\226\145\014\364\016\132\223\222\240\012\376\262 -END -CKA_ISSUER MULTILINE_OCTAL -\060\201\276\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\026\060\024\006\003\125\004\012\023\015\105\156\164\162\165 -\163\164\054\040\111\156\143\056\061\050\060\046\006\003\125\004 -\013\023\037\123\145\145\040\167\167\167\056\145\156\164\162\165 -\163\164\056\156\145\164\057\154\145\147\141\154\055\164\145\162 -\155\163\061\071\060\067\006\003\125\004\013\023\060\050\143\051 -\040\062\060\060\071\040\105\156\164\162\165\163\164\054\040\111 -\156\143\056\040\055\040\146\157\162\040\141\165\164\150\157\162 -\151\172\145\144\040\165\163\145\040\157\156\154\171\061\062\060 -\060\006\003\125\004\003\023\051\105\156\164\162\165\163\164\040 -\122\157\157\164\040\103\145\162\164\151\146\151\143\141\164\151 -\157\156\040\101\165\164\150\157\162\151\164\171\040\055\040\107 -\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\004\112\123\214\050 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Entrust Root Certification Authority - EC1" -# -# Issuer: CN=Entrust Root Certification Authority - EC1,OU="(c) 2012 Entrust, Inc. - for authorized use only",OU=See www.entrust.net/legal-terms,O="Entrust, Inc.",C=US -# Serial Number:00:a6:8b:79:29:00:00:00:00:50:d0:91:f9 -# Subject: CN=Entrust Root Certification Authority - EC1,OU="(c) 2012 Entrust, Inc. - for authorized use only",OU=See www.entrust.net/legal-terms,O="Entrust, Inc.",C=US -# Not Valid Before: Tue Dec 18 15:25:36 2012 -# Not Valid After : Fri Dec 18 15:55:36 2037 -# Fingerprint (SHA-256): 02:ED:0E:B2:8C:14:DA:45:16:5C:56:67:91:70:0D:64:51:D7:FB:56:F0:B2:AB:1D:3B:8E:B0:70:E5:6E:DF:F5 -# Fingerprint (SHA1): 20:D8:06:40:DF:9B:25:F5:12:25:3A:11:EA:F7:59:8A:EB:14:B5:47 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Entrust Root Certification Authority - EC1" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\201\277\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\026\060\024\006\003\125\004\012\023\015\105\156\164\162\165 -\163\164\054\040\111\156\143\056\061\050\060\046\006\003\125\004 -\013\023\037\123\145\145\040\167\167\167\056\145\156\164\162\165 -\163\164\056\156\145\164\057\154\145\147\141\154\055\164\145\162 -\155\163\061\071\060\067\006\003\125\004\013\023\060\050\143\051 -\040\062\060\061\062\040\105\156\164\162\165\163\164\054\040\111 -\156\143\056\040\055\040\146\157\162\040\141\165\164\150\157\162 -\151\172\145\144\040\165\163\145\040\157\156\154\171\061\063\060 -\061\006\003\125\004\003\023\052\105\156\164\162\165\163\164\040 -\122\157\157\164\040\103\145\162\164\151\146\151\143\141\164\151 -\157\156\040\101\165\164\150\157\162\151\164\171\040\055\040\105 -\103\061 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\201\277\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\026\060\024\006\003\125\004\012\023\015\105\156\164\162\165 -\163\164\054\040\111\156\143\056\061\050\060\046\006\003\125\004 -\013\023\037\123\145\145\040\167\167\167\056\145\156\164\162\165 -\163\164\056\156\145\164\057\154\145\147\141\154\055\164\145\162 -\155\163\061\071\060\067\006\003\125\004\013\023\060\050\143\051 -\040\062\060\061\062\040\105\156\164\162\165\163\164\054\040\111 -\156\143\056\040\055\040\146\157\162\040\141\165\164\150\157\162 -\151\172\145\144\040\165\163\145\040\157\156\154\171\061\063\060 -\061\006\003\125\004\003\023\052\105\156\164\162\165\163\164\040 -\122\157\157\164\040\103\145\162\164\151\146\151\143\141\164\151 -\157\156\040\101\165\164\150\157\162\151\164\171\040\055\040\105 -\103\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\015\000\246\213\171\051\000\000\000\000\120\320\221\371 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\371\060\202\002\200\240\003\002\001\002\002\015\000 -\246\213\171\051\000\000\000\000\120\320\221\371\060\012\006\010 -\052\206\110\316\075\004\003\003\060\201\277\061\013\060\011\006 -\003\125\004\006\023\002\125\123\061\026\060\024\006\003\125\004 -\012\023\015\105\156\164\162\165\163\164\054\040\111\156\143\056 -\061\050\060\046\006\003\125\004\013\023\037\123\145\145\040\167 -\167\167\056\145\156\164\162\165\163\164\056\156\145\164\057\154 -\145\147\141\154\055\164\145\162\155\163\061\071\060\067\006\003 -\125\004\013\023\060\050\143\051\040\062\060\061\062\040\105\156 -\164\162\165\163\164\054\040\111\156\143\056\040\055\040\146\157 -\162\040\141\165\164\150\157\162\151\172\145\144\040\165\163\145 -\040\157\156\154\171\061\063\060\061\006\003\125\004\003\023\052 -\105\156\164\162\165\163\164\040\122\157\157\164\040\103\145\162 -\164\151\146\151\143\141\164\151\157\156\040\101\165\164\150\157 -\162\151\164\171\040\055\040\105\103\061\060\036\027\015\061\062 -\061\062\061\070\061\065\062\065\063\066\132\027\015\063\067\061 -\062\061\070\061\065\065\065\063\066\132\060\201\277\061\013\060 -\011\006\003\125\004\006\023\002\125\123\061\026\060\024\006\003 -\125\004\012\023\015\105\156\164\162\165\163\164\054\040\111\156 -\143\056\061\050\060\046\006\003\125\004\013\023\037\123\145\145 -\040\167\167\167\056\145\156\164\162\165\163\164\056\156\145\164 -\057\154\145\147\141\154\055\164\145\162\155\163\061\071\060\067 -\006\003\125\004\013\023\060\050\143\051\040\062\060\061\062\040 -\105\156\164\162\165\163\164\054\040\111\156\143\056\040\055\040 -\146\157\162\040\141\165\164\150\157\162\151\172\145\144\040\165 -\163\145\040\157\156\154\171\061\063\060\061\006\003\125\004\003 -\023\052\105\156\164\162\165\163\164\040\122\157\157\164\040\103 -\145\162\164\151\146\151\143\141\164\151\157\156\040\101\165\164 -\150\157\162\151\164\171\040\055\040\105\103\061\060\166\060\020 -\006\007\052\206\110\316\075\002\001\006\005\053\201\004\000\042 -\003\142\000\004\204\023\311\320\272\155\101\173\342\154\320\353 -\125\137\146\002\032\044\364\133\211\151\107\343\270\302\175\361 -\362\002\305\237\240\366\133\325\213\006\031\206\117\123\020\155 -\007\044\047\241\240\370\325\107\031\141\114\175\312\223\047\352 -\164\014\357\157\226\011\376\143\354\160\135\066\255\147\167\256 -\311\235\174\125\104\072\242\143\121\037\365\343\142\324\251\107 -\007\076\314\040\243\102\060\100\060\016\006\003\125\035\017\001 -\001\377\004\004\003\002\001\006\060\017\006\003\125\035\023\001 -\001\377\004\005\060\003\001\001\377\060\035\006\003\125\035\016 -\004\026\004\024\267\143\347\032\335\215\351\010\246\125\203\244 -\340\152\120\101\145\021\102\111\060\012\006\010\052\206\110\316 -\075\004\003\003\003\147\000\060\144\002\060\141\171\330\345\102 -\107\337\034\256\123\231\027\266\157\034\175\341\277\021\224\321 -\003\210\165\344\215\211\244\212\167\106\336\155\141\357\002\365 -\373\265\337\314\376\116\377\376\251\346\247\002\060\133\231\327 -\205\067\006\265\173\010\375\353\047\213\112\224\371\341\372\247 -\216\046\010\350\174\222\150\155\163\330\157\046\254\041\002\270 -\231\267\046\101\133\045\140\256\320\110\032\356\006 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -# For Server Distrust After: Sat Nov 30 23:59:59 2024 -CKA_NSS_SERVER_DISTRUST_AFTER MULTILINE_OCTAL -\062\064\061\061\063\060\062\063\065\071\065\071\132 -END -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Entrust Root Certification Authority - EC1" -# Issuer: CN=Entrust Root Certification Authority - EC1,OU="(c) 2012 Entrust, Inc. - for authorized use only",OU=See www.entrust.net/legal-terms,O="Entrust, Inc.",C=US -# Serial Number:00:a6:8b:79:29:00:00:00:00:50:d0:91:f9 -# Subject: CN=Entrust Root Certification Authority - EC1,OU="(c) 2012 Entrust, Inc. - for authorized use only",OU=See www.entrust.net/legal-terms,O="Entrust, Inc.",C=US -# Not Valid Before: Tue Dec 18 15:25:36 2012 -# Not Valid After : Fri Dec 18 15:55:36 2037 -# Fingerprint (SHA-256): 02:ED:0E:B2:8C:14:DA:45:16:5C:56:67:91:70:0D:64:51:D7:FB:56:F0:B2:AB:1D:3B:8E:B0:70:E5:6E:DF:F5 -# Fingerprint (SHA1): 20:D8:06:40:DF:9B:25:F5:12:25:3A:11:EA:F7:59:8A:EB:14:B5:47 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Entrust Root Certification Authority - EC1" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\040\330\006\100\337\233\045\365\022\045\072\021\352\367\131\212 -\353\024\265\107 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\266\176\035\360\130\305\111\154\044\073\075\355\230\030\355\274 -END -CKA_ISSUER MULTILINE_OCTAL -\060\201\277\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\026\060\024\006\003\125\004\012\023\015\105\156\164\162\165 -\163\164\054\040\111\156\143\056\061\050\060\046\006\003\125\004 -\013\023\037\123\145\145\040\167\167\167\056\145\156\164\162\165 -\163\164\056\156\145\164\057\154\145\147\141\154\055\164\145\162 -\155\163\061\071\060\067\006\003\125\004\013\023\060\050\143\051 -\040\062\060\061\062\040\105\156\164\162\165\163\164\054\040\111 -\156\143\056\040\055\040\146\157\162\040\141\165\164\150\157\162 -\151\172\145\144\040\165\163\145\040\157\156\154\171\061\063\060 -\061\006\003\125\004\003\023\052\105\156\164\162\165\163\164\040 -\122\157\157\164\040\103\145\162\164\151\146\151\143\141\164\151 -\157\156\040\101\165\164\150\157\162\151\164\171\040\055\040\105 -\103\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\015\000\246\213\171\051\000\000\000\000\120\320\221\371 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "CFCA EV ROOT" -# -# Issuer: CN=CFCA EV ROOT,O=China Financial Certification Authority,C=CN -# Serial Number: 407555286 (0x184accd6) -# Subject: CN=CFCA EV ROOT,O=China Financial Certification Authority,C=CN -# Not Valid Before: Wed Aug 08 03:07:01 2012 -# Not Valid After : Mon Dec 31 03:07:01 2029 -# Fingerprint (SHA-256): 5C:C3:D7:8E:4E:1D:5E:45:54:7A:04:E6:87:3E:64:F9:0C:F9:53:6D:1C:CC:2E:F8:00:F3:55:C4:C5:FD:70:FD -# Fingerprint (SHA1): E2:B8:29:4B:55:84:AB:6B:58:C2:90:46:6C:AC:3F:B8:39:8F:84:83 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "CFCA EV ROOT" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\126\061\013\060\011\006\003\125\004\006\023\002\103\116\061 -\060\060\056\006\003\125\004\012\014\047\103\150\151\156\141\040 -\106\151\156\141\156\143\151\141\154\040\103\145\162\164\151\146 -\151\143\141\164\151\157\156\040\101\165\164\150\157\162\151\164 -\171\061\025\060\023\006\003\125\004\003\014\014\103\106\103\101 -\040\105\126\040\122\117\117\124 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\126\061\013\060\011\006\003\125\004\006\023\002\103\116\061 -\060\060\056\006\003\125\004\012\014\047\103\150\151\156\141\040 -\106\151\156\141\156\143\151\141\154\040\103\145\162\164\151\146 -\151\143\141\164\151\157\156\040\101\165\164\150\157\162\151\164 -\171\061\025\060\023\006\003\125\004\003\014\014\103\106\103\101 -\040\105\126\040\122\117\117\124 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\004\030\112\314\326 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\215\060\202\003\165\240\003\002\001\002\002\004\030 -\112\314\326\060\015\006\011\052\206\110\206\367\015\001\001\013 -\005\000\060\126\061\013\060\011\006\003\125\004\006\023\002\103 -\116\061\060\060\056\006\003\125\004\012\014\047\103\150\151\156 -\141\040\106\151\156\141\156\143\151\141\154\040\103\145\162\164 -\151\146\151\143\141\164\151\157\156\040\101\165\164\150\157\162 -\151\164\171\061\025\060\023\006\003\125\004\003\014\014\103\106 -\103\101\040\105\126\040\122\117\117\124\060\036\027\015\061\062 -\060\070\060\070\060\063\060\067\060\061\132\027\015\062\071\061 -\062\063\061\060\063\060\067\060\061\132\060\126\061\013\060\011 -\006\003\125\004\006\023\002\103\116\061\060\060\056\006\003\125 -\004\012\014\047\103\150\151\156\141\040\106\151\156\141\156\143 -\151\141\154\040\103\145\162\164\151\146\151\143\141\164\151\157 -\156\040\101\165\164\150\157\162\151\164\171\061\025\060\023\006 -\003\125\004\003\014\014\103\106\103\101\040\105\126\040\122\117 -\117\124\060\202\002\042\060\015\006\011\052\206\110\206\367\015 -\001\001\001\005\000\003\202\002\017\000\060\202\002\012\002\202 -\002\001\000\327\135\153\315\020\077\037\005\131\325\005\115\067 -\261\016\354\230\053\216\025\035\372\223\113\027\202\041\161\020 -\122\327\121\144\160\026\302\125\151\115\216\025\155\237\277\014 -\033\302\340\243\147\326\014\254\317\042\256\257\167\124\052\113 -\114\212\123\122\172\303\356\056\336\263\161\045\301\351\135\075 -\356\241\057\243\367\052\074\311\043\035\152\253\035\241\247\361 -\363\354\240\325\104\317\025\317\162\057\035\143\227\350\231\371 -\375\223\244\124\200\114\122\324\122\253\056\111\337\220\315\270 -\137\276\077\336\241\312\115\040\324\045\350\204\051\123\267\261 -\210\037\377\372\332\220\237\012\251\055\101\077\261\361\030\051 -\356\026\131\054\064\111\032\250\006\327\250\210\322\003\162\172 -\062\342\352\150\115\156\054\226\145\173\312\131\372\362\342\335 -\356\060\054\373\314\106\254\304\143\353\157\177\066\053\064\163 -\022\224\177\337\314\046\236\361\162\135\120\145\131\217\151\263 -\207\136\062\157\303\030\212\265\225\217\260\172\067\336\132\105 -\073\307\066\341\357\147\321\071\323\227\133\163\142\031\110\055 -\207\034\006\373\164\230\040\111\163\360\005\322\033\261\240\243 -\267\033\160\323\210\151\271\132\326\070\364\142\334\045\213\170 -\277\370\350\176\270\134\311\225\117\137\247\055\271\040\153\317 -\153\335\365\015\364\202\267\364\262\146\056\020\050\366\227\132 -\173\226\026\217\001\031\055\154\156\177\071\130\006\144\203\001 -\203\203\303\115\222\335\062\306\207\244\067\351\026\316\252\055 -\150\257\012\201\145\072\160\301\233\255\115\155\124\312\052\055 -\113\205\033\263\200\346\160\105\015\153\136\065\360\177\073\270 -\234\344\004\160\211\022\045\223\332\012\231\042\140\152\143\140 -\116\166\006\230\116\275\203\255\035\130\212\045\205\322\307\145 -\036\055\216\306\337\266\306\341\177\212\004\041\025\051\164\360 -\076\234\220\235\014\056\361\212\076\132\252\014\011\036\307\325 -\074\243\355\227\303\036\064\372\070\371\010\016\343\300\135\053 -\203\321\126\152\311\266\250\124\123\056\170\062\147\075\202\177 -\164\320\373\341\266\005\140\271\160\333\216\013\371\023\130\157 -\161\140\020\122\020\271\301\101\011\357\162\037\147\061\170\377 -\226\005\215\002\003\001\000\001\243\143\060\141\060\037\006\003 -\125\035\043\004\030\060\026\200\024\343\376\055\375\050\320\013 -\265\272\266\242\304\277\006\252\005\214\223\373\057\060\017\006 -\003\125\035\023\001\001\377\004\005\060\003\001\001\377\060\016 -\006\003\125\035\017\001\001\377\004\004\003\002\001\006\060\035 -\006\003\125\035\016\004\026\004\024\343\376\055\375\050\320\013 -\265\272\266\242\304\277\006\252\005\214\223\373\057\060\015\006 -\011\052\206\110\206\367\015\001\001\013\005\000\003\202\002\001 -\000\045\306\272\153\353\207\313\336\202\071\226\075\360\104\247 -\153\204\163\003\336\235\053\117\272\040\177\274\170\262\317\227 -\260\033\234\363\327\171\056\365\110\266\322\373\027\210\346\323 -\172\077\355\123\023\320\342\057\152\171\313\000\043\050\346\036 -\067\127\065\211\204\302\166\117\064\066\255\147\303\316\101\006 -\210\305\367\356\330\032\270\326\013\177\120\377\223\252\027\113 -\214\354\355\122\140\262\244\006\352\116\353\364\153\031\375\353 -\365\032\340\045\052\232\334\307\101\066\367\310\164\005\204\071 -\225\071\326\013\073\244\047\372\010\330\134\036\370\004\140\122 -\021\050\050\003\377\357\123\146\000\245\112\064\026\146\174\375 -\011\244\256\236\147\032\157\101\013\153\006\023\233\217\206\161 -\005\264\057\215\211\146\063\051\166\124\232\021\370\047\372\262 -\077\221\340\316\015\033\363\060\032\255\277\042\135\033\323\277 -\045\005\115\341\222\032\177\231\237\074\104\223\312\324\100\111 -\154\200\207\327\004\072\303\062\122\065\016\126\370\245\335\175 -\304\213\015\021\037\123\313\036\262\027\266\150\167\132\340\324 -\313\310\007\256\365\072\056\216\067\267\320\001\113\103\051\167 -\214\071\227\217\202\132\370\121\345\211\240\030\347\150\177\135 -\012\056\373\243\107\016\075\246\043\172\306\001\307\217\310\136 -\277\155\200\126\276\212\044\272\063\352\237\341\062\021\236\361 -\322\117\200\366\033\100\257\070\236\021\120\171\163\022\022\315 -\346\154\235\054\210\162\074\060\201\006\221\042\352\131\255\332 -\031\056\042\302\215\271\214\207\340\146\274\163\043\137\041\144 -\143\200\110\365\240\074\030\075\224\310\110\101\035\100\272\136 -\376\376\126\071\241\310\317\136\236\031\144\106\020\332\027\221 -\267\005\200\254\213\231\222\175\347\242\330\007\013\066\047\347 -\110\171\140\212\303\327\023\134\370\162\100\337\112\313\317\231 -\000\012\000\013\021\225\332\126\105\003\210\012\237\147\320\325 -\171\261\250\215\100\155\015\302\172\100\372\363\137\144\107\222 -\313\123\271\273\131\316\117\375\320\025\123\001\330\337\353\331 -\346\166\357\320\043\273\073\251\171\263\325\002\051\315\211\243 -\226\017\112\065\347\116\102\300\165\315\007\317\346\054\353\173 -\056 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "CFCA EV ROOT" -# Issuer: CN=CFCA EV ROOT,O=China Financial Certification Authority,C=CN -# Serial Number: 407555286 (0x184accd6) -# Subject: CN=CFCA EV ROOT,O=China Financial Certification Authority,C=CN -# Not Valid Before: Wed Aug 08 03:07:01 2012 -# Not Valid After : Mon Dec 31 03:07:01 2029 -# Fingerprint (SHA-256): 5C:C3:D7:8E:4E:1D:5E:45:54:7A:04:E6:87:3E:64:F9:0C:F9:53:6D:1C:CC:2E:F8:00:F3:55:C4:C5:FD:70:FD -# Fingerprint (SHA1): E2:B8:29:4B:55:84:AB:6B:58:C2:90:46:6C:AC:3F:B8:39:8F:84:83 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "CFCA EV ROOT" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\342\270\051\113\125\204\253\153\130\302\220\106\154\254\077\270 -\071\217\204\203 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\164\341\266\355\046\172\172\104\060\063\224\253\173\047\201\060 -END -CKA_ISSUER MULTILINE_OCTAL -\060\126\061\013\060\011\006\003\125\004\006\023\002\103\116\061 -\060\060\056\006\003\125\004\012\014\047\103\150\151\156\141\040 -\106\151\156\141\156\143\151\141\154\040\103\145\162\164\151\146 -\151\143\141\164\151\157\156\040\101\165\164\150\157\162\151\164 -\171\061\025\060\023\006\003\125\004\003\014\014\103\106\103\101 -\040\105\126\040\122\117\117\124 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\004\030\112\314\326 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "OISTE WISeKey Global Root GB CA" -# -# Issuer: CN=OISTE WISeKey Global Root GB CA,OU=OISTE Foundation Endorsed,O=WISeKey,C=CH -# Serial Number:76:b1:20:52:74:f0:85:87:46:b3:f8:23:1a:f6:c2:c0 -# Subject: CN=OISTE WISeKey Global Root GB CA,OU=OISTE Foundation Endorsed,O=WISeKey,C=CH -# Not Valid Before: Mon Dec 01 15:00:32 2014 -# Not Valid After : Thu Dec 01 15:10:31 2039 -# Fingerprint (SHA-256): 6B:9C:08:E8:6E:B0:F7:67:CF:AD:65:CD:98:B6:21:49:E5:49:4A:67:F5:84:5E:7B:D1:ED:01:9F:27:B8:6B:D6 -# Fingerprint (SHA1): 0F:F9:40:76:18:D3:D7:6A:4B:98:F0:A8:35:9E:0C:FD:27:AC:CC:ED -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "OISTE WISeKey Global Root GB CA" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\155\061\013\060\011\006\003\125\004\006\023\002\103\110\061 -\020\060\016\006\003\125\004\012\023\007\127\111\123\145\113\145 -\171\061\042\060\040\006\003\125\004\013\023\031\117\111\123\124 -\105\040\106\157\165\156\144\141\164\151\157\156\040\105\156\144 -\157\162\163\145\144\061\050\060\046\006\003\125\004\003\023\037 -\117\111\123\124\105\040\127\111\123\145\113\145\171\040\107\154 -\157\142\141\154\040\122\157\157\164\040\107\102\040\103\101 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\155\061\013\060\011\006\003\125\004\006\023\002\103\110\061 -\020\060\016\006\003\125\004\012\023\007\127\111\123\145\113\145 -\171\061\042\060\040\006\003\125\004\013\023\031\117\111\123\124 -\105\040\106\157\165\156\144\141\164\151\157\156\040\105\156\144 -\157\162\163\145\144\061\050\060\046\006\003\125\004\003\023\037 -\117\111\123\124\105\040\127\111\123\145\113\145\171\040\107\154 -\157\142\141\154\040\122\157\157\164\040\107\102\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\166\261\040\122\164\360\205\207\106\263\370\043\032\366 -\302\300 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\003\265\060\202\002\235\240\003\002\001\002\002\020\166 -\261\040\122\164\360\205\207\106\263\370\043\032\366\302\300\060 -\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060\155 -\061\013\060\011\006\003\125\004\006\023\002\103\110\061\020\060 -\016\006\003\125\004\012\023\007\127\111\123\145\113\145\171\061 -\042\060\040\006\003\125\004\013\023\031\117\111\123\124\105\040 -\106\157\165\156\144\141\164\151\157\156\040\105\156\144\157\162 -\163\145\144\061\050\060\046\006\003\125\004\003\023\037\117\111 -\123\124\105\040\127\111\123\145\113\145\171\040\107\154\157\142 -\141\154\040\122\157\157\164\040\107\102\040\103\101\060\036\027 -\015\061\064\061\062\060\061\061\065\060\060\063\062\132\027\015 -\063\071\061\062\060\061\061\065\061\060\063\061\132\060\155\061 -\013\060\011\006\003\125\004\006\023\002\103\110\061\020\060\016 -\006\003\125\004\012\023\007\127\111\123\145\113\145\171\061\042 -\060\040\006\003\125\004\013\023\031\117\111\123\124\105\040\106 -\157\165\156\144\141\164\151\157\156\040\105\156\144\157\162\163 -\145\144\061\050\060\046\006\003\125\004\003\023\037\117\111\123 -\124\105\040\127\111\123\145\113\145\171\040\107\154\157\142\141 -\154\040\122\157\157\164\040\107\102\040\103\101\060\202\001\042 -\060\015\006\011\052\206\110\206\367\015\001\001\001\005\000\003 -\202\001\017\000\060\202\001\012\002\202\001\001\000\330\027\267 -\034\112\044\052\326\227\261\312\342\036\373\175\070\357\230\365 -\262\071\230\116\047\270\021\135\173\322\045\224\210\202\025\046 -\152\033\061\273\250\133\041\041\053\330\017\116\237\132\361\261 -\132\344\171\326\062\043\053\341\123\314\231\105\134\173\117\255 -\274\277\207\112\013\113\227\132\250\366\110\354\175\173\015\315 -\041\006\337\236\025\375\101\212\110\267\040\364\241\172\033\127 -\324\135\120\377\272\147\330\043\231\037\310\077\343\336\377\157 -\133\167\261\153\156\270\311\144\367\341\312\101\106\016\051\161 -\320\271\043\374\311\201\137\116\367\157\337\277\204\255\163\144 -\273\267\102\216\151\366\324\166\035\176\235\247\270\127\212\121 -\147\162\327\324\250\270\225\124\100\163\003\366\352\364\353\376 -\050\102\167\077\235\043\033\262\266\075\200\024\007\114\056\117 -\367\325\012\026\015\275\146\103\067\176\043\103\171\303\100\206 -\365\114\051\332\216\232\255\015\245\004\207\210\036\205\343\351 -\123\325\233\310\213\003\143\170\353\340\031\112\156\273\057\153 -\063\144\130\223\255\151\277\217\033\357\202\110\307\002\003\001 -\000\001\243\121\060\117\060\013\006\003\125\035\017\004\004\003 -\002\001\206\060\017\006\003\125\035\023\001\001\377\004\005\060 -\003\001\001\377\060\035\006\003\125\035\016\004\026\004\024\065 -\017\310\066\143\136\342\243\354\371\073\146\025\316\121\122\343 -\221\232\075\060\020\006\011\053\006\001\004\001\202\067\025\001 -\004\003\002\001\000\060\015\006\011\052\206\110\206\367\015\001 -\001\013\005\000\003\202\001\001\000\100\114\373\207\262\231\201 -\220\176\235\305\260\260\046\315\210\173\053\062\215\156\270\041 -\161\130\227\175\256\067\024\257\076\347\367\232\342\175\366\161 -\230\231\004\252\103\164\170\243\343\111\141\076\163\214\115\224 -\340\371\161\304\266\026\016\123\170\037\326\242\207\057\002\071 -\201\051\074\257\025\230\041\060\376\050\220\000\214\321\341\313 -\372\136\310\375\370\020\106\073\242\170\102\221\027\164\125\012 -\336\120\147\115\146\321\247\377\375\331\300\265\250\243\212\316 -\146\365\017\103\315\247\053\127\173\143\106\152\252\056\122\330 -\364\355\341\155\255\051\220\170\110\272\341\043\252\243\211\354 -\265\253\226\300\264\113\242\035\227\236\172\362\156\100\161\337 -\150\361\145\115\316\174\005\337\123\145\251\245\360\261\227\004 -\160\025\106\003\230\324\322\277\124\264\240\130\175\122\157\332 -\126\046\142\324\330\333\211\061\157\034\360\042\302\323\142\034 -\065\315\114\151\025\124\032\220\230\336\353\036\137\312\167\307 -\313\216\075\103\151\234\232\130\320\044\073\337\033\100\226\176 -\065\255\201\307\116\161\272\210\023 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "OISTE WISeKey Global Root GB CA" -# Issuer: CN=OISTE WISeKey Global Root GB CA,OU=OISTE Foundation Endorsed,O=WISeKey,C=CH -# Serial Number:76:b1:20:52:74:f0:85:87:46:b3:f8:23:1a:f6:c2:c0 -# Subject: CN=OISTE WISeKey Global Root GB CA,OU=OISTE Foundation Endorsed,O=WISeKey,C=CH -# Not Valid Before: Mon Dec 01 15:00:32 2014 -# Not Valid After : Thu Dec 01 15:10:31 2039 -# Fingerprint (SHA-256): 6B:9C:08:E8:6E:B0:F7:67:CF:AD:65:CD:98:B6:21:49:E5:49:4A:67:F5:84:5E:7B:D1:ED:01:9F:27:B8:6B:D6 -# Fingerprint (SHA1): 0F:F9:40:76:18:D3:D7:6A:4B:98:F0:A8:35:9E:0C:FD:27:AC:CC:ED -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "OISTE WISeKey Global Root GB CA" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\017\371\100\166\030\323\327\152\113\230\360\250\065\236\014\375 -\047\254\314\355 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\244\353\271\141\050\056\267\057\230\260\065\046\220\231\121\035 -END -CKA_ISSUER MULTILINE_OCTAL -\060\155\061\013\060\011\006\003\125\004\006\023\002\103\110\061 -\020\060\016\006\003\125\004\012\023\007\127\111\123\145\113\145 -\171\061\042\060\040\006\003\125\004\013\023\031\117\111\123\124 -\105\040\106\157\165\156\144\141\164\151\157\156\040\105\156\144 -\157\162\163\145\144\061\050\060\046\006\003\125\004\003\023\037 -\117\111\123\124\105\040\127\111\123\145\113\145\171\040\107\154 -\157\142\141\154\040\122\157\157\164\040\107\102\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\166\261\040\122\164\360\205\207\106\263\370\043\032\366 -\302\300 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "SZAFIR ROOT CA2" -# -# Issuer: CN=SZAFIR ROOT CA2,O=Krajowa Izba Rozliczeniowa S.A.,C=PL -# Serial Number:3e:8a:5d:07:ec:55:d2:32:d5:b7:e3:b6:5f:01:eb:2d:dc:e4:d6:e4 -# Subject: CN=SZAFIR ROOT CA2,O=Krajowa Izba Rozliczeniowa S.A.,C=PL -# Not Valid Before: Mon Oct 19 07:43:30 2015 -# Not Valid After : Fri Oct 19 07:43:30 2035 -# Fingerprint (SHA-256): A1:33:9D:33:28:1A:0B:56:E5:57:D3:D3:2B:1C:E7:F9:36:7E:B0:94:BD:5F:A7:2A:7E:50:04:C8:DE:D7:CA:FE -# Fingerprint (SHA1): E2:52:FA:95:3F:ED:DB:24:60:BD:6E:28:F3:9C:CC:CF:5E:B3:3F:DE -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "SZAFIR ROOT CA2" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\121\061\013\060\011\006\003\125\004\006\023\002\120\114\061 -\050\060\046\006\003\125\004\012\014\037\113\162\141\152\157\167 -\141\040\111\172\142\141\040\122\157\172\154\151\143\172\145\156 -\151\157\167\141\040\123\056\101\056\061\030\060\026\006\003\125 -\004\003\014\017\123\132\101\106\111\122\040\122\117\117\124\040 -\103\101\062 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\121\061\013\060\011\006\003\125\004\006\023\002\120\114\061 -\050\060\046\006\003\125\004\012\014\037\113\162\141\152\157\167 -\141\040\111\172\142\141\040\122\157\172\154\151\143\172\145\156 -\151\157\167\141\040\123\056\101\056\061\030\060\026\006\003\125 -\004\003\014\017\123\132\101\106\111\122\040\122\117\117\124\040 -\103\101\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\076\212\135\007\354\125\322\062\325\267\343\266\137\001 -\353\055\334\344\326\344 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\003\162\060\202\002\132\240\003\002\001\002\002\024\076 -\212\135\007\354\125\322\062\325\267\343\266\137\001\353\055\334 -\344\326\344\060\015\006\011\052\206\110\206\367\015\001\001\013 -\005\000\060\121\061\013\060\011\006\003\125\004\006\023\002\120 -\114\061\050\060\046\006\003\125\004\012\014\037\113\162\141\152 -\157\167\141\040\111\172\142\141\040\122\157\172\154\151\143\172 -\145\156\151\157\167\141\040\123\056\101\056\061\030\060\026\006 -\003\125\004\003\014\017\123\132\101\106\111\122\040\122\117\117 -\124\040\103\101\062\060\036\027\015\061\065\061\060\061\071\060 -\067\064\063\063\060\132\027\015\063\065\061\060\061\071\060\067 -\064\063\063\060\132\060\121\061\013\060\011\006\003\125\004\006 -\023\002\120\114\061\050\060\046\006\003\125\004\012\014\037\113 -\162\141\152\157\167\141\040\111\172\142\141\040\122\157\172\154 -\151\143\172\145\156\151\157\167\141\040\123\056\101\056\061\030 -\060\026\006\003\125\004\003\014\017\123\132\101\106\111\122\040 -\122\117\117\124\040\103\101\062\060\202\001\042\060\015\006\011 -\052\206\110\206\367\015\001\001\001\005\000\003\202\001\017\000 -\060\202\001\012\002\202\001\001\000\267\274\076\120\250\113\315 -\100\265\316\141\347\226\312\264\241\332\014\042\260\372\265\173 -\166\000\167\214\013\317\175\250\206\314\046\121\344\040\075\205 -\014\326\130\343\347\364\052\030\235\332\321\256\046\356\353\123 -\334\364\220\326\023\112\014\220\074\303\364\332\322\216\015\222 -\072\334\261\261\377\070\336\303\272\055\137\200\271\002\275\112 -\235\033\017\264\303\302\301\147\003\335\334\033\234\075\263\260 -\336\000\036\250\064\107\273\232\353\376\013\024\275\066\204\332 -\015\040\277\372\133\313\251\026\040\255\071\140\356\057\165\266 -\347\227\234\371\076\375\176\115\157\115\057\357\210\015\152\372 -\335\361\075\156\040\245\240\022\264\115\160\271\316\327\162\073 -\211\223\247\200\204\034\047\111\162\111\265\377\073\225\236\301 -\314\310\001\354\350\016\212\012\226\347\263\246\207\345\326\371 -\005\053\015\227\100\160\074\272\254\165\132\234\325\115\235\002 -\012\322\113\233\146\113\106\007\027\145\255\237\154\210\000\334 -\042\211\340\341\144\324\147\274\061\171\141\074\273\312\101\315 -\134\152\000\310\074\070\216\130\257\002\003\001\000\001\243\102 -\060\100\060\017\006\003\125\035\023\001\001\377\004\005\060\003 -\001\001\377\060\016\006\003\125\035\017\001\001\377\004\004\003 -\002\001\006\060\035\006\003\125\035\016\004\026\004\024\056\026 -\251\112\030\265\313\314\365\157\120\363\043\137\370\135\347\254 -\360\310\060\015\006\011\052\206\110\206\367\015\001\001\013\005 -\000\003\202\001\001\000\265\163\370\003\334\131\133\035\166\351 -\243\052\173\220\050\262\115\300\063\117\252\232\261\324\270\344 -\047\377\251\226\231\316\106\340\155\174\114\242\070\244\006\160 -\360\364\101\021\354\077\107\215\077\162\207\371\073\375\244\157 -\053\123\000\340\377\071\271\152\007\016\353\035\034\366\242\162 -\220\313\202\075\021\202\213\322\273\237\052\257\041\346\143\206 -\235\171\031\357\367\273\014\065\220\303\212\355\117\017\365\314 -\022\331\244\076\273\240\374\040\225\137\117\046\057\021\043\203 -\116\165\007\017\277\233\321\264\035\351\020\004\376\312\140\217 -\242\114\270\255\317\341\220\017\315\256\012\307\135\173\267\120 -\322\324\141\372\325\025\333\327\237\207\121\124\353\245\343\353 -\311\205\240\045\040\067\373\216\316\014\064\204\341\074\201\262 -\167\116\103\245\210\137\206\147\241\075\346\264\134\141\266\076 -\333\376\267\050\305\242\007\256\265\312\312\215\052\022\357\227 -\355\302\060\244\311\052\172\373\363\115\043\033\231\063\064\240 -\056\365\251\013\077\324\135\341\317\204\237\342\031\302\137\212 -\326\040\036\343\163\267 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "SZAFIR ROOT CA2" -# Issuer: CN=SZAFIR ROOT CA2,O=Krajowa Izba Rozliczeniowa S.A.,C=PL -# Serial Number:3e:8a:5d:07:ec:55:d2:32:d5:b7:e3:b6:5f:01:eb:2d:dc:e4:d6:e4 -# Subject: CN=SZAFIR ROOT CA2,O=Krajowa Izba Rozliczeniowa S.A.,C=PL -# Not Valid Before: Mon Oct 19 07:43:30 2015 -# Not Valid After : Fri Oct 19 07:43:30 2035 -# Fingerprint (SHA-256): A1:33:9D:33:28:1A:0B:56:E5:57:D3:D3:2B:1C:E7:F9:36:7E:B0:94:BD:5F:A7:2A:7E:50:04:C8:DE:D7:CA:FE -# Fingerprint (SHA1): E2:52:FA:95:3F:ED:DB:24:60:BD:6E:28:F3:9C:CC:CF:5E:B3:3F:DE -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "SZAFIR ROOT CA2" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\342\122\372\225\077\355\333\044\140\275\156\050\363\234\314\317 -\136\263\077\336 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\021\144\301\211\260\044\261\214\261\007\176\211\236\121\236\231 -END -CKA_ISSUER MULTILINE_OCTAL -\060\121\061\013\060\011\006\003\125\004\006\023\002\120\114\061 -\050\060\046\006\003\125\004\012\014\037\113\162\141\152\157\167 -\141\040\111\172\142\141\040\122\157\172\154\151\143\172\145\156 -\151\157\167\141\040\123\056\101\056\061\030\060\026\006\003\125 -\004\003\014\017\123\132\101\106\111\122\040\122\117\117\124\040 -\103\101\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\076\212\135\007\354\125\322\062\325\267\343\266\137\001 -\353\055\334\344\326\344 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Certum Trusted Network CA 2" -# -# Issuer: CN=Certum Trusted Network CA 2,OU=Certum Certification Authority,O=Unizeto Technologies S.A.,C=PL -# Serial Number:21:d6:d0:4a:4f:25:0f:c9:32:37:fc:aa:5e:12:8d:e9 -# Subject: CN=Certum Trusted Network CA 2,OU=Certum Certification Authority,O=Unizeto Technologies S.A.,C=PL -# Not Valid Before: Thu Oct 06 08:39:56 2011 -# Not Valid After : Sat Oct 06 08:39:56 2046 -# Fingerprint (SHA-256): B6:76:F2:ED:DA:E8:77:5C:D3:6C:B0:F6:3C:D1:D4:60:39:61:F4:9E:62:65:BA:01:3A:2F:03:07:B6:D0:B8:04 -# Fingerprint (SHA1): D3:DD:48:3E:2B:BF:4C:05:E8:AF:10:F5:FA:76:26:CF:D3:DC:30:92 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Certum Trusted Network CA 2" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\201\200\061\013\060\011\006\003\125\004\006\023\002\120\114 -\061\042\060\040\006\003\125\004\012\023\031\125\156\151\172\145 -\164\157\040\124\145\143\150\156\157\154\157\147\151\145\163\040 -\123\056\101\056\061\047\060\045\006\003\125\004\013\023\036\103 -\145\162\164\165\155\040\103\145\162\164\151\146\151\143\141\164 -\151\157\156\040\101\165\164\150\157\162\151\164\171\061\044\060 -\042\006\003\125\004\003\023\033\103\145\162\164\165\155\040\124 -\162\165\163\164\145\144\040\116\145\164\167\157\162\153\040\103 -\101\040\062 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\201\200\061\013\060\011\006\003\125\004\006\023\002\120\114 -\061\042\060\040\006\003\125\004\012\023\031\125\156\151\172\145 -\164\157\040\124\145\143\150\156\157\154\157\147\151\145\163\040 -\123\056\101\056\061\047\060\045\006\003\125\004\013\023\036\103 -\145\162\164\165\155\040\103\145\162\164\151\146\151\143\141\164 -\151\157\156\040\101\165\164\150\157\162\151\164\171\061\044\060 -\042\006\003\125\004\003\023\033\103\145\162\164\165\155\040\124 -\162\165\163\164\145\144\040\116\145\164\167\157\162\153\040\103 -\101\040\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\041\326\320\112\117\045\017\311\062\067\374\252\136\022 -\215\351 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\322\060\202\003\272\240\003\002\001\002\002\020\041 -\326\320\112\117\045\017\311\062\067\374\252\136\022\215\351\060 -\015\006\011\052\206\110\206\367\015\001\001\015\005\000\060\201 -\200\061\013\060\011\006\003\125\004\006\023\002\120\114\061\042 -\060\040\006\003\125\004\012\023\031\125\156\151\172\145\164\157 -\040\124\145\143\150\156\157\154\157\147\151\145\163\040\123\056 -\101\056\061\047\060\045\006\003\125\004\013\023\036\103\145\162 -\164\165\155\040\103\145\162\164\151\146\151\143\141\164\151\157 -\156\040\101\165\164\150\157\162\151\164\171\061\044\060\042\006 -\003\125\004\003\023\033\103\145\162\164\165\155\040\124\162\165 -\163\164\145\144\040\116\145\164\167\157\162\153\040\103\101\040 -\062\060\042\030\017\062\060\061\061\061\060\060\066\060\070\063 -\071\065\066\132\030\017\062\060\064\066\061\060\060\066\060\070 -\063\071\065\066\132\060\201\200\061\013\060\011\006\003\125\004 -\006\023\002\120\114\061\042\060\040\006\003\125\004\012\023\031 -\125\156\151\172\145\164\157\040\124\145\143\150\156\157\154\157 -\147\151\145\163\040\123\056\101\056\061\047\060\045\006\003\125 -\004\013\023\036\103\145\162\164\165\155\040\103\145\162\164\151 -\146\151\143\141\164\151\157\156\040\101\165\164\150\157\162\151 -\164\171\061\044\060\042\006\003\125\004\003\023\033\103\145\162 -\164\165\155\040\124\162\165\163\164\145\144\040\116\145\164\167 -\157\162\153\040\103\101\040\062\060\202\002\042\060\015\006\011 -\052\206\110\206\367\015\001\001\001\005\000\003\202\002\017\000 -\060\202\002\012\002\202\002\001\000\275\371\170\370\346\325\200 -\014\144\235\206\033\226\144\147\077\042\072\036\165\001\175\357 -\373\134\147\214\311\314\134\153\251\221\346\271\102\345\040\113 -\233\332\233\173\271\231\135\331\233\200\113\327\204\100\053\047 -\323\350\272\060\273\076\011\032\247\111\225\357\053\100\044\302 -\227\307\247\356\233\045\357\250\012\000\227\205\132\252\235\334 -\051\311\342\065\007\353\160\115\112\326\301\263\126\270\241\101 -\070\233\321\373\061\177\217\340\137\341\261\077\017\216\026\111 -\140\327\006\215\030\371\252\046\020\253\052\323\320\321\147\215 -\033\106\276\107\060\325\056\162\321\305\143\332\347\143\171\104 -\176\113\143\044\211\206\056\064\077\051\114\122\213\052\247\300 -\342\221\050\211\271\300\133\371\035\331\347\047\255\377\232\002 -\227\301\306\120\222\233\002\054\275\251\271\064\131\012\277\204 -\112\377\337\376\263\237\353\331\236\340\230\043\354\246\153\167 -\026\052\333\314\255\073\034\244\207\334\106\163\136\031\142\150 -\105\127\344\220\202\102\273\102\326\360\141\340\301\243\075\146 -\243\135\364\030\356\210\311\215\027\105\051\231\062\165\002\061 -\356\051\046\310\153\002\346\265\142\105\177\067\025\132\043\150 -\211\324\076\336\116\047\260\360\100\014\274\115\027\313\115\242 -\263\036\320\006\132\335\366\223\317\127\165\231\365\372\206\032 -\147\170\263\277\226\376\064\334\275\347\122\126\345\263\345\165 -\173\327\101\221\005\334\135\151\343\225\015\103\271\374\203\226 -\071\225\173\154\200\132\117\023\162\306\327\175\051\172\104\272 -\122\244\052\325\101\106\011\040\376\042\240\266\133\060\215\274 -\211\014\325\327\160\370\207\122\375\332\357\254\121\056\007\263 -\116\376\320\011\332\160\357\230\372\126\346\155\333\265\127\113 -\334\345\054\045\025\310\236\056\170\116\370\332\234\236\206\054 -\312\127\363\032\345\310\222\213\032\202\226\172\303\274\120\022 -\151\330\016\132\106\213\072\353\046\372\043\311\266\260\201\276 -\102\000\244\370\326\376\060\056\307\322\106\366\345\216\165\375 -\362\314\271\320\207\133\314\006\020\140\273\203\065\267\136\147 -\336\107\354\231\110\361\244\241\025\376\255\214\142\216\071\125 -\117\071\026\271\261\143\235\377\267\002\003\001\000\001\243\102 -\060\100\060\017\006\003\125\035\023\001\001\377\004\005\060\003 -\001\001\377\060\035\006\003\125\035\016\004\026\004\024\266\241 -\124\071\002\303\240\077\216\212\274\372\324\370\034\246\321\072 -\016\375\060\016\006\003\125\035\017\001\001\377\004\004\003\002 -\001\006\060\015\006\011\052\206\110\206\367\015\001\001\015\005 -\000\003\202\002\001\000\161\245\016\316\344\351\277\077\070\325 -\211\132\304\002\141\373\114\305\024\027\055\213\117\123\153\020 -\027\374\145\204\307\020\111\220\336\333\307\046\223\210\046\157 -\160\326\002\136\071\240\367\217\253\226\265\245\023\134\201\024 -\155\016\201\202\021\033\212\116\306\117\245\335\142\036\104\337 -\011\131\364\133\167\013\067\351\213\040\306\370\012\116\056\130 -\034\353\063\320\317\206\140\311\332\373\200\057\236\114\140\204 -\170\075\041\144\326\373\101\037\030\017\347\311\165\161\275\275 -\134\336\064\207\076\101\260\016\366\271\326\077\011\023\226\024 -\057\336\232\035\132\271\126\316\065\072\260\137\160\115\136\343 -\051\361\043\050\162\131\266\253\302\214\146\046\034\167\054\046 -\166\065\213\050\247\151\240\371\073\365\043\335\205\020\164\311 -\220\003\126\221\347\257\272\107\324\022\227\021\042\343\242\111 -\224\154\347\267\224\113\272\055\244\332\063\213\114\246\104\377 -\132\074\306\035\144\330\265\061\344\246\074\172\250\127\013\333 -\355\141\032\313\361\316\163\167\143\244\207\157\114\121\070\326 -\344\137\307\237\266\201\052\344\205\110\171\130\136\073\370\333 -\002\202\147\301\071\333\303\164\113\075\066\036\371\051\223\210 -\150\133\250\104\031\041\360\247\350\201\015\054\350\223\066\264 -\067\262\312\260\033\046\172\232\045\037\232\232\200\236\113\052 -\077\373\243\232\376\163\062\161\302\236\306\162\341\212\150\047 -\361\344\017\264\304\114\245\141\223\370\227\020\007\052\060\045 -\251\271\310\161\270\357\150\314\055\176\365\340\176\017\202\250 -\157\266\272\154\203\103\167\315\212\222\027\241\236\133\170\026 -\075\105\342\063\162\335\341\146\312\231\323\311\305\046\375\015 -\150\004\106\256\266\331\233\214\276\031\276\261\306\362\031\343 -\134\002\312\054\330\157\112\007\331\311\065\332\100\165\362\304 -\247\031\157\236\102\020\230\165\346\225\213\140\274\355\305\022 -\327\212\316\325\230\134\126\226\003\305\356\167\006\065\377\317 -\344\356\077\023\141\356\333\332\055\205\360\315\256\235\262\030 -\011\105\303\222\241\162\027\374\107\266\240\013\054\361\304\336 -\103\150\010\152\137\073\360\166\143\373\314\006\054\246\306\342 -\016\265\271\276\044\217 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Certum Trusted Network CA 2" -# Issuer: CN=Certum Trusted Network CA 2,OU=Certum Certification Authority,O=Unizeto Technologies S.A.,C=PL -# Serial Number:21:d6:d0:4a:4f:25:0f:c9:32:37:fc:aa:5e:12:8d:e9 -# Subject: CN=Certum Trusted Network CA 2,OU=Certum Certification Authority,O=Unizeto Technologies S.A.,C=PL -# Not Valid Before: Thu Oct 06 08:39:56 2011 -# Not Valid After : Sat Oct 06 08:39:56 2046 -# Fingerprint (SHA-256): B6:76:F2:ED:DA:E8:77:5C:D3:6C:B0:F6:3C:D1:D4:60:39:61:F4:9E:62:65:BA:01:3A:2F:03:07:B6:D0:B8:04 -# Fingerprint (SHA1): D3:DD:48:3E:2B:BF:4C:05:E8:AF:10:F5:FA:76:26:CF:D3:DC:30:92 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Certum Trusted Network CA 2" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\323\335\110\076\053\277\114\005\350\257\020\365\372\166\046\317 -\323\334\060\222 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\155\106\236\331\045\155\010\043\133\136\164\175\036\047\333\362 -END -CKA_ISSUER MULTILINE_OCTAL -\060\201\200\061\013\060\011\006\003\125\004\006\023\002\120\114 -\061\042\060\040\006\003\125\004\012\023\031\125\156\151\172\145 -\164\157\040\124\145\143\150\156\157\154\157\147\151\145\163\040 -\123\056\101\056\061\047\060\045\006\003\125\004\013\023\036\103 -\145\162\164\165\155\040\103\145\162\164\151\146\151\143\141\164 -\151\157\156\040\101\165\164\150\157\162\151\164\171\061\044\060 -\042\006\003\125\004\003\023\033\103\145\162\164\165\155\040\124 -\162\165\163\164\145\144\040\116\145\164\167\157\162\153\040\103 -\101\040\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\041\326\320\112\117\045\017\311\062\067\374\252\136\022 -\215\351 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Hellenic Academic and Research Institutions RootCA 2015" -# -# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2015,O=Hellenic Academic and Research Institutions Cert. Authority,L=Athens,C=GR -# Serial Number: 0 (0x0) -# Subject: CN=Hellenic Academic and Research Institutions RootCA 2015,O=Hellenic Academic and Research Institutions Cert. Authority,L=Athens,C=GR -# Not Valid Before: Tue Jul 07 10:11:21 2015 -# Not Valid After : Sat Jun 30 10:11:21 2040 -# Fingerprint (SHA-256): A0:40:92:9A:02:CE:53:B4:AC:F4:F2:FF:C6:98:1C:E4:49:6F:75:5E:6D:45:FE:0B:2A:69:2B:CD:52:52:3F:36 -# Fingerprint (SHA1): 01:0C:06:95:A6:98:19:14:FF:BF:5F:C6:B0:B6:95:EA:29:E9:12:A6 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Hellenic Academic and Research Institutions RootCA 2015" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\201\246\061\013\060\011\006\003\125\004\006\023\002\107\122 -\061\017\060\015\006\003\125\004\007\023\006\101\164\150\145\156 -\163\061\104\060\102\006\003\125\004\012\023\073\110\145\154\154 -\145\156\151\143\040\101\143\141\144\145\155\151\143\040\141\156 -\144\040\122\145\163\145\141\162\143\150\040\111\156\163\164\151 -\164\165\164\151\157\156\163\040\103\145\162\164\056\040\101\165 -\164\150\157\162\151\164\171\061\100\060\076\006\003\125\004\003 -\023\067\110\145\154\154\145\156\151\143\040\101\143\141\144\145 -\155\151\143\040\141\156\144\040\122\145\163\145\141\162\143\150 -\040\111\156\163\164\151\164\165\164\151\157\156\163\040\122\157 -\157\164\103\101\040\062\060\061\065 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\201\246\061\013\060\011\006\003\125\004\006\023\002\107\122 -\061\017\060\015\006\003\125\004\007\023\006\101\164\150\145\156 -\163\061\104\060\102\006\003\125\004\012\023\073\110\145\154\154 -\145\156\151\143\040\101\143\141\144\145\155\151\143\040\141\156 -\144\040\122\145\163\145\141\162\143\150\040\111\156\163\164\151 -\164\165\164\151\157\156\163\040\103\145\162\164\056\040\101\165 -\164\150\157\162\151\164\171\061\100\060\076\006\003\125\004\003 -\023\067\110\145\154\154\145\156\151\143\040\101\143\141\144\145 -\155\151\143\040\141\156\144\040\122\145\163\145\141\162\143\150 -\040\111\156\163\164\151\164\165\164\151\157\156\163\040\122\157 -\157\164\103\101\040\062\060\061\065 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\000 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\006\013\060\202\003\363\240\003\002\001\002\002\001\000 -\060\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060 -\201\246\061\013\060\011\006\003\125\004\006\023\002\107\122\061 -\017\060\015\006\003\125\004\007\023\006\101\164\150\145\156\163 -\061\104\060\102\006\003\125\004\012\023\073\110\145\154\154\145 -\156\151\143\040\101\143\141\144\145\155\151\143\040\141\156\144 -\040\122\145\163\145\141\162\143\150\040\111\156\163\164\151\164 -\165\164\151\157\156\163\040\103\145\162\164\056\040\101\165\164 -\150\157\162\151\164\171\061\100\060\076\006\003\125\004\003\023 -\067\110\145\154\154\145\156\151\143\040\101\143\141\144\145\155 -\151\143\040\141\156\144\040\122\145\163\145\141\162\143\150\040 -\111\156\163\164\151\164\165\164\151\157\156\163\040\122\157\157 -\164\103\101\040\062\060\061\065\060\036\027\015\061\065\060\067 -\060\067\061\060\061\061\062\061\132\027\015\064\060\060\066\063 -\060\061\060\061\061\062\061\132\060\201\246\061\013\060\011\006 -\003\125\004\006\023\002\107\122\061\017\060\015\006\003\125\004 -\007\023\006\101\164\150\145\156\163\061\104\060\102\006\003\125 -\004\012\023\073\110\145\154\154\145\156\151\143\040\101\143\141 -\144\145\155\151\143\040\141\156\144\040\122\145\163\145\141\162 -\143\150\040\111\156\163\164\151\164\165\164\151\157\156\163\040 -\103\145\162\164\056\040\101\165\164\150\157\162\151\164\171\061 -\100\060\076\006\003\125\004\003\023\067\110\145\154\154\145\156 -\151\143\040\101\143\141\144\145\155\151\143\040\141\156\144\040 -\122\145\163\145\141\162\143\150\040\111\156\163\164\151\164\165 -\164\151\157\156\163\040\122\157\157\164\103\101\040\062\060\061 -\065\060\202\002\042\060\015\006\011\052\206\110\206\367\015\001 -\001\001\005\000\003\202\002\017\000\060\202\002\012\002\202\002 -\001\000\302\370\251\077\033\211\374\074\074\004\135\075\220\066 -\260\221\072\171\074\146\132\357\155\071\001\111\032\264\267\317 -\177\115\043\123\267\220\000\343\023\052\050\246\061\361\221\000 -\343\050\354\256\041\101\316\037\332\375\175\022\133\001\203\017 -\271\260\137\231\341\362\022\203\200\115\006\076\337\254\257\347 -\241\210\153\061\257\360\213\320\030\063\270\333\105\152\064\364 -\002\200\044\050\012\002\025\225\136\166\052\015\231\072\024\133 -\366\313\313\123\274\023\115\001\210\067\224\045\033\102\274\042 -\330\216\243\226\136\072\331\062\333\076\350\360\020\145\355\164 -\341\057\247\174\257\047\064\273\051\175\233\266\317\011\310\345 -\323\012\374\210\145\145\164\012\334\163\034\134\315\100\261\034 -\324\266\204\214\114\120\317\150\216\250\131\256\302\047\116\202 -\242\065\335\024\364\037\377\262\167\325\207\057\252\156\175\044 -\047\347\306\313\046\346\345\376\147\007\143\330\105\015\335\072 -\131\145\071\130\172\222\231\162\075\234\204\136\210\041\270\325 -\364\054\374\331\160\122\117\170\270\275\074\053\213\225\230\365 -\263\321\150\317\040\024\176\114\134\137\347\213\345\365\065\201 -\031\067\327\021\010\267\146\276\323\112\316\203\127\000\072\303 -\201\370\027\313\222\066\135\321\243\330\165\033\341\213\047\352 -\172\110\101\375\105\031\006\255\047\231\116\301\160\107\335\265 -\237\201\123\022\345\261\214\110\135\061\103\027\343\214\306\172 -\143\226\113\051\060\116\204\116\142\031\136\074\316\227\220\245 -\177\001\353\235\340\370\213\211\335\045\230\075\222\266\176\357 -\331\361\121\121\175\055\046\310\151\131\141\340\254\152\270\052 -\066\021\004\172\120\275\062\204\276\057\334\162\325\327\035\026 -\107\344\107\146\040\077\364\226\305\257\216\001\172\245\017\172 -\144\365\015\030\207\331\256\210\325\372\204\301\072\300\151\050 -\055\362\015\150\121\252\343\245\167\306\244\220\016\241\067\213 -\061\043\107\301\011\010\353\156\367\170\233\327\202\374\204\040 -\231\111\031\266\022\106\261\373\105\125\026\251\243\145\254\234 -\007\017\352\153\334\037\056\006\162\354\206\210\022\344\055\333 -\137\005\057\344\360\003\323\046\063\347\200\302\315\102\241\027 -\064\013\002\003\001\000\001\243\102\060\100\060\017\006\003\125 -\035\023\001\001\377\004\005\060\003\001\001\377\060\016\006\003 -\125\035\017\001\001\377\004\004\003\002\001\006\060\035\006\003 -\125\035\016\004\026\004\024\161\025\147\310\310\311\275\165\135 -\162\320\070\030\152\235\363\161\044\124\013\060\015\006\011\052 -\206\110\206\367\015\001\001\013\005\000\003\202\002\001\000\165 -\273\155\124\113\252\020\130\106\064\362\142\327\026\066\135\010 -\136\325\154\310\207\275\264\056\106\362\061\370\174\352\102\265 -\223\026\125\334\241\014\022\240\332\141\176\017\130\130\163\144 -\162\307\350\105\216\334\251\362\046\077\306\171\214\261\123\010 -\063\201\260\126\023\276\346\121\134\330\233\012\117\113\234\126 -\123\002\351\117\366\015\140\352\115\102\125\350\174\033\041\041 -\323\033\072\314\167\362\270\220\361\150\307\371\132\376\372\055 -\364\277\311\365\105\033\316\070\020\052\067\212\171\243\264\343 -\011\154\205\206\223\377\211\226\047\170\201\217\147\343\106\164 -\124\216\331\015\151\342\112\364\115\164\003\377\262\167\355\225 -\147\227\344\261\305\253\277\152\043\350\324\224\342\104\050\142 -\304\113\342\360\330\342\051\153\032\160\176\044\141\223\173\117 -\003\062\045\015\105\044\053\226\264\106\152\277\112\013\367\232 -\217\301\254\032\305\147\363\157\064\322\372\163\143\214\357\026 -\260\250\244\106\052\370\353\022\354\162\264\357\370\053\176\214 -\122\300\213\204\124\371\057\076\343\125\250\334\146\261\331\341 -\137\330\263\214\131\064\131\244\253\117\154\273\037\030\333\165 -\253\330\313\222\315\224\070\141\016\007\006\037\113\106\020\361 -\025\276\215\205\134\073\112\053\201\171\017\264\151\237\111\120 -\227\115\367\016\126\135\300\225\152\302\066\303\033\150\311\365 -\052\334\107\232\276\262\316\305\045\350\372\003\271\332\371\026 -\156\221\204\365\034\050\310\374\046\314\327\034\220\126\247\137 -\157\072\004\274\315\170\211\013\216\017\057\243\252\117\242\033 -\022\075\026\010\100\017\361\106\114\327\252\173\010\301\012\365 -\155\047\336\002\217\312\303\265\053\312\351\353\310\041\123\070 -\245\314\073\330\167\067\060\242\117\331\157\321\362\100\255\101 -\172\027\305\326\112\065\211\267\101\325\174\206\177\125\115\203 -\112\245\163\040\300\072\257\220\361\232\044\216\331\216\161\312 -\173\270\206\332\262\217\231\076\035\023\015\022\021\356\324\253 -\360\351\025\166\002\344\340\337\252\040\036\133\141\205\144\100 -\251\220\227\015\255\123\322\132\035\207\152\000\227\145\142\264 -\276\157\152\247\365\054\102\355\062\255\266\041\236\276\274 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Hellenic Academic and Research Institutions RootCA 2015" -# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2015,O=Hellenic Academic and Research Institutions Cert. Authority,L=Athens,C=GR -# Serial Number: 0 (0x0) -# Subject: CN=Hellenic Academic and Research Institutions RootCA 2015,O=Hellenic Academic and Research Institutions Cert. Authority,L=Athens,C=GR -# Not Valid Before: Tue Jul 07 10:11:21 2015 -# Not Valid After : Sat Jun 30 10:11:21 2040 -# Fingerprint (SHA-256): A0:40:92:9A:02:CE:53:B4:AC:F4:F2:FF:C6:98:1C:E4:49:6F:75:5E:6D:45:FE:0B:2A:69:2B:CD:52:52:3F:36 -# Fingerprint (SHA1): 01:0C:06:95:A6:98:19:14:FF:BF:5F:C6:B0:B6:95:EA:29:E9:12:A6 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Hellenic Academic and Research Institutions RootCA 2015" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\001\014\006\225\246\230\031\024\377\277\137\306\260\266\225\352 -\051\351\022\246 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\312\377\342\333\003\331\313\113\351\017\255\204\375\173\030\316 -END -CKA_ISSUER MULTILINE_OCTAL -\060\201\246\061\013\060\011\006\003\125\004\006\023\002\107\122 -\061\017\060\015\006\003\125\004\007\023\006\101\164\150\145\156 -\163\061\104\060\102\006\003\125\004\012\023\073\110\145\154\154 -\145\156\151\143\040\101\143\141\144\145\155\151\143\040\141\156 -\144\040\122\145\163\145\141\162\143\150\040\111\156\163\164\151 -\164\165\164\151\157\156\163\040\103\145\162\164\056\040\101\165 -\164\150\157\162\151\164\171\061\100\060\076\006\003\125\004\003 -\023\067\110\145\154\154\145\156\151\143\040\101\143\141\144\145 -\155\151\143\040\141\156\144\040\122\145\163\145\141\162\143\150 -\040\111\156\163\164\151\164\165\164\151\157\156\163\040\122\157 -\157\164\103\101\040\062\060\061\065 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\000 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Hellenic Academic and Research Institutions ECC RootCA 2015" -# -# Issuer: CN=Hellenic Academic and Research Institutions ECC RootCA 2015,O=Hellenic Academic and Research Institutions Cert. Authority,L=Athens,C=GR -# Serial Number: 0 (0x0) -# Subject: CN=Hellenic Academic and Research Institutions ECC RootCA 2015,O=Hellenic Academic and Research Institutions Cert. Authority,L=Athens,C=GR -# Not Valid Before: Tue Jul 07 10:37:12 2015 -# Not Valid After : Sat Jun 30 10:37:12 2040 -# Fingerprint (SHA-256): 44:B5:45:AA:8A:25:E6:5A:73:CA:15:DC:27:FC:36:D2:4C:1C:B9:95:3A:06:65:39:B1:15:82:DC:48:7B:48:33 -# Fingerprint (SHA1): 9F:F1:71:8D:92:D5:9A:F3:7D:74:97:B4:BC:6F:84:68:0B:BA:B6:66 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Hellenic Academic and Research Institutions ECC RootCA 2015" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\201\252\061\013\060\011\006\003\125\004\006\023\002\107\122 -\061\017\060\015\006\003\125\004\007\023\006\101\164\150\145\156 -\163\061\104\060\102\006\003\125\004\012\023\073\110\145\154\154 -\145\156\151\143\040\101\143\141\144\145\155\151\143\040\141\156 -\144\040\122\145\163\145\141\162\143\150\040\111\156\163\164\151 -\164\165\164\151\157\156\163\040\103\145\162\164\056\040\101\165 -\164\150\157\162\151\164\171\061\104\060\102\006\003\125\004\003 -\023\073\110\145\154\154\145\156\151\143\040\101\143\141\144\145 -\155\151\143\040\141\156\144\040\122\145\163\145\141\162\143\150 -\040\111\156\163\164\151\164\165\164\151\157\156\163\040\105\103 -\103\040\122\157\157\164\103\101\040\062\060\061\065 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\201\252\061\013\060\011\006\003\125\004\006\023\002\107\122 -\061\017\060\015\006\003\125\004\007\023\006\101\164\150\145\156 -\163\061\104\060\102\006\003\125\004\012\023\073\110\145\154\154 -\145\156\151\143\040\101\143\141\144\145\155\151\143\040\141\156 -\144\040\122\145\163\145\141\162\143\150\040\111\156\163\164\151 -\164\165\164\151\157\156\163\040\103\145\162\164\056\040\101\165 -\164\150\157\162\151\164\171\061\104\060\102\006\003\125\004\003 -\023\073\110\145\154\154\145\156\151\143\040\101\143\141\144\145 -\155\151\143\040\141\156\144\040\122\145\163\145\141\162\143\150 -\040\111\156\163\164\151\164\165\164\151\157\156\163\040\105\103 -\103\040\122\157\157\164\103\101\040\062\060\061\065 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\000 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\303\060\202\002\112\240\003\002\001\002\002\001\000 -\060\012\006\010\052\206\110\316\075\004\003\002\060\201\252\061 -\013\060\011\006\003\125\004\006\023\002\107\122\061\017\060\015 -\006\003\125\004\007\023\006\101\164\150\145\156\163\061\104\060 -\102\006\003\125\004\012\023\073\110\145\154\154\145\156\151\143 -\040\101\143\141\144\145\155\151\143\040\141\156\144\040\122\145 -\163\145\141\162\143\150\040\111\156\163\164\151\164\165\164\151 -\157\156\163\040\103\145\162\164\056\040\101\165\164\150\157\162 -\151\164\171\061\104\060\102\006\003\125\004\003\023\073\110\145 -\154\154\145\156\151\143\040\101\143\141\144\145\155\151\143\040 -\141\156\144\040\122\145\163\145\141\162\143\150\040\111\156\163 -\164\151\164\165\164\151\157\156\163\040\105\103\103\040\122\157 -\157\164\103\101\040\062\060\061\065\060\036\027\015\061\065\060 -\067\060\067\061\060\063\067\061\062\132\027\015\064\060\060\066 -\063\060\061\060\063\067\061\062\132\060\201\252\061\013\060\011 -\006\003\125\004\006\023\002\107\122\061\017\060\015\006\003\125 -\004\007\023\006\101\164\150\145\156\163\061\104\060\102\006\003 -\125\004\012\023\073\110\145\154\154\145\156\151\143\040\101\143 -\141\144\145\155\151\143\040\141\156\144\040\122\145\163\145\141 -\162\143\150\040\111\156\163\164\151\164\165\164\151\157\156\163 -\040\103\145\162\164\056\040\101\165\164\150\157\162\151\164\171 -\061\104\060\102\006\003\125\004\003\023\073\110\145\154\154\145 -\156\151\143\040\101\143\141\144\145\155\151\143\040\141\156\144 -\040\122\145\163\145\141\162\143\150\040\111\156\163\164\151\164 -\165\164\151\157\156\163\040\105\103\103\040\122\157\157\164\103 -\101\040\062\060\061\065\060\166\060\020\006\007\052\206\110\316 -\075\002\001\006\005\053\201\004\000\042\003\142\000\004\222\240 -\101\350\113\202\204\134\342\370\061\021\231\206\144\116\011\045 -\057\235\101\057\012\256\065\117\164\225\262\121\144\153\215\153 -\346\077\160\225\360\005\104\107\246\162\070\120\166\225\002\132 -\216\256\050\236\371\055\116\231\357\054\110\157\114\045\051\350 -\321\161\133\337\035\301\165\067\264\327\372\173\172\102\234\152 -\012\126\132\174\151\013\252\200\011\044\154\176\301\106\243\102 -\060\100\060\017\006\003\125\035\023\001\001\377\004\005\060\003 -\001\001\377\060\016\006\003\125\035\017\001\001\377\004\004\003 -\002\001\006\060\035\006\003\125\035\016\004\026\004\024\264\042 -\013\202\231\044\001\016\234\273\344\016\375\277\373\227\040\223 -\231\052\060\012\006\010\052\206\110\316\075\004\003\002\003\147 -\000\060\144\002\060\147\316\026\142\070\242\254\142\105\247\251 -\225\044\300\032\047\234\062\073\300\300\325\272\251\347\370\004 -\103\123\205\356\122\041\336\235\365\045\203\076\236\130\113\057 -\327\147\023\016\041\002\060\005\341\165\001\336\150\355\052\037 -\115\114\011\010\015\354\113\255\144\027\050\347\165\316\105\145 -\162\041\027\313\042\101\016\214\023\230\070\232\124\155\233\312 -\342\174\352\002\130\042\221 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Hellenic Academic and Research Institutions ECC RootCA 2015" -# Issuer: CN=Hellenic Academic and Research Institutions ECC RootCA 2015,O=Hellenic Academic and Research Institutions Cert. Authority,L=Athens,C=GR -# Serial Number: 0 (0x0) -# Subject: CN=Hellenic Academic and Research Institutions ECC RootCA 2015,O=Hellenic Academic and Research Institutions Cert. Authority,L=Athens,C=GR -# Not Valid Before: Tue Jul 07 10:37:12 2015 -# Not Valid After : Sat Jun 30 10:37:12 2040 -# Fingerprint (SHA-256): 44:B5:45:AA:8A:25:E6:5A:73:CA:15:DC:27:FC:36:D2:4C:1C:B9:95:3A:06:65:39:B1:15:82:DC:48:7B:48:33 -# Fingerprint (SHA1): 9F:F1:71:8D:92:D5:9A:F3:7D:74:97:B4:BC:6F:84:68:0B:BA:B6:66 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Hellenic Academic and Research Institutions ECC RootCA 2015" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\237\361\161\215\222\325\232\363\175\164\227\264\274\157\204\150 -\013\272\266\146 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\201\345\264\027\353\302\365\341\113\015\101\173\111\222\376\357 -END -CKA_ISSUER MULTILINE_OCTAL -\060\201\252\061\013\060\011\006\003\125\004\006\023\002\107\122 -\061\017\060\015\006\003\125\004\007\023\006\101\164\150\145\156 -\163\061\104\060\102\006\003\125\004\012\023\073\110\145\154\154 -\145\156\151\143\040\101\143\141\144\145\155\151\143\040\141\156 -\144\040\122\145\163\145\141\162\143\150\040\111\156\163\164\151 -\164\165\164\151\157\156\163\040\103\145\162\164\056\040\101\165 -\164\150\157\162\151\164\171\061\104\060\102\006\003\125\004\003 -\023\073\110\145\154\154\145\156\151\143\040\101\143\141\144\145 -\155\151\143\040\141\156\144\040\122\145\163\145\141\162\143\150 -\040\111\156\163\164\151\164\165\164\151\157\156\163\040\105\103 -\103\040\122\157\157\164\103\101\040\062\060\061\065 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\000 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "ISRG Root X1" -# -# Issuer: CN=ISRG Root X1,O=Internet Security Research Group,C=US -# Serial Number:00:82:10:cf:b0:d2:40:e3:59:44:63:e0:bb:63:82:8b:00 -# Subject: CN=ISRG Root X1,O=Internet Security Research Group,C=US -# Not Valid Before: Thu Jun 04 11:04:38 2015 -# Not Valid After : Mon Jun 04 11:04:38 2035 -# Fingerprint (SHA-256): 96:BC:EC:06:26:49:76:F3:74:60:77:9A:CF:28:C5:A7:CF:E8:A3:C0:AA:E1:1A:8F:FC:EE:05:C0:BD:DF:08:C6 -# Fingerprint (SHA1): CA:BD:2A:79:A1:07:6A:31:F2:1D:25:36:35:CB:03:9D:43:29:A5:E8 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "ISRG Root X1" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\117\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\051\060\047\006\003\125\004\012\023\040\111\156\164\145\162\156 -\145\164\040\123\145\143\165\162\151\164\171\040\122\145\163\145 -\141\162\143\150\040\107\162\157\165\160\061\025\060\023\006\003 -\125\004\003\023\014\111\123\122\107\040\122\157\157\164\040\130 -\061 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\117\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\051\060\047\006\003\125\004\012\023\040\111\156\164\145\162\156 -\145\164\040\123\145\143\165\162\151\164\171\040\122\145\163\145 -\141\162\143\150\040\107\162\157\165\160\061\025\060\023\006\003 -\125\004\003\023\014\111\123\122\107\040\122\157\157\164\040\130 -\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\021\000\202\020\317\260\322\100\343\131\104\143\340\273\143 -\202\213\000 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\153\060\202\003\123\240\003\002\001\002\002\021\000 -\202\020\317\260\322\100\343\131\104\143\340\273\143\202\213\000 -\060\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060 -\117\061\013\060\011\006\003\125\004\006\023\002\125\123\061\051 -\060\047\006\003\125\004\012\023\040\111\156\164\145\162\156\145 -\164\040\123\145\143\165\162\151\164\171\040\122\145\163\145\141 -\162\143\150\040\107\162\157\165\160\061\025\060\023\006\003\125 -\004\003\023\014\111\123\122\107\040\122\157\157\164\040\130\061 -\060\036\027\015\061\065\060\066\060\064\061\061\060\064\063\070 -\132\027\015\063\065\060\066\060\064\061\061\060\064\063\070\132 -\060\117\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\051\060\047\006\003\125\004\012\023\040\111\156\164\145\162\156 -\145\164\040\123\145\143\165\162\151\164\171\040\122\145\163\145 -\141\162\143\150\040\107\162\157\165\160\061\025\060\023\006\003 -\125\004\003\023\014\111\123\122\107\040\122\157\157\164\040\130 -\061\060\202\002\042\060\015\006\011\052\206\110\206\367\015\001 -\001\001\005\000\003\202\002\017\000\060\202\002\012\002\202\002 -\001\000\255\350\044\163\364\024\067\363\233\236\053\127\050\034 -\207\276\334\267\337\070\220\214\156\074\346\127\240\170\367\165 -\302\242\376\365\152\156\366\000\117\050\333\336\150\206\154\104 -\223\266\261\143\375\024\022\153\277\037\322\352\061\233\041\176 -\321\063\074\272\110\365\335\171\337\263\270\377\022\361\041\232 -\113\301\212\206\161\151\112\146\146\154\217\176\074\160\277\255 -\051\042\006\363\344\300\346\200\256\342\113\217\267\231\176\224 -\003\237\323\107\227\174\231\110\043\123\350\070\256\117\012\157 -\203\056\321\111\127\214\200\164\266\332\057\320\070\215\173\003 -\160\041\033\165\362\060\074\372\217\256\335\332\143\253\353\026 -\117\302\216\021\113\176\317\013\350\377\265\167\056\364\262\173 -\112\340\114\022\045\014\160\215\003\051\240\341\123\044\354\023 -\331\356\031\277\020\263\112\214\077\211\243\141\121\336\254\207 -\007\224\364\143\161\354\056\342\157\133\230\201\341\211\134\064 -\171\154\166\357\073\220\142\171\346\333\244\232\057\046\305\320 -\020\341\016\336\331\020\216\026\373\267\367\250\367\307\345\002 -\007\230\217\066\010\225\347\342\067\226\015\066\165\236\373\016 -\162\261\035\233\274\003\371\111\005\330\201\335\005\264\052\326 -\101\351\254\001\166\225\012\017\330\337\325\275\022\037\065\057 -\050\027\154\322\230\301\250\011\144\167\156\107\067\272\316\254 -\131\136\150\235\177\162\326\211\305\006\101\051\076\131\076\335 -\046\365\044\311\021\247\132\243\114\100\037\106\241\231\265\247 -\072\121\156\206\073\236\175\162\247\022\005\170\131\355\076\121 -\170\025\013\003\217\215\320\057\005\262\076\173\112\034\113\163 -\005\022\374\306\352\340\120\023\174\103\223\164\263\312\164\347 -\216\037\001\010\320\060\324\133\161\066\264\007\272\301\060\060 -\134\110\267\202\073\230\246\175\140\212\242\243\051\202\314\272 -\275\203\004\033\242\203\003\101\241\326\005\361\033\302\266\360 -\250\174\206\073\106\250\110\052\210\334\166\232\166\277\037\152 -\245\075\031\217\353\070\363\144\336\310\053\015\012\050\377\367 -\333\342\025\102\324\042\320\047\135\341\171\376\030\347\160\210 -\255\116\346\331\213\072\306\335\047\121\156\377\274\144\365\063 -\103\117\002\003\001\000\001\243\102\060\100\060\016\006\003\125 -\035\017\001\001\377\004\004\003\002\001\006\060\017\006\003\125 -\035\023\001\001\377\004\005\060\003\001\001\377\060\035\006\003 -\125\035\016\004\026\004\024\171\264\131\346\173\266\345\344\001 -\163\200\010\210\310\032\130\366\351\233\156\060\015\006\011\052 -\206\110\206\367\015\001\001\013\005\000\003\202\002\001\000\125 -\037\130\251\274\262\250\120\320\014\261\330\032\151\040\047\051 -\010\254\141\165\134\212\156\370\202\345\151\057\325\366\126\113 -\271\270\163\020\131\323\041\227\176\347\114\161\373\262\322\140 -\255\071\250\013\352\027\041\126\205\361\120\016\131\353\316\340 -\131\351\272\311\025\357\206\235\217\204\200\366\344\351\221\220 -\334\027\233\142\033\105\360\146\225\322\174\157\302\352\073\357 -\037\317\313\326\256\047\361\251\260\310\256\375\175\176\232\372 -\042\004\353\377\331\177\352\221\053\042\261\027\016\217\362\212 -\064\133\130\330\374\001\311\124\271\270\046\314\212\210\063\211 -\114\055\204\074\202\337\356\226\127\005\272\054\273\367\304\267 -\307\116\073\202\276\061\310\042\163\163\222\321\302\200\244\071 -\071\020\063\043\202\114\074\237\206\262\125\230\035\276\051\206 -\214\042\233\236\342\153\073\127\072\202\160\115\334\011\307\211 -\313\012\007\115\154\350\135\216\311\357\316\253\307\273\265\053 -\116\105\326\112\320\046\314\345\162\312\010\152\245\225\343\025 -\241\367\244\355\311\054\137\245\373\377\254\050\002\056\276\327 -\173\273\343\161\173\220\026\323\007\136\106\123\174\067\007\102 -\214\323\304\226\234\325\231\265\052\340\225\032\200\110\256\114 -\071\007\316\314\107\244\122\225\053\272\270\373\255\322\063\123 -\175\345\035\115\155\325\241\261\307\102\157\346\100\047\065\134 -\243\050\267\007\215\347\215\063\220\347\043\237\373\120\234\171 -\154\106\325\264\025\263\226\156\176\233\014\226\072\270\122\055 -\077\326\133\341\373\010\302\204\376\044\250\243\211\332\254\152 -\341\030\052\261\250\103\141\133\323\037\334\073\215\166\362\055 -\350\215\165\337\027\063\154\075\123\373\173\313\101\137\377\334 -\242\320\141\070\341\226\270\254\135\213\067\327\165\325\063\300 -\231\021\256\235\101\301\162\165\204\276\002\101\102\137\147\044 -\110\224\321\233\047\276\007\077\271\270\117\201\164\121\341\172 -\267\355\235\043\342\276\340\325\050\004\023\074\061\003\236\335 -\172\154\217\306\007\030\306\177\336\107\216\077\050\236\004\006 -\317\245\124\064\167\275\354\211\233\351\027\103\337\133\333\137 -\376\216\036\127\242\315\100\235\176\142\042\332\336\030\047 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "ISRG Root X1" -# Issuer: CN=ISRG Root X1,O=Internet Security Research Group,C=US -# Serial Number:00:82:10:cf:b0:d2:40:e3:59:44:63:e0:bb:63:82:8b:00 -# Subject: CN=ISRG Root X1,O=Internet Security Research Group,C=US -# Not Valid Before: Thu Jun 04 11:04:38 2015 -# Not Valid After : Mon Jun 04 11:04:38 2035 -# Fingerprint (SHA-256): 96:BC:EC:06:26:49:76:F3:74:60:77:9A:CF:28:C5:A7:CF:E8:A3:C0:AA:E1:1A:8F:FC:EE:05:C0:BD:DF:08:C6 -# Fingerprint (SHA1): CA:BD:2A:79:A1:07:6A:31:F2:1D:25:36:35:CB:03:9D:43:29:A5:E8 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "ISRG Root X1" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\312\275\052\171\241\007\152\061\362\035\045\066\065\313\003\235 -\103\051\245\350 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\014\322\371\340\332\027\163\351\355\206\115\245\343\160\347\116 -END -CKA_ISSUER MULTILINE_OCTAL -\060\117\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\051\060\047\006\003\125\004\012\023\040\111\156\164\145\162\156 -\145\164\040\123\145\143\165\162\151\164\171\040\122\145\163\145 -\141\162\143\150\040\107\162\157\165\160\061\025\060\023\006\003 -\125\004\003\023\014\111\123\122\107\040\122\157\157\164\040\130 -\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\021\000\202\020\317\260\322\100\343\131\104\143\340\273\143 -\202\213\000 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "AC RAIZ FNMT-RCM" -# -# Issuer: OU=AC RAIZ FNMT-RCM,O=FNMT-RCM,C=ES -# Serial Number:5d:93:8d:30:67:36:c8:06:1d:1a:c7:54:84:69:07 -# Subject: OU=AC RAIZ FNMT-RCM,O=FNMT-RCM,C=ES -# Not Valid Before: Wed Oct 29 15:59:56 2008 -# Not Valid After : Tue Jan 01 00:00:00 2030 -# Fingerprint (SHA-256): EB:C5:57:0C:29:01:8C:4D:67:B1:AA:12:7B:AF:12:F7:03:B4:61:1E:BC:17:B7:DA:B5:57:38:94:17:9B:93:FA -# Fingerprint (SHA1): EC:50:35:07:B2:15:C4:95:62:19:E2:A8:9A:5B:42:99:2C:4C:2C:20 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "AC RAIZ FNMT-RCM" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\073\061\013\060\011\006\003\125\004\006\023\002\105\123\061 -\021\060\017\006\003\125\004\012\014\010\106\116\115\124\055\122 -\103\115\061\031\060\027\006\003\125\004\013\014\020\101\103\040 -\122\101\111\132\040\106\116\115\124\055\122\103\115 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\073\061\013\060\011\006\003\125\004\006\023\002\105\123\061 -\021\060\017\006\003\125\004\012\014\010\106\116\115\124\055\122 -\103\115\061\031\060\027\006\003\125\004\013\014\020\101\103\040 -\122\101\111\132\040\106\116\115\124\055\122\103\115 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\017\135\223\215\060\147\066\310\006\035\032\307\124\204\151 -\007 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\203\060\202\003\153\240\003\002\001\002\002\017\135 -\223\215\060\147\066\310\006\035\032\307\124\204\151\007\060\015 -\006\011\052\206\110\206\367\015\001\001\013\005\000\060\073\061 -\013\060\011\006\003\125\004\006\023\002\105\123\061\021\060\017 -\006\003\125\004\012\014\010\106\116\115\124\055\122\103\115\061 -\031\060\027\006\003\125\004\013\014\020\101\103\040\122\101\111 -\132\040\106\116\115\124\055\122\103\115\060\036\027\015\060\070 -\061\060\062\071\061\065\065\071\065\066\132\027\015\063\060\060 -\061\060\061\060\060\060\060\060\060\132\060\073\061\013\060\011 -\006\003\125\004\006\023\002\105\123\061\021\060\017\006\003\125 -\004\012\014\010\106\116\115\124\055\122\103\115\061\031\060\027 -\006\003\125\004\013\014\020\101\103\040\122\101\111\132\040\106 -\116\115\124\055\122\103\115\060\202\002\042\060\015\006\011\052 -\206\110\206\367\015\001\001\001\005\000\003\202\002\017\000\060 -\202\002\012\002\202\002\001\000\272\161\200\172\114\206\156\177 -\310\023\155\300\306\175\034\000\227\217\054\014\043\273\020\232 -\100\251\032\267\207\210\370\233\126\152\373\346\173\216\213\222 -\216\247\045\135\131\021\333\066\056\267\121\027\037\251\010\037 -\004\027\044\130\252\067\112\030\337\345\071\324\127\375\327\301 -\054\221\001\221\342\042\324\003\300\130\374\167\107\354\217\076 -\164\103\272\254\064\215\115\070\166\147\216\260\310\157\060\063 -\130\161\134\264\365\153\156\324\001\120\270\023\176\154\112\243 -\111\321\040\031\356\274\300\051\030\145\247\336\376\357\335\012 -\220\041\347\032\147\222\102\020\230\137\117\060\274\076\034\105 -\264\020\327\150\100\024\300\100\372\347\167\027\172\346\013\217 -\145\133\074\331\232\122\333\265\275\236\106\317\075\353\221\005 -\002\300\226\262\166\114\115\020\226\073\222\372\234\177\017\231 -\337\276\043\065\105\036\002\134\376\265\250\233\231\045\332\136 -\363\042\303\071\365\344\052\056\323\306\037\304\154\252\305\034 -\152\001\005\112\057\322\305\301\250\064\046\135\146\245\322\002 -\041\371\030\267\006\365\116\231\157\250\253\114\121\350\317\120 -\030\305\167\310\071\011\054\111\222\062\231\250\273\027\027\171 -\260\132\305\346\243\304\131\145\107\065\203\136\251\350\065\013 -\231\273\344\315\040\306\233\112\006\071\265\150\374\042\272\356 -\125\214\053\116\352\363\261\343\374\266\231\232\325\102\372\161 -\115\010\317\207\036\152\161\175\371\323\264\351\245\161\201\173 -\302\116\107\226\245\366\166\205\243\050\217\351\200\156\201\123 -\245\155\137\270\110\371\302\371\066\246\056\111\377\270\226\302 -\214\007\263\233\210\130\374\353\033\034\336\055\160\342\227\222 -\060\241\211\343\274\125\250\047\326\113\355\220\255\213\372\143 -\045\131\055\250\065\335\312\227\063\274\345\315\307\235\321\354 -\357\136\016\112\220\006\046\143\255\271\331\065\055\007\272\166 -\145\054\254\127\217\175\364\007\224\327\201\002\226\135\243\007 -\111\325\172\320\127\371\033\347\123\106\165\252\260\171\102\313 -\150\161\010\351\140\275\071\151\316\364\257\303\126\100\307\255 -\122\242\011\344\157\206\107\212\037\353\050\047\135\203\040\257 -\004\311\154\126\232\213\106\365\002\003\001\000\001\243\201\203 -\060\201\200\060\017\006\003\125\035\023\001\001\377\004\005\060 -\003\001\001\377\060\016\006\003\125\035\017\001\001\377\004\004 -\003\002\001\006\060\035\006\003\125\035\016\004\026\004\024\367 -\175\305\375\304\350\232\033\167\144\247\365\035\240\314\277\207 -\140\232\155\060\076\006\003\125\035\040\004\067\060\065\060\063 -\006\004\125\035\040\000\060\053\060\051\006\010\053\006\001\005 -\005\007\002\001\026\035\150\164\164\160\072\057\057\167\167\167 -\056\143\145\162\164\056\146\156\155\164\056\145\163\057\144\160 -\143\163\057\060\015\006\011\052\206\110\206\367\015\001\001\013 -\005\000\003\202\002\001\000\007\220\112\337\363\043\116\360\303 -\234\121\145\233\234\042\242\212\014\205\363\163\051\153\115\376 -\001\342\251\014\143\001\277\004\147\245\235\230\137\375\001\023 -\372\354\232\142\351\206\376\266\142\322\156\114\224\373\300\165 -\105\174\145\014\370\262\067\317\254\017\317\215\157\371\031\367 -\217\354\036\362\160\236\360\312\270\357\267\377\166\067\166\133 -\366\156\210\363\257\142\062\042\223\015\072\152\216\024\146\014 -\055\123\164\127\145\036\325\262\335\043\201\073\245\146\043\047 -\147\011\217\341\167\252\103\315\145\121\010\355\121\130\376\346 -\071\371\313\107\204\244\025\361\166\273\244\356\244\073\304\137 -\357\262\063\226\021\030\267\311\145\276\030\341\243\244\334\372 -\030\371\323\274\023\233\071\172\064\272\323\101\373\372\062\212 -\052\267\053\206\013\151\203\070\276\315\212\056\013\160\255\215 -\046\222\356\036\365\001\053\012\331\326\227\233\156\340\250\031 -\034\072\041\213\014\036\100\255\003\347\335\146\176\365\271\040 -\015\003\350\226\371\202\105\324\071\340\240\000\135\327\230\346 -\175\236\147\163\303\232\052\367\253\213\241\072\024\357\064\274 -\122\016\211\230\232\004\100\204\035\176\105\151\223\127\316\353 -\316\370\120\174\117\034\156\004\103\233\371\326\073\043\030\351 -\352\216\321\115\106\215\361\073\344\152\312\272\373\043\267\233 -\372\231\001\051\132\130\132\055\343\371\324\155\016\046\255\301 -\156\064\274\062\370\014\005\372\145\243\333\073\067\203\042\351 -\326\334\162\063\375\135\362\040\275\166\074\043\332\050\367\371 -\033\353\131\144\325\334\137\162\176\040\374\315\211\265\220\147 -\115\142\172\077\116\255\035\303\071\376\172\364\050\026\337\101 -\366\110\200\005\327\017\121\171\254\020\253\324\354\003\146\346 -\152\260\272\061\222\102\100\152\276\072\323\162\341\152\067\125 -\274\254\035\225\267\151\141\362\103\221\164\346\240\323\012\044 -\106\241\010\257\326\332\105\031\226\324\123\035\133\204\171\360 -\300\367\107\357\213\217\305\006\256\235\114\142\235\377\106\004 -\370\323\311\266\020\045\100\165\376\026\252\311\112\140\206\057 -\272\357\060\167\344\124\342\270\204\231\130\200\252\023\213\121 -\072\117\110\366\213\266\263 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "AC RAIZ FNMT-RCM" -# Issuer: OU=AC RAIZ FNMT-RCM,O=FNMT-RCM,C=ES -# Serial Number:5d:93:8d:30:67:36:c8:06:1d:1a:c7:54:84:69:07 -# Subject: OU=AC RAIZ FNMT-RCM,O=FNMT-RCM,C=ES -# Not Valid Before: Wed Oct 29 15:59:56 2008 -# Not Valid After : Tue Jan 01 00:00:00 2030 -# Fingerprint (SHA-256): EB:C5:57:0C:29:01:8C:4D:67:B1:AA:12:7B:AF:12:F7:03:B4:61:1E:BC:17:B7:DA:B5:57:38:94:17:9B:93:FA -# Fingerprint (SHA1): EC:50:35:07:B2:15:C4:95:62:19:E2:A8:9A:5B:42:99:2C:4C:2C:20 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "AC RAIZ FNMT-RCM" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\354\120\065\007\262\025\304\225\142\031\342\250\232\133\102\231 -\054\114\054\040 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\342\011\004\264\323\275\321\240\024\375\032\322\107\304\127\035 -END -CKA_ISSUER MULTILINE_OCTAL -\060\073\061\013\060\011\006\003\125\004\006\023\002\105\123\061 -\021\060\017\006\003\125\004\012\014\010\106\116\115\124\055\122 -\103\115\061\031\060\027\006\003\125\004\013\014\020\101\103\040 -\122\101\111\132\040\106\116\115\124\055\122\103\115 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\017\135\223\215\060\147\066\310\006\035\032\307\124\204\151 -\007 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Amazon Root CA 1" -# -# Issuer: CN=Amazon Root CA 1,O=Amazon,C=US -# Serial Number:06:6c:9f:cf:99:bf:8c:0a:39:e2:f0:78:8a:43:e6:96:36:5b:ca -# Subject: CN=Amazon Root CA 1,O=Amazon,C=US -# Not Valid Before: Tue May 26 00:00:00 2015 -# Not Valid After : Sun Jan 17 00:00:00 2038 -# Fingerprint (SHA-256): 8E:CD:E6:88:4F:3D:87:B1:12:5B:A3:1A:C3:FC:B1:3D:70:16:DE:7F:57:CC:90:4F:E1:CB:97:C6:AE:98:19:6E -# Fingerprint (SHA1): 8D:A7:F9:65:EC:5E:FC:37:91:0F:1C:6E:59:FD:C1:CC:6A:6E:DE:16 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Amazon Root CA 1" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\071\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\017\060\015\006\003\125\004\012\023\006\101\155\141\172\157\156 -\061\031\060\027\006\003\125\004\003\023\020\101\155\141\172\157 -\156\040\122\157\157\164\040\103\101\040\061 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\071\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\017\060\015\006\003\125\004\012\023\006\101\155\141\172\157\156 -\061\031\060\027\006\003\125\004\003\023\020\101\155\141\172\157 -\156\040\122\157\157\164\040\103\101\040\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\023\006\154\237\317\231\277\214\012\071\342\360\170\212\103 -\346\226\066\133\312 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\003\101\060\202\002\051\240\003\002\001\002\002\023\006 -\154\237\317\231\277\214\012\071\342\360\170\212\103\346\226\066 -\133\312\060\015\006\011\052\206\110\206\367\015\001\001\013\005 -\000\060\071\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\017\060\015\006\003\125\004\012\023\006\101\155\141\172\157 -\156\061\031\060\027\006\003\125\004\003\023\020\101\155\141\172 -\157\156\040\122\157\157\164\040\103\101\040\061\060\036\027\015 -\061\065\060\065\062\066\060\060\060\060\060\060\132\027\015\063 -\070\060\061\061\067\060\060\060\060\060\060\132\060\071\061\013 -\060\011\006\003\125\004\006\023\002\125\123\061\017\060\015\006 -\003\125\004\012\023\006\101\155\141\172\157\156\061\031\060\027 -\006\003\125\004\003\023\020\101\155\141\172\157\156\040\122\157 -\157\164\040\103\101\040\061\060\202\001\042\060\015\006\011\052 -\206\110\206\367\015\001\001\001\005\000\003\202\001\017\000\060 -\202\001\012\002\202\001\001\000\262\170\200\161\312\170\325\343 -\161\257\107\200\120\164\175\156\330\327\210\166\364\231\150\367 -\130\041\140\371\164\204\001\057\254\002\055\206\323\240\103\172 -\116\262\244\320\066\272\001\276\215\333\110\310\007\027\066\114 -\364\356\210\043\307\076\353\067\365\265\031\370\111\150\260\336 -\327\271\166\070\035\141\236\244\376\202\066\245\345\112\126\344 -\105\341\371\375\264\026\372\164\332\234\233\065\071\057\372\260 -\040\120\006\154\172\320\200\262\246\371\257\354\107\031\217\120 -\070\007\334\242\207\071\130\370\272\325\251\371\110\147\060\226 -\356\224\170\136\157\211\243\121\300\060\206\146\241\105\146\272 -\124\353\243\303\221\371\110\334\377\321\350\060\055\175\055\164 -\160\065\327\210\044\367\236\304\131\156\273\163\207\027\362\062 -\106\050\270\103\372\267\035\252\312\264\362\237\044\016\055\113 -\367\161\134\136\151\377\352\225\002\313\070\212\256\120\070\157 -\333\373\055\142\033\305\307\036\124\341\167\340\147\310\017\234 -\207\043\326\077\100\040\177\040\200\304\200\114\076\073\044\046 -\216\004\256\154\232\310\252\015\002\003\001\000\001\243\102\060 -\100\060\017\006\003\125\035\023\001\001\377\004\005\060\003\001 -\001\377\060\016\006\003\125\035\017\001\001\377\004\004\003\002 -\001\206\060\035\006\003\125\035\016\004\026\004\024\204\030\314 -\205\064\354\274\014\224\224\056\010\131\234\307\262\020\116\012 -\010\060\015\006\011\052\206\110\206\367\015\001\001\013\005\000 -\003\202\001\001\000\230\362\067\132\101\220\241\032\305\166\121 -\050\040\066\043\016\256\346\050\273\252\370\224\256\110\244\060 -\177\033\374\044\215\113\264\310\241\227\366\266\361\172\160\310 -\123\223\314\010\050\343\230\045\317\043\244\371\336\041\323\174 -\205\011\255\116\232\165\072\302\013\152\211\170\166\104\107\030 -\145\154\215\101\216\073\177\232\313\364\265\247\120\327\005\054 -\067\350\003\113\255\351\141\240\002\156\365\362\360\305\262\355 -\133\267\334\372\224\134\167\236\023\245\177\122\255\225\362\370 -\223\073\336\213\134\133\312\132\122\133\140\257\024\367\113\357 -\243\373\237\100\225\155\061\124\374\102\323\307\106\037\043\255 -\331\017\110\160\232\331\165\170\161\321\162\103\064\165\156\127 -\131\302\002\134\046\140\051\317\043\031\026\216\210\103\245\324 -\344\313\010\373\043\021\103\350\103\051\162\142\241\251\135\136 -\010\324\220\256\270\330\316\024\302\320\125\362\206\366\304\223 -\103\167\146\141\300\271\350\101\327\227\170\140\003\156\112\162 -\256\245\321\175\272\020\236\206\154\033\212\271\131\063\370\353 -\304\220\276\361\271 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Amazon Root CA 1" -# Issuer: CN=Amazon Root CA 1,O=Amazon,C=US -# Serial Number:06:6c:9f:cf:99:bf:8c:0a:39:e2:f0:78:8a:43:e6:96:36:5b:ca -# Subject: CN=Amazon Root CA 1,O=Amazon,C=US -# Not Valid Before: Tue May 26 00:00:00 2015 -# Not Valid After : Sun Jan 17 00:00:00 2038 -# Fingerprint (SHA-256): 8E:CD:E6:88:4F:3D:87:B1:12:5B:A3:1A:C3:FC:B1:3D:70:16:DE:7F:57:CC:90:4F:E1:CB:97:C6:AE:98:19:6E -# Fingerprint (SHA1): 8D:A7:F9:65:EC:5E:FC:37:91:0F:1C:6E:59:FD:C1:CC:6A:6E:DE:16 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Amazon Root CA 1" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\215\247\371\145\354\136\374\067\221\017\034\156\131\375\301\314 -\152\156\336\026 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\103\306\277\256\354\376\255\057\030\306\210\150\060\374\310\346 -END -CKA_ISSUER MULTILINE_OCTAL -\060\071\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\017\060\015\006\003\125\004\012\023\006\101\155\141\172\157\156 -\061\031\060\027\006\003\125\004\003\023\020\101\155\141\172\157 -\156\040\122\157\157\164\040\103\101\040\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\023\006\154\237\317\231\277\214\012\071\342\360\170\212\103 -\346\226\066\133\312 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Amazon Root CA 2" -# -# Issuer: CN=Amazon Root CA 2,O=Amazon,C=US -# Serial Number:06:6c:9f:d2:96:35:86:9f:0a:0f:e5:86:78:f8:5b:26:bb:8a:37 -# Subject: CN=Amazon Root CA 2,O=Amazon,C=US -# Not Valid Before: Tue May 26 00:00:00 2015 -# Not Valid After : Sat May 26 00:00:00 2040 -# Fingerprint (SHA-256): 1B:A5:B2:AA:8C:65:40:1A:82:96:01:18:F8:0B:EC:4F:62:30:4D:83:CE:C4:71:3A:19:C3:9C:01:1E:A4:6D:B4 -# Fingerprint (SHA1): 5A:8C:EF:45:D7:A6:98:59:76:7A:8C:8B:44:96:B5:78:CF:47:4B:1A -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Amazon Root CA 2" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\071\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\017\060\015\006\003\125\004\012\023\006\101\155\141\172\157\156 -\061\031\060\027\006\003\125\004\003\023\020\101\155\141\172\157 -\156\040\122\157\157\164\040\103\101\040\062 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\071\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\017\060\015\006\003\125\004\012\023\006\101\155\141\172\157\156 -\061\031\060\027\006\003\125\004\003\023\020\101\155\141\172\157 -\156\040\122\157\157\164\040\103\101\040\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\023\006\154\237\322\226\065\206\237\012\017\345\206\170\370 -\133\046\273\212\067 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\101\060\202\003\051\240\003\002\001\002\002\023\006 -\154\237\322\226\065\206\237\012\017\345\206\170\370\133\046\273 -\212\067\060\015\006\011\052\206\110\206\367\015\001\001\014\005 -\000\060\071\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\017\060\015\006\003\125\004\012\023\006\101\155\141\172\157 -\156\061\031\060\027\006\003\125\004\003\023\020\101\155\141\172 -\157\156\040\122\157\157\164\040\103\101\040\062\060\036\027\015 -\061\065\060\065\062\066\060\060\060\060\060\060\132\027\015\064 -\060\060\065\062\066\060\060\060\060\060\060\132\060\071\061\013 -\060\011\006\003\125\004\006\023\002\125\123\061\017\060\015\006 -\003\125\004\012\023\006\101\155\141\172\157\156\061\031\060\027 -\006\003\125\004\003\023\020\101\155\141\172\157\156\040\122\157 -\157\164\040\103\101\040\062\060\202\002\042\060\015\006\011\052 -\206\110\206\367\015\001\001\001\005\000\003\202\002\017\000\060 -\202\002\012\002\202\002\001\000\255\226\237\055\234\112\114\112 -\201\171\121\231\354\212\313\153\140\121\023\274\115\155\006\374 -\260\010\215\335\031\020\152\307\046\014\065\330\300\157\040\204 -\351\224\261\233\205\003\303\133\333\112\350\310\370\220\166\331 -\133\117\343\114\350\006\066\115\314\232\254\075\014\220\053\222 -\324\006\031\140\254\067\104\171\205\201\202\255\132\067\340\015 -\314\235\246\114\122\166\352\103\235\267\004\321\120\366\125\340 -\325\322\246\111\205\351\067\351\312\176\256\134\225\115\110\232 -\077\256\040\132\155\210\225\331\064\270\122\032\103\220\260\277 -\154\005\271\266\170\267\352\320\344\072\074\022\123\142\377\112 -\362\173\276\065\005\251\022\064\343\363\144\164\142\054\075\000 -\111\132\050\376\062\104\273\207\335\145\047\002\161\073\332\112 -\367\037\332\315\367\041\125\220\117\017\354\256\202\341\237\153 -\331\105\323\273\360\137\207\355\074\054\071\206\332\077\336\354 -\162\125\353\171\243\255\333\335\174\260\272\034\316\374\336\117 -\065\166\317\017\370\170\037\152\066\121\106\047\141\133\351\236 -\317\360\242\125\175\174\045\212\157\057\264\305\317\204\056\053 -\375\015\121\020\154\373\137\033\274\033\176\305\256\073\230\001 -\061\222\377\013\127\364\232\262\271\127\351\253\357\015\166\321 -\360\356\364\316\206\247\340\156\351\264\151\241\337\151\366\063 -\306\151\056\227\023\236\245\207\260\127\020\201\067\311\123\263 -\273\177\366\222\321\234\320\030\364\222\156\332\203\117\246\143 -\231\114\245\373\136\357\041\144\172\040\137\154\144\205\025\313 -\067\351\142\014\013\052\026\334\001\056\062\332\076\113\365\236 -\072\366\027\100\224\357\236\221\010\206\372\276\143\250\132\063 -\354\313\164\103\225\371\154\151\122\066\307\051\157\374\125\003 -\134\037\373\237\275\107\353\347\111\107\225\013\116\211\042\011 -\111\340\365\141\036\361\277\056\212\162\156\200\131\377\127\072 -\371\165\062\243\116\137\354\355\050\142\331\115\163\362\314\201 -\027\140\355\315\353\334\333\247\312\305\176\002\275\362\124\010 -\124\375\264\055\011\054\027\124\112\230\321\124\341\121\147\010 -\322\355\156\176\157\077\322\055\201\131\051\146\313\220\071\225 -\021\036\164\047\376\335\353\257\002\003\001\000\001\243\102\060 -\100\060\017\006\003\125\035\023\001\001\377\004\005\060\003\001 -\001\377\060\016\006\003\125\035\017\001\001\377\004\004\003\002 -\001\206\060\035\006\003\125\035\016\004\026\004\024\260\014\360 -\114\060\364\005\130\002\110\375\063\345\122\257\113\204\343\146 -\122\060\015\006\011\052\206\110\206\367\015\001\001\014\005\000 -\003\202\002\001\000\252\250\200\217\016\170\243\340\242\324\315 -\346\365\230\172\073\352\000\003\260\227\016\223\274\132\250\366 -\054\214\162\207\251\261\374\177\163\375\143\161\170\245\207\131 -\317\060\341\015\020\262\023\132\155\202\365\152\346\200\237\240 -\005\013\150\344\107\153\307\152\337\266\375\167\062\162\345\030 -\372\011\364\240\223\054\135\322\214\165\205\166\145\220\014\003 -\171\267\061\043\143\255\170\203\011\206\150\204\312\377\371\317 -\046\232\222\171\347\315\113\305\347\141\247\027\313\363\251\022 -\223\223\153\247\350\057\123\222\304\140\130\260\314\002\121\030 -\133\205\215\142\131\143\266\255\264\336\232\373\046\367\000\047 -\300\135\125\067\164\231\311\120\177\343\131\056\104\343\054\045 -\356\354\114\062\167\264\237\032\351\113\135\040\305\332\375\034 -\207\026\306\103\350\324\273\046\232\105\160\136\251\013\067\123 -\342\106\173\047\375\340\106\362\211\267\314\102\266\313\050\046 -\156\331\245\311\072\310\101\023\140\367\120\214\025\256\262\155 -\032\025\032\127\170\346\222\052\331\145\220\202\077\154\002\257 -\256\022\072\047\226\066\004\327\035\242\200\143\251\233\361\345 -\272\264\174\024\260\116\311\261\037\164\137\070\366\121\352\233 -\372\054\242\021\324\251\055\047\032\105\261\257\262\116\161\015 -\300\130\106\326\151\006\313\123\313\263\376\153\101\315\101\176 -\175\114\017\174\162\171\172\131\315\136\112\016\254\233\251\230 -\163\171\174\264\364\314\271\270\007\014\262\164\134\270\307\157 -\210\241\220\247\364\252\371\277\147\072\364\032\025\142\036\267 -\237\276\075\261\051\257\147\241\022\362\130\020\031\123\003\060 -\033\270\032\211\366\234\275\227\003\216\243\011\363\035\213\041 -\361\264\337\344\034\321\237\145\002\006\352\134\326\023\263\204 -\357\242\245\134\214\167\051\247\150\300\153\256\100\322\250\264 -\352\315\360\215\113\070\234\031\232\033\050\124\270\211\220\357 -\312\165\201\076\036\362\144\044\307\030\257\116\377\107\236\007 -\366\065\145\244\323\012\126\377\365\027\144\154\357\250\042\045 -\111\223\266\337\000\027\332\130\176\135\356\305\033\260\321\321 -\137\041\020\307\371\363\272\002\012\047\007\305\361\326\307\323 -\340\373\011\140\154 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Amazon Root CA 2" -# Issuer: CN=Amazon Root CA 2,O=Amazon,C=US -# Serial Number:06:6c:9f:d2:96:35:86:9f:0a:0f:e5:86:78:f8:5b:26:bb:8a:37 -# Subject: CN=Amazon Root CA 2,O=Amazon,C=US -# Not Valid Before: Tue May 26 00:00:00 2015 -# Not Valid After : Sat May 26 00:00:00 2040 -# Fingerprint (SHA-256): 1B:A5:B2:AA:8C:65:40:1A:82:96:01:18:F8:0B:EC:4F:62:30:4D:83:CE:C4:71:3A:19:C3:9C:01:1E:A4:6D:B4 -# Fingerprint (SHA1): 5A:8C:EF:45:D7:A6:98:59:76:7A:8C:8B:44:96:B5:78:CF:47:4B:1A -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Amazon Root CA 2" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\132\214\357\105\327\246\230\131\166\172\214\213\104\226\265\170 -\317\107\113\032 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\310\345\215\316\250\102\342\172\300\052\134\174\236\046\277\146 -END -CKA_ISSUER MULTILINE_OCTAL -\060\071\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\017\060\015\006\003\125\004\012\023\006\101\155\141\172\157\156 -\061\031\060\027\006\003\125\004\003\023\020\101\155\141\172\157 -\156\040\122\157\157\164\040\103\101\040\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\023\006\154\237\322\226\065\206\237\012\017\345\206\170\370 -\133\046\273\212\067 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Amazon Root CA 3" -# -# Issuer: CN=Amazon Root CA 3,O=Amazon,C=US -# Serial Number:06:6c:9f:d5:74:97:36:66:3f:3b:0b:9a:d9:e8:9e:76:03:f2:4a -# Subject: CN=Amazon Root CA 3,O=Amazon,C=US -# Not Valid Before: Tue May 26 00:00:00 2015 -# Not Valid After : Sat May 26 00:00:00 2040 -# Fingerprint (SHA-256): 18:CE:6C:FE:7B:F1:4E:60:B2:E3:47:B8:DF:E8:68:CB:31:D0:2E:BB:3A:DA:27:15:69:F5:03:43:B4:6D:B3:A4 -# Fingerprint (SHA1): 0D:44:DD:8C:3C:8C:1A:1A:58:75:64:81:E9:0F:2E:2A:FF:B3:D2:6E -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Amazon Root CA 3" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\071\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\017\060\015\006\003\125\004\012\023\006\101\155\141\172\157\156 -\061\031\060\027\006\003\125\004\003\023\020\101\155\141\172\157 -\156\040\122\157\157\164\040\103\101\040\063 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\071\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\017\060\015\006\003\125\004\012\023\006\101\155\141\172\157\156 -\061\031\060\027\006\003\125\004\003\023\020\101\155\141\172\157 -\156\040\122\157\157\164\040\103\101\040\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\023\006\154\237\325\164\227\066\146\077\073\013\232\331\350 -\236\166\003\362\112 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\001\266\060\202\001\133\240\003\002\001\002\002\023\006 -\154\237\325\164\227\066\146\077\073\013\232\331\350\236\166\003 -\362\112\060\012\006\010\052\206\110\316\075\004\003\002\060\071 -\061\013\060\011\006\003\125\004\006\023\002\125\123\061\017\060 -\015\006\003\125\004\012\023\006\101\155\141\172\157\156\061\031 -\060\027\006\003\125\004\003\023\020\101\155\141\172\157\156\040 -\122\157\157\164\040\103\101\040\063\060\036\027\015\061\065\060 -\065\062\066\060\060\060\060\060\060\132\027\015\064\060\060\065 -\062\066\060\060\060\060\060\060\132\060\071\061\013\060\011\006 -\003\125\004\006\023\002\125\123\061\017\060\015\006\003\125\004 -\012\023\006\101\155\141\172\157\156\061\031\060\027\006\003\125 -\004\003\023\020\101\155\141\172\157\156\040\122\157\157\164\040 -\103\101\040\063\060\131\060\023\006\007\052\206\110\316\075\002 -\001\006\010\052\206\110\316\075\003\001\007\003\102\000\004\051 -\227\247\306\101\177\300\015\233\350\001\033\126\306\362\122\245 -\272\055\262\022\350\322\056\327\372\311\305\330\252\155\037\163 -\201\073\073\230\153\071\174\063\245\305\116\206\216\200\027\150 -\142\105\127\175\104\130\035\263\067\345\147\010\353\146\336\243 -\102\060\100\060\017\006\003\125\035\023\001\001\377\004\005\060 -\003\001\001\377\060\016\006\003\125\035\017\001\001\377\004\004 -\003\002\001\206\060\035\006\003\125\035\016\004\026\004\024\253 -\266\333\327\006\236\067\254\060\206\007\221\160\307\234\304\031 -\261\170\300\060\012\006\010\052\206\110\316\075\004\003\002\003 -\111\000\060\106\002\041\000\340\205\222\243\027\267\215\371\053 -\006\245\223\254\032\230\150\141\162\372\341\241\320\373\034\170 -\140\246\103\231\305\270\304\002\041\000\234\002\357\361\224\234 -\263\226\371\353\306\052\370\266\054\376\072\220\024\026\327\214 -\143\044\110\034\337\060\175\325\150\073 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Amazon Root CA 3" -# Issuer: CN=Amazon Root CA 3,O=Amazon,C=US -# Serial Number:06:6c:9f:d5:74:97:36:66:3f:3b:0b:9a:d9:e8:9e:76:03:f2:4a -# Subject: CN=Amazon Root CA 3,O=Amazon,C=US -# Not Valid Before: Tue May 26 00:00:00 2015 -# Not Valid After : Sat May 26 00:00:00 2040 -# Fingerprint (SHA-256): 18:CE:6C:FE:7B:F1:4E:60:B2:E3:47:B8:DF:E8:68:CB:31:D0:2E:BB:3A:DA:27:15:69:F5:03:43:B4:6D:B3:A4 -# Fingerprint (SHA1): 0D:44:DD:8C:3C:8C:1A:1A:58:75:64:81:E9:0F:2E:2A:FF:B3:D2:6E -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Amazon Root CA 3" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\015\104\335\214\074\214\032\032\130\165\144\201\351\017\056\052 -\377\263\322\156 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\240\324\357\013\367\265\330\111\225\052\354\365\304\374\201\207 -END -CKA_ISSUER MULTILINE_OCTAL -\060\071\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\017\060\015\006\003\125\004\012\023\006\101\155\141\172\157\156 -\061\031\060\027\006\003\125\004\003\023\020\101\155\141\172\157 -\156\040\122\157\157\164\040\103\101\040\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\023\006\154\237\325\164\227\066\146\077\073\013\232\331\350 -\236\166\003\362\112 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Amazon Root CA 4" -# -# Issuer: CN=Amazon Root CA 4,O=Amazon,C=US -# Serial Number:06:6c:9f:d7:c1:bb:10:4c:29:43:e5:71:7b:7b:2c:c8:1a:c1:0e -# Subject: CN=Amazon Root CA 4,O=Amazon,C=US -# Not Valid Before: Tue May 26 00:00:00 2015 -# Not Valid After : Sat May 26 00:00:00 2040 -# Fingerprint (SHA-256): E3:5D:28:41:9E:D0:20:25:CF:A6:90:38:CD:62:39:62:45:8D:A5:C6:95:FB:DE:A3:C2:2B:0B:FB:25:89:70:92 -# Fingerprint (SHA1): F6:10:84:07:D6:F8:BB:67:98:0C:C2:E2:44:C2:EB:AE:1C:EF:63:BE -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Amazon Root CA 4" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\071\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\017\060\015\006\003\125\004\012\023\006\101\155\141\172\157\156 -\061\031\060\027\006\003\125\004\003\023\020\101\155\141\172\157 -\156\040\122\157\157\164\040\103\101\040\064 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\071\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\017\060\015\006\003\125\004\012\023\006\101\155\141\172\157\156 -\061\031\060\027\006\003\125\004\003\023\020\101\155\141\172\157 -\156\040\122\157\157\164\040\103\101\040\064 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\023\006\154\237\327\301\273\020\114\051\103\345\161\173\173 -\054\310\032\301\016 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\001\362\060\202\001\170\240\003\002\001\002\002\023\006 -\154\237\327\301\273\020\114\051\103\345\161\173\173\054\310\032 -\301\016\060\012\006\010\052\206\110\316\075\004\003\003\060\071 -\061\013\060\011\006\003\125\004\006\023\002\125\123\061\017\060 -\015\006\003\125\004\012\023\006\101\155\141\172\157\156\061\031 -\060\027\006\003\125\004\003\023\020\101\155\141\172\157\156\040 -\122\157\157\164\040\103\101\040\064\060\036\027\015\061\065\060 -\065\062\066\060\060\060\060\060\060\132\027\015\064\060\060\065 -\062\066\060\060\060\060\060\060\132\060\071\061\013\060\011\006 -\003\125\004\006\023\002\125\123\061\017\060\015\006\003\125\004 -\012\023\006\101\155\141\172\157\156\061\031\060\027\006\003\125 -\004\003\023\020\101\155\141\172\157\156\040\122\157\157\164\040 -\103\101\040\064\060\166\060\020\006\007\052\206\110\316\075\002 -\001\006\005\053\201\004\000\042\003\142\000\004\322\253\212\067 -\117\243\123\015\376\301\212\173\113\250\173\106\113\143\260\142 -\366\055\033\333\010\161\041\322\000\350\143\275\232\047\373\360 -\071\156\135\352\075\245\311\201\252\243\133\040\230\105\135\026 -\333\375\350\020\155\343\234\340\343\275\137\204\142\363\160\144 -\063\240\313\044\057\160\272\210\241\052\240\165\370\201\256\142 -\006\304\201\333\071\156\051\260\036\372\056\134\243\102\060\100 -\060\017\006\003\125\035\023\001\001\377\004\005\060\003\001\001 -\377\060\016\006\003\125\035\017\001\001\377\004\004\003\002\001 -\206\060\035\006\003\125\035\016\004\026\004\024\323\354\307\072 -\145\156\314\341\332\166\232\126\373\234\363\206\155\127\345\201 -\060\012\006\010\052\206\110\316\075\004\003\003\003\150\000\060 -\145\002\060\072\213\041\361\275\176\021\255\320\357\130\226\057 -\326\353\235\176\220\215\053\317\146\125\303\054\343\050\251\160 -\012\107\016\360\067\131\022\377\055\231\224\050\116\052\117\065 -\115\063\132\002\061\000\352\165\000\116\073\304\072\224\022\221 -\311\130\106\235\041\023\162\247\210\234\212\344\114\112\333\226 -\324\254\213\153\153\111\022\123\063\255\327\344\276\044\374\265 -\012\166\324\245\274\020 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Amazon Root CA 4" -# Issuer: CN=Amazon Root CA 4,O=Amazon,C=US -# Serial Number:06:6c:9f:d7:c1:bb:10:4c:29:43:e5:71:7b:7b:2c:c8:1a:c1:0e -# Subject: CN=Amazon Root CA 4,O=Amazon,C=US -# Not Valid Before: Tue May 26 00:00:00 2015 -# Not Valid After : Sat May 26 00:00:00 2040 -# Fingerprint (SHA-256): E3:5D:28:41:9E:D0:20:25:CF:A6:90:38:CD:62:39:62:45:8D:A5:C6:95:FB:DE:A3:C2:2B:0B:FB:25:89:70:92 -# Fingerprint (SHA1): F6:10:84:07:D6:F8:BB:67:98:0C:C2:E2:44:C2:EB:AE:1C:EF:63:BE -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Amazon Root CA 4" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\366\020\204\007\326\370\273\147\230\014\302\342\104\302\353\256 -\034\357\143\276 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\211\274\047\325\353\027\215\006\152\151\325\375\211\107\264\315 -END -CKA_ISSUER MULTILINE_OCTAL -\060\071\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\017\060\015\006\003\125\004\012\023\006\101\155\141\172\157\156 -\061\031\060\027\006\003\125\004\003\023\020\101\155\141\172\157 -\156\040\122\157\157\164\040\103\101\040\064 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\023\006\154\237\327\301\273\020\114\051\103\345\161\173\173 -\054\310\032\301\016 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "D-TRUST Root CA 3 2013" -# -# Issuer: CN=D-TRUST Root CA 3 2013,O=D-Trust GmbH,C=DE -# Serial Number: 1039788 (0xfddac) -# Subject: CN=D-TRUST Root CA 3 2013,O=D-Trust GmbH,C=DE -# Not Valid Before: Fri Sep 20 08:25:51 2013 -# Not Valid After : Wed Sep 20 08:25:51 2028 -# Fingerprint (SHA-256): A1:A8:6D:04:12:1E:B8:7F:02:7C:66:F5:33:03:C2:8E:57:39:F9:43:FC:84:B3:8A:D6:AF:00:90:35:DD:94:57 -# Fingerprint (SHA1): 6C:7C:CC:E7:D4:AE:51:5F:99:08:CD:3F:F6:E8:C3:78:DF:6F:EF:97 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "D-TRUST Root CA 3 2013" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\105\061\013\060\011\006\003\125\004\006\023\002\104\105\061 -\025\060\023\006\003\125\004\012\014\014\104\055\124\162\165\163 -\164\040\107\155\142\110\061\037\060\035\006\003\125\004\003\014 -\026\104\055\124\122\125\123\124\040\122\157\157\164\040\103\101 -\040\063\040\062\060\061\063 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\105\061\013\060\011\006\003\125\004\006\023\002\104\105\061 -\025\060\023\006\003\125\004\012\014\014\104\055\124\162\165\163 -\164\040\107\155\142\110\061\037\060\035\006\003\125\004\003\014 -\026\104\055\124\122\125\123\124\040\122\157\157\164\040\103\101 -\040\063\040\062\060\061\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\003\017\335\254 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\004\016\060\202\002\366\240\003\002\001\002\002\003\017 -\335\254\060\015\006\011\052\206\110\206\367\015\001\001\013\005 -\000\060\105\061\013\060\011\006\003\125\004\006\023\002\104\105 -\061\025\060\023\006\003\125\004\012\014\014\104\055\124\162\165 -\163\164\040\107\155\142\110\061\037\060\035\006\003\125\004\003 -\014\026\104\055\124\122\125\123\124\040\122\157\157\164\040\103 -\101\040\063\040\062\060\061\063\060\036\027\015\061\063\060\071 -\062\060\060\070\062\065\065\061\132\027\015\062\070\060\071\062 -\060\060\070\062\065\065\061\132\060\105\061\013\060\011\006\003 -\125\004\006\023\002\104\105\061\025\060\023\006\003\125\004\012 -\014\014\104\055\124\162\165\163\164\040\107\155\142\110\061\037 -\060\035\006\003\125\004\003\014\026\104\055\124\122\125\123\124 -\040\122\157\157\164\040\103\101\040\063\040\062\060\061\063\060 -\202\001\042\060\015\006\011\052\206\110\206\367\015\001\001\001 -\005\000\003\202\001\017\000\060\202\001\012\002\202\001\001\000 -\304\173\102\222\202\037\354\355\124\230\216\022\300\312\011\337 -\223\156\072\223\134\033\344\020\167\236\116\151\210\154\366\341 -\151\362\366\233\242\141\261\275\007\040\164\230\145\361\214\046 -\010\315\250\065\312\200\066\321\143\155\350\104\172\202\303\154 -\136\336\273\350\066\322\304\150\066\214\237\062\275\204\042\340 -\334\302\356\020\106\071\155\257\223\071\256\207\346\303\274\011 -\311\054\153\147\133\331\233\166\165\114\013\340\273\305\327\274 -\076\171\362\137\276\321\220\127\371\256\366\146\137\061\277\323 -\155\217\247\272\112\363\043\145\273\267\357\243\045\327\012\352 -\130\266\357\210\372\372\171\262\122\130\325\360\254\214\241\121 -\164\051\225\252\121\073\220\062\003\237\034\162\164\220\336\075 -\355\141\322\345\343\375\144\107\345\271\267\112\251\367\037\256 -\226\206\004\254\057\343\244\201\167\267\132\026\377\330\017\077 -\366\267\170\314\244\257\372\133\074\022\133\250\122\211\162\357 -\210\363\325\104\201\206\225\043\237\173\335\274\331\064\357\174 -\224\074\252\300\101\302\343\235\120\032\300\344\031\042\374\263 -\002\003\001\000\001\243\202\001\005\060\202\001\001\060\017\006 -\003\125\035\023\001\001\377\004\005\060\003\001\001\377\060\035 -\006\003\125\035\016\004\026\004\024\077\220\310\175\307\025\157 -\363\044\217\251\303\057\113\242\017\041\262\057\347\060\016\006 -\003\125\035\017\001\001\377\004\004\003\002\001\006\060\201\276 -\006\003\125\035\037\004\201\266\060\201\263\060\164\240\162\240 -\160\206\156\154\144\141\160\072\057\057\144\151\162\145\143\164 -\157\162\171\056\144\055\164\162\165\163\164\056\156\145\164\057 -\103\116\075\104\055\124\122\125\123\124\045\062\060\122\157\157 -\164\045\062\060\103\101\045\062\060\063\045\062\060\062\060\061 -\063\054\117\075\104\055\124\162\165\163\164\045\062\060\107\155 -\142\110\054\103\075\104\105\077\143\145\162\164\151\146\151\143 -\141\164\145\162\145\166\157\143\141\164\151\157\156\154\151\163 -\164\060\073\240\071\240\067\206\065\150\164\164\160\072\057\057 -\143\162\154\056\144\055\164\162\165\163\164\056\156\145\164\057 -\143\162\154\057\144\055\164\162\165\163\164\137\162\157\157\164 -\137\143\141\137\063\137\062\060\061\063\056\143\162\154\060\015 -\006\011\052\206\110\206\367\015\001\001\013\005\000\003\202\001 -\001\000\016\131\016\130\344\164\110\043\104\317\064\041\265\234 -\024\032\255\232\113\267\263\210\155\134\251\027\160\360\052\237 -\215\173\371\173\205\372\307\071\350\020\010\260\065\053\137\317 -\002\322\323\234\310\013\036\356\005\124\256\067\223\004\011\175 -\154\217\302\164\274\370\034\224\276\061\001\100\055\363\044\040 -\267\204\125\054\134\310\365\164\112\020\031\213\243\307\355\065 -\326\011\110\323\016\300\272\071\250\260\106\002\260\333\306\210 -\131\302\276\374\173\261\053\317\176\142\207\125\226\314\001\157 -\233\147\041\225\065\213\370\020\374\161\033\267\113\067\151\246 -\073\326\354\213\356\301\260\363\045\311\217\222\175\241\352\303 -\312\104\277\046\245\164\222\234\343\164\353\235\164\331\313\115 -\207\330\374\264\151\154\213\240\103\007\140\170\227\351\331\223 -\174\302\106\274\233\067\122\243\355\212\074\023\251\173\123\113 -\111\232\021\005\054\013\156\126\254\037\056\202\154\340\151\147 -\265\016\155\055\331\344\300\025\361\077\372\030\162\341\025\155 -\047\133\055\060\050\053\237\110\232\144\053\231\357\362\165\111 -\137\134 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "D-TRUST Root CA 3 2013" -# Issuer: CN=D-TRUST Root CA 3 2013,O=D-Trust GmbH,C=DE -# Serial Number: 1039788 (0xfddac) -# Subject: CN=D-TRUST Root CA 3 2013,O=D-Trust GmbH,C=DE -# Not Valid Before: Fri Sep 20 08:25:51 2013 -# Not Valid After : Wed Sep 20 08:25:51 2028 -# Fingerprint (SHA-256): A1:A8:6D:04:12:1E:B8:7F:02:7C:66:F5:33:03:C2:8E:57:39:F9:43:FC:84:B3:8A:D6:AF:00:90:35:DD:94:57 -# Fingerprint (SHA1): 6C:7C:CC:E7:D4:AE:51:5F:99:08:CD:3F:F6:E8:C3:78:DF:6F:EF:97 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "D-TRUST Root CA 3 2013" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\154\174\314\347\324\256\121\137\231\010\315\077\366\350\303\170 -\337\157\357\227 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\267\042\146\230\176\326\003\340\301\161\346\165\315\126\105\277 -END -CKA_ISSUER MULTILINE_OCTAL -\060\105\061\013\060\011\006\003\125\004\006\023\002\104\105\061 -\025\060\023\006\003\125\004\012\014\014\104\055\124\162\165\163 -\164\040\107\155\142\110\061\037\060\035\006\003\125\004\003\014 -\026\104\055\124\122\125\123\124\040\122\157\157\164\040\103\101 -\040\063\040\062\060\061\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\003\017\335\254 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1" -# -# Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1,OU=Kamu Sertifikasyon Merkezi - Kamu SM,O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK,L=Gebze - Kocaeli,C=TR -# Serial Number: 1 (0x1) -# Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1,OU=Kamu Sertifikasyon Merkezi - Kamu SM,O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK,L=Gebze - Kocaeli,C=TR -# Not Valid Before: Mon Nov 25 08:25:55 2013 -# Not Valid After : Sun Oct 25 08:25:55 2043 -# Fingerprint (SHA-256): 46:ED:C3:68:90:46:D5:3A:45:3F:B3:10:4A:B8:0D:CA:EC:65:8B:26:60:EA:16:29:DD:7E:86:79:90:64:87:16 -# Fingerprint (SHA1): 31:43:64:9B:EC:CE:27:EC:ED:3A:3F:0B:8F:0D:E4:E8:91:DD:EE:CA -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\201\322\061\013\060\011\006\003\125\004\006\023\002\124\122 -\061\030\060\026\006\003\125\004\007\023\017\107\145\142\172\145 -\040\055\040\113\157\143\141\145\154\151\061\102\060\100\006\003 -\125\004\012\023\071\124\165\162\153\151\171\145\040\102\151\154 -\151\155\163\145\154\040\166\145\040\124\145\153\156\157\154\157 -\152\151\153\040\101\162\141\163\164\151\162\155\141\040\113\165 -\162\165\155\165\040\055\040\124\125\102\111\124\101\113\061\055 -\060\053\006\003\125\004\013\023\044\113\141\155\165\040\123\145 -\162\164\151\146\151\153\141\163\171\157\156\040\115\145\162\153 -\145\172\151\040\055\040\113\141\155\165\040\123\115\061\066\060 -\064\006\003\125\004\003\023\055\124\125\102\111\124\101\113\040 -\113\141\155\165\040\123\115\040\123\123\114\040\113\157\153\040 -\123\145\162\164\151\146\151\153\141\163\151\040\055\040\123\165 -\162\165\155\040\061 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\201\322\061\013\060\011\006\003\125\004\006\023\002\124\122 -\061\030\060\026\006\003\125\004\007\023\017\107\145\142\172\145 -\040\055\040\113\157\143\141\145\154\151\061\102\060\100\006\003 -\125\004\012\023\071\124\165\162\153\151\171\145\040\102\151\154 -\151\155\163\145\154\040\166\145\040\124\145\153\156\157\154\157 -\152\151\153\040\101\162\141\163\164\151\162\155\141\040\113\165 -\162\165\155\165\040\055\040\124\125\102\111\124\101\113\061\055 -\060\053\006\003\125\004\013\023\044\113\141\155\165\040\123\145 -\162\164\151\146\151\153\141\163\171\157\156\040\115\145\162\153 -\145\172\151\040\055\040\113\141\155\165\040\123\115\061\066\060 -\064\006\003\125\004\003\023\055\124\125\102\111\124\101\113\040 -\113\141\155\165\040\123\115\040\123\123\114\040\113\157\153\040 -\123\145\162\164\151\146\151\153\141\163\151\040\055\040\123\165 -\162\165\155\040\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\001 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\004\143\060\202\003\113\240\003\002\001\002\002\001\001 -\060\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060 -\201\322\061\013\060\011\006\003\125\004\006\023\002\124\122\061 -\030\060\026\006\003\125\004\007\023\017\107\145\142\172\145\040 -\055\040\113\157\143\141\145\154\151\061\102\060\100\006\003\125 -\004\012\023\071\124\165\162\153\151\171\145\040\102\151\154\151 -\155\163\145\154\040\166\145\040\124\145\153\156\157\154\157\152 -\151\153\040\101\162\141\163\164\151\162\155\141\040\113\165\162 -\165\155\165\040\055\040\124\125\102\111\124\101\113\061\055\060 -\053\006\003\125\004\013\023\044\113\141\155\165\040\123\145\162 -\164\151\146\151\153\141\163\171\157\156\040\115\145\162\153\145 -\172\151\040\055\040\113\141\155\165\040\123\115\061\066\060\064 -\006\003\125\004\003\023\055\124\125\102\111\124\101\113\040\113 -\141\155\165\040\123\115\040\123\123\114\040\113\157\153\040\123 -\145\162\164\151\146\151\153\141\163\151\040\055\040\123\165\162 -\165\155\040\061\060\036\027\015\061\063\061\061\062\065\060\070 -\062\065\065\065\132\027\015\064\063\061\060\062\065\060\070\062 -\065\065\065\132\060\201\322\061\013\060\011\006\003\125\004\006 -\023\002\124\122\061\030\060\026\006\003\125\004\007\023\017\107 -\145\142\172\145\040\055\040\113\157\143\141\145\154\151\061\102 -\060\100\006\003\125\004\012\023\071\124\165\162\153\151\171\145 -\040\102\151\154\151\155\163\145\154\040\166\145\040\124\145\153 -\156\157\154\157\152\151\153\040\101\162\141\163\164\151\162\155 -\141\040\113\165\162\165\155\165\040\055\040\124\125\102\111\124 -\101\113\061\055\060\053\006\003\125\004\013\023\044\113\141\155 -\165\040\123\145\162\164\151\146\151\153\141\163\171\157\156\040 -\115\145\162\153\145\172\151\040\055\040\113\141\155\165\040\123 -\115\061\066\060\064\006\003\125\004\003\023\055\124\125\102\111 -\124\101\113\040\113\141\155\165\040\123\115\040\123\123\114\040 -\113\157\153\040\123\145\162\164\151\146\151\153\141\163\151\040 -\055\040\123\165\162\165\155\040\061\060\202\001\042\060\015\006 -\011\052\206\110\206\367\015\001\001\001\005\000\003\202\001\017 -\000\060\202\001\012\002\202\001\001\000\257\165\060\063\252\273 -\153\323\231\054\022\067\204\331\215\173\227\200\323\156\347\377 -\233\120\225\076\220\225\126\102\327\031\174\046\204\215\222\372 -\001\035\072\017\342\144\070\267\214\274\350\210\371\213\044\253 -\056\243\365\067\344\100\216\030\045\171\203\165\037\073\377\154 -\250\305\306\126\370\264\355\212\104\243\253\154\114\374\035\320 -\334\357\150\275\317\344\252\316\360\125\367\242\064\324\203\153 -\067\174\034\302\376\265\003\354\127\316\274\264\265\305\355\000 -\017\123\067\052\115\364\117\014\203\373\206\317\313\376\214\116 -\275\207\371\247\213\041\127\234\172\337\003\147\211\054\235\227 -\141\247\020\270\125\220\177\016\055\047\070\164\337\347\375\332 -\116\022\343\115\025\042\002\310\340\340\374\017\255\212\327\311 -\124\120\314\073\017\312\026\200\204\320\121\126\303\216\126\177 -\211\042\063\057\346\205\012\275\245\250\033\066\336\323\334\054 -\155\073\307\023\275\131\043\054\346\345\244\367\330\013\355\352 -\220\100\104\250\225\273\223\325\320\200\064\266\106\170\016\037 -\000\223\106\341\356\351\371\354\117\027\002\003\001\000\001\243 -\102\060\100\060\035\006\003\125\035\016\004\026\004\024\145\077 -\307\212\206\306\074\335\074\124\134\065\370\072\355\122\014\107 -\127\310\060\016\006\003\125\035\017\001\001\377\004\004\003\002 -\001\006\060\017\006\003\125\035\023\001\001\377\004\005\060\003 -\001\001\377\060\015\006\011\052\206\110\206\367\015\001\001\013 -\005\000\003\202\001\001\000\052\077\341\361\062\216\256\341\230 -\134\113\136\317\153\036\152\011\322\042\251\022\307\136\127\175 -\163\126\144\200\204\172\223\344\011\271\020\315\237\052\047\341 -\000\167\276\110\310\065\250\201\237\344\270\054\311\177\016\260 -\322\113\067\135\352\271\325\013\136\064\275\364\163\051\303\355 -\046\025\234\176\010\123\212\130\215\320\113\050\337\301\263\337 -\040\363\371\343\343\072\337\314\234\224\330\116\117\303\153\027 -\267\367\162\350\255\146\063\265\045\123\253\340\370\114\251\235 -\375\362\015\272\256\271\331\252\306\153\371\223\273\256\253\270 -\227\074\003\032\272\103\306\226\271\105\162\070\263\247\241\226 -\075\221\173\176\300\041\123\114\207\355\362\013\124\225\121\223 -\325\042\245\015\212\361\223\016\076\124\016\260\330\311\116\334 -\362\061\062\126\352\144\371\352\265\235\026\146\102\162\363\177 -\323\261\061\103\374\244\216\027\361\155\043\253\224\146\370\255 -\373\017\010\156\046\055\177\027\007\011\262\214\373\120\300\237 -\226\215\317\266\375\000\235\132\024\232\277\002\104\365\301\302 -\237\042\136\242\017\241\343 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1" -# Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1,OU=Kamu Sertifikasyon Merkezi - Kamu SM,O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK,L=Gebze - Kocaeli,C=TR -# Serial Number: 1 (0x1) -# Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1,OU=Kamu Sertifikasyon Merkezi - Kamu SM,O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK,L=Gebze - Kocaeli,C=TR -# Not Valid Before: Mon Nov 25 08:25:55 2013 -# Not Valid After : Sun Oct 25 08:25:55 2043 -# Fingerprint (SHA-256): 46:ED:C3:68:90:46:D5:3A:45:3F:B3:10:4A:B8:0D:CA:EC:65:8B:26:60:EA:16:29:DD:7E:86:79:90:64:87:16 -# Fingerprint (SHA1): 31:43:64:9B:EC:CE:27:EC:ED:3A:3F:0B:8F:0D:E4:E8:91:DD:EE:CA -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\061\103\144\233\354\316\047\354\355\072\077\013\217\015\344\350 -\221\335\356\312 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\334\000\201\334\151\057\076\057\260\073\366\075\132\221\216\111 -END -CKA_ISSUER MULTILINE_OCTAL -\060\201\322\061\013\060\011\006\003\125\004\006\023\002\124\122 -\061\030\060\026\006\003\125\004\007\023\017\107\145\142\172\145 -\040\055\040\113\157\143\141\145\154\151\061\102\060\100\006\003 -\125\004\012\023\071\124\165\162\153\151\171\145\040\102\151\154 -\151\155\163\145\154\040\166\145\040\124\145\153\156\157\154\157 -\152\151\153\040\101\162\141\163\164\151\162\155\141\040\113\165 -\162\165\155\165\040\055\040\124\125\102\111\124\101\113\061\055 -\060\053\006\003\125\004\013\023\044\113\141\155\165\040\123\145 -\162\164\151\146\151\153\141\163\171\157\156\040\115\145\162\153 -\145\172\151\040\055\040\113\141\155\165\040\123\115\061\066\060 -\064\006\003\125\004\003\023\055\124\125\102\111\124\101\113\040 -\113\141\155\165\040\123\115\040\123\123\114\040\113\157\153\040 -\123\145\162\164\151\146\151\153\141\163\151\040\055\040\123\165 -\162\165\155\040\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\001 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "GDCA TrustAUTH R5 ROOT" -# -# Issuer: CN=GDCA TrustAUTH R5 ROOT,O="GUANG DONG CERTIFICATE AUTHORITY CO.,LTD.",C=CN -# Serial Number:7d:09:97:fe:f0:47:ea:7a -# Subject: CN=GDCA TrustAUTH R5 ROOT,O="GUANG DONG CERTIFICATE AUTHORITY CO.,LTD.",C=CN -# Not Valid Before: Wed Nov 26 05:13:15 2014 -# Not Valid After : Mon Dec 31 15:59:59 2040 -# Fingerprint (SHA-256): BF:FF:8F:D0:44:33:48:7D:6A:8A:A6:0C:1A:29:76:7A:9F:C2:BB:B0:5E:42:0F:71:3A:13:B9:92:89:1D:38:93 -# Fingerprint (SHA1): 0F:36:38:5B:81:1A:25:C3:9B:31:4E:83:CA:E9:34:66:70:CC:74:B4 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "GDCA TrustAUTH R5 ROOT" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\142\061\013\060\011\006\003\125\004\006\023\002\103\116\061 -\062\060\060\006\003\125\004\012\014\051\107\125\101\116\107\040 -\104\117\116\107\040\103\105\122\124\111\106\111\103\101\124\105 -\040\101\125\124\110\117\122\111\124\131\040\103\117\056\054\114 -\124\104\056\061\037\060\035\006\003\125\004\003\014\026\107\104 -\103\101\040\124\162\165\163\164\101\125\124\110\040\122\065\040 -\122\117\117\124 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\142\061\013\060\011\006\003\125\004\006\023\002\103\116\061 -\062\060\060\006\003\125\004\012\014\051\107\125\101\116\107\040 -\104\117\116\107\040\103\105\122\124\111\106\111\103\101\124\105 -\040\101\125\124\110\117\122\111\124\131\040\103\117\056\054\114 -\124\104\056\061\037\060\035\006\003\125\004\003\014\026\107\104 -\103\101\040\124\162\165\163\164\101\125\124\110\040\122\065\040 -\122\117\117\124 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\010\175\011\227\376\360\107\352\172 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\210\060\202\003\160\240\003\002\001\002\002\010\175 -\011\227\376\360\107\352\172\060\015\006\011\052\206\110\206\367 -\015\001\001\013\005\000\060\142\061\013\060\011\006\003\125\004 -\006\023\002\103\116\061\062\060\060\006\003\125\004\012\014\051 -\107\125\101\116\107\040\104\117\116\107\040\103\105\122\124\111 -\106\111\103\101\124\105\040\101\125\124\110\117\122\111\124\131 -\040\103\117\056\054\114\124\104\056\061\037\060\035\006\003\125 -\004\003\014\026\107\104\103\101\040\124\162\165\163\164\101\125 -\124\110\040\122\065\040\122\117\117\124\060\036\027\015\061\064 -\061\061\062\066\060\065\061\063\061\065\132\027\015\064\060\061 -\062\063\061\061\065\065\071\065\071\132\060\142\061\013\060\011 -\006\003\125\004\006\023\002\103\116\061\062\060\060\006\003\125 -\004\012\014\051\107\125\101\116\107\040\104\117\116\107\040\103 -\105\122\124\111\106\111\103\101\124\105\040\101\125\124\110\117 -\122\111\124\131\040\103\117\056\054\114\124\104\056\061\037\060 -\035\006\003\125\004\003\014\026\107\104\103\101\040\124\162\165 -\163\164\101\125\124\110\040\122\065\040\122\117\117\124\060\202 -\002\042\060\015\006\011\052\206\110\206\367\015\001\001\001\005 -\000\003\202\002\017\000\060\202\002\012\002\202\002\001\000\331 -\243\026\360\310\164\164\167\233\357\063\015\073\006\176\125\374 -\265\140\217\166\206\022\102\175\126\146\076\210\202\355\162\143 -\016\236\213\335\064\054\002\121\121\303\031\375\131\124\204\311 -\361\153\263\114\260\351\350\106\135\070\306\242\247\056\021\127 -\272\202\025\242\234\217\155\260\231\112\012\362\353\211\160\143 -\116\171\304\267\133\275\242\135\261\362\101\002\053\255\251\072 -\243\354\171\012\354\137\072\343\375\357\200\074\255\064\233\032 -\253\210\046\173\126\242\202\206\037\353\065\211\203\177\137\256 -\051\116\075\266\156\354\256\301\360\047\233\256\343\364\354\357 -\256\177\367\206\075\162\172\353\245\373\131\116\247\353\225\214 -\042\071\171\341\055\010\217\314\274\221\270\101\367\024\301\043 -\251\303\255\232\105\104\263\262\327\054\315\306\051\342\120\020 -\256\134\313\202\216\027\030\066\175\227\346\210\232\260\115\064 -\011\364\054\271\132\146\052\260\027\233\236\036\166\235\112\146 -\061\101\337\077\373\305\006\357\033\266\176\032\106\066\367\144 -\143\073\343\071\030\043\347\147\165\024\325\165\127\222\067\275 -\276\152\033\046\120\362\066\046\006\220\305\160\001\144\155\166 -\146\341\221\333\156\007\300\141\200\056\262\056\057\214\160\247 -\321\073\074\263\221\344\156\266\304\073\160\362\154\222\227\011 -\315\107\175\030\300\363\273\236\017\326\213\256\007\266\132\017 -\316\013\014\107\247\345\076\270\275\175\307\233\065\240\141\227 -\072\101\165\027\314\053\226\167\052\222\041\036\331\225\166\040 -\147\150\317\015\275\337\326\037\011\152\232\342\314\163\161\244 -\057\175\022\200\267\123\060\106\136\113\124\231\017\147\311\245 -\310\362\040\301\202\354\235\021\337\302\002\373\032\073\321\355 -\040\232\357\145\144\222\020\015\052\342\336\160\361\030\147\202 -\214\141\336\270\274\321\057\234\373\017\320\053\355\033\166\271 -\344\071\125\370\370\241\035\270\252\200\000\114\202\347\262\177 -\011\270\274\060\240\057\015\365\122\236\216\367\222\263\012\000 -\035\000\124\227\006\340\261\007\331\307\017\134\145\175\074\155 -\131\127\344\355\245\215\351\100\123\237\025\113\240\161\366\032 -\041\343\332\160\006\041\130\024\207\205\167\171\252\202\171\002 -\003\001\000\001\243\102\060\100\060\035\006\003\125\035\016\004 -\026\004\024\342\311\100\237\115\316\350\232\241\174\317\016\077 -\145\305\051\210\152\031\121\060\017\006\003\125\035\023\001\001 -\377\004\005\060\003\001\001\377\060\016\006\003\125\035\017\001 -\001\377\004\004\003\002\001\206\060\015\006\011\052\206\110\206 -\367\015\001\001\013\005\000\003\202\002\001\000\321\111\127\340 -\247\314\150\130\272\001\017\053\031\315\215\260\141\105\254\021 -\355\143\120\151\370\037\177\276\026\217\375\235\353\013\252\062 -\107\166\322\147\044\355\275\174\063\062\227\052\307\005\206\146 -\015\027\175\024\025\033\324\353\375\037\232\366\136\227\151\267 -\032\045\244\012\263\221\077\137\066\254\213\354\127\250\076\347 -\201\212\030\127\071\205\164\032\102\307\351\133\023\137\217\371 -\010\351\222\164\215\365\107\322\253\073\326\373\170\146\116\066 -\175\371\351\222\351\004\336\375\111\143\374\155\373\024\161\223 -\147\057\107\112\267\271\377\036\052\163\160\106\060\277\132\362 -\057\171\245\341\215\014\331\371\262\143\067\214\067\145\205\160 -\152\134\133\011\162\271\255\143\074\261\335\370\374\062\277\067 -\206\344\273\216\230\047\176\272\037\026\341\160\021\362\003\337 -\045\142\062\047\046\030\062\204\237\377\000\072\023\272\232\115 -\364\117\270\024\160\042\261\312\053\220\316\051\301\160\364\057 -\235\177\362\220\036\326\132\337\267\106\374\346\206\372\313\340 -\040\166\172\272\246\313\365\174\336\142\245\261\213\356\336\202 -\146\212\116\072\060\037\077\200\313\255\047\272\014\136\327\320 -\261\126\312\167\161\262\265\165\241\120\251\100\103\027\302\050 -\331\317\122\213\133\310\143\324\102\076\240\063\172\106\056\367 -\012\040\106\124\176\152\117\061\361\201\176\102\164\070\145\163 -\047\356\306\174\270\216\327\245\072\327\230\241\234\214\020\125 -\323\333\113\354\100\220\362\315\156\127\322\142\016\174\127\223 -\261\247\155\315\235\203\273\052\347\345\266\073\161\130\255\375 -\321\105\274\132\221\356\123\025\157\323\105\011\165\156\272\220 -\135\036\004\317\067\337\036\250\146\261\214\346\040\152\357\374 -\110\116\164\230\102\257\051\157\056\152\307\373\175\321\146\061 -\042\314\206\000\176\146\203\014\102\364\275\064\222\303\032\352 -\117\312\176\162\115\013\160\214\246\110\273\246\241\024\366\373 -\130\104\231\024\256\252\013\223\151\240\051\045\112\245\313\053 -\335\212\146\007\026\170\025\127\161\033\354\365\107\204\363\236 -\061\067\172\325\177\044\255\344\274\375\375\314\156\203\350\014 -\250\267\101\154\007\335\275\074\206\227\057\322 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "GDCA TrustAUTH R5 ROOT" -# Issuer: CN=GDCA TrustAUTH R5 ROOT,O="GUANG DONG CERTIFICATE AUTHORITY CO.,LTD.",C=CN -# Serial Number:7d:09:97:fe:f0:47:ea:7a -# Subject: CN=GDCA TrustAUTH R5 ROOT,O="GUANG DONG CERTIFICATE AUTHORITY CO.,LTD.",C=CN -# Not Valid Before: Wed Nov 26 05:13:15 2014 -# Not Valid After : Mon Dec 31 15:59:59 2040 -# Fingerprint (SHA-256): BF:FF:8F:D0:44:33:48:7D:6A:8A:A6:0C:1A:29:76:7A:9F:C2:BB:B0:5E:42:0F:71:3A:13:B9:92:89:1D:38:93 -# Fingerprint (SHA1): 0F:36:38:5B:81:1A:25:C3:9B:31:4E:83:CA:E9:34:66:70:CC:74:B4 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "GDCA TrustAUTH R5 ROOT" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\017\066\070\133\201\032\045\303\233\061\116\203\312\351\064\146 -\160\314\164\264 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\143\314\331\075\064\065\134\157\123\243\342\010\160\110\037\264 -END -CKA_ISSUER MULTILINE_OCTAL -\060\142\061\013\060\011\006\003\125\004\006\023\002\103\116\061 -\062\060\060\006\003\125\004\012\014\051\107\125\101\116\107\040 -\104\117\116\107\040\103\105\122\124\111\106\111\103\101\124\105 -\040\101\125\124\110\117\122\111\124\131\040\103\117\056\054\114 -\124\104\056\061\037\060\035\006\003\125\004\003\014\026\107\104 -\103\101\040\124\162\165\163\164\101\125\124\110\040\122\065\040 -\122\117\117\124 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\010\175\011\227\376\360\107\352\172 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "SSL.com Root Certification Authority RSA" -# -# Issuer: CN=SSL.com Root Certification Authority RSA,O=SSL Corporation,L=Houston,ST=Texas,C=US -# Serial Number:7b:2c:9b:d3:16:80:32:99 -# Subject: CN=SSL.com Root Certification Authority RSA,O=SSL Corporation,L=Houston,ST=Texas,C=US -# Not Valid Before: Fri Feb 12 17:39:39 2016 -# Not Valid After : Tue Feb 12 17:39:39 2041 -# Fingerprint (SHA-256): 85:66:6A:56:2E:E0:BE:5C:E9:25:C1:D8:89:0A:6F:76:A8:7E:C1:6D:4D:7D:5F:29:EA:74:19:CF:20:12:3B:69 -# Fingerprint (SHA1): B7:AB:33:08:D1:EA:44:77:BA:14:80:12:5A:6F:BD:A9:36:49:0C:BB -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "SSL.com Root Certification Authority RSA" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\174\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\016\060\014\006\003\125\004\010\014\005\124\145\170\141\163\061 -\020\060\016\006\003\125\004\007\014\007\110\157\165\163\164\157 -\156\061\030\060\026\006\003\125\004\012\014\017\123\123\114\040 -\103\157\162\160\157\162\141\164\151\157\156\061\061\060\057\006 -\003\125\004\003\014\050\123\123\114\056\143\157\155\040\122\157 -\157\164\040\103\145\162\164\151\146\151\143\141\164\151\157\156 -\040\101\165\164\150\157\162\151\164\171\040\122\123\101 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\174\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\016\060\014\006\003\125\004\010\014\005\124\145\170\141\163\061 -\020\060\016\006\003\125\004\007\014\007\110\157\165\163\164\157 -\156\061\030\060\026\006\003\125\004\012\014\017\123\123\114\040 -\103\157\162\160\157\162\141\164\151\157\156\061\061\060\057\006 -\003\125\004\003\014\050\123\123\114\056\143\157\155\040\122\157 -\157\164\040\103\145\162\164\151\146\151\143\141\164\151\157\156 -\040\101\165\164\150\157\162\151\164\171\040\122\123\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\010\173\054\233\323\026\200\062\231 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\335\060\202\003\305\240\003\002\001\002\002\010\173 -\054\233\323\026\200\062\231\060\015\006\011\052\206\110\206\367 -\015\001\001\013\005\000\060\174\061\013\060\011\006\003\125\004 -\006\023\002\125\123\061\016\060\014\006\003\125\004\010\014\005 -\124\145\170\141\163\061\020\060\016\006\003\125\004\007\014\007 -\110\157\165\163\164\157\156\061\030\060\026\006\003\125\004\012 -\014\017\123\123\114\040\103\157\162\160\157\162\141\164\151\157 -\156\061\061\060\057\006\003\125\004\003\014\050\123\123\114\056 -\143\157\155\040\122\157\157\164\040\103\145\162\164\151\146\151 -\143\141\164\151\157\156\040\101\165\164\150\157\162\151\164\171 -\040\122\123\101\060\036\027\015\061\066\060\062\061\062\061\067 -\063\071\063\071\132\027\015\064\061\060\062\061\062\061\067\063 -\071\063\071\132\060\174\061\013\060\011\006\003\125\004\006\023 -\002\125\123\061\016\060\014\006\003\125\004\010\014\005\124\145 -\170\141\163\061\020\060\016\006\003\125\004\007\014\007\110\157 -\165\163\164\157\156\061\030\060\026\006\003\125\004\012\014\017 -\123\123\114\040\103\157\162\160\157\162\141\164\151\157\156\061 -\061\060\057\006\003\125\004\003\014\050\123\123\114\056\143\157 -\155\040\122\157\157\164\040\103\145\162\164\151\146\151\143\141 -\164\151\157\156\040\101\165\164\150\157\162\151\164\171\040\122 -\123\101\060\202\002\042\060\015\006\011\052\206\110\206\367\015 -\001\001\001\005\000\003\202\002\017\000\060\202\002\012\002\202 -\002\001\000\371\017\335\243\053\175\313\320\052\376\354\147\205 -\246\347\056\033\272\167\341\343\365\257\244\354\372\112\135\221 -\304\127\107\153\030\167\153\166\362\375\223\344\075\017\302\026 -\236\013\146\303\126\224\236\027\203\205\316\126\357\362\026\375 -\000\142\365\042\011\124\350\145\027\116\101\271\340\117\106\227 -\252\033\310\270\156\142\136\151\261\137\333\052\002\176\374\154 -\312\363\101\330\355\320\350\374\077\141\110\355\260\003\024\035 -\020\016\113\031\340\273\116\354\206\145\377\066\363\136\147\002 -\013\235\206\125\141\375\172\070\355\376\342\031\000\267\157\241 -\120\142\165\164\074\240\372\310\045\222\264\156\172\042\307\370 -\036\241\343\262\335\221\061\253\053\035\004\377\245\112\004\067 -\351\205\244\063\053\375\342\326\125\064\174\031\244\112\150\307 -\262\250\323\267\312\241\223\210\353\301\227\274\214\371\035\331 -\042\204\044\164\307\004\075\152\251\051\223\314\353\270\133\341 -\376\137\045\252\064\130\310\301\043\124\235\033\230\021\303\070 -\234\176\075\206\154\245\017\100\206\174\002\364\134\002\117\050 -\313\256\161\237\017\072\310\063\376\021\045\065\352\374\272\305 -\140\075\331\174\030\325\262\251\323\165\170\003\162\042\312\072 -\303\037\357\054\345\056\251\372\236\054\266\121\106\375\257\003 -\326\352\140\150\352\205\026\066\153\205\351\036\300\263\335\304 -\044\334\200\052\201\101\155\224\076\310\340\311\201\101\000\236 -\136\277\177\305\010\230\242\030\054\102\100\263\371\157\070\047 -\113\116\200\364\075\201\107\340\210\174\352\034\316\265\165\134 -\121\056\034\053\177\032\162\050\347\000\265\321\164\306\327\344 -\237\255\007\223\266\123\065\065\374\067\344\303\366\135\026\276 -\041\163\336\222\012\370\240\143\152\274\226\222\152\076\370\274 -\145\125\233\336\365\015\211\046\004\374\045\032\246\045\151\313 -\302\155\312\174\342\131\137\227\254\353\357\056\310\274\327\033 -\131\074\053\314\362\031\310\223\153\047\143\031\317\374\351\046 -\370\312\161\233\177\223\376\064\147\204\116\231\353\374\263\170 -\011\063\160\272\146\246\166\355\033\163\353\032\245\015\304\042 -\023\040\224\126\012\116\054\154\116\261\375\317\234\011\272\242 -\063\355\207\002\003\001\000\001\243\143\060\141\060\035\006\003 -\125\035\016\004\026\004\024\335\004\011\007\242\365\172\175\122 -\123\022\222\225\356\070\200\045\015\246\131\060\017\006\003\125 -\035\023\001\001\377\004\005\060\003\001\001\377\060\037\006\003 -\125\035\043\004\030\060\026\200\024\335\004\011\007\242\365\172 -\175\122\123\022\222\225\356\070\200\045\015\246\131\060\016\006 -\003\125\035\017\001\001\377\004\004\003\002\001\206\060\015\006 -\011\052\206\110\206\367\015\001\001\013\005\000\003\202\002\001 -\000\040\030\021\224\051\373\046\235\034\036\036\160\141\361\225 -\162\223\161\044\255\150\223\130\216\062\257\033\263\160\003\374 -\045\053\164\205\220\075\170\152\364\271\213\245\227\073\265\030 -\221\273\036\247\371\100\133\221\371\125\231\257\036\021\320\134 -\035\247\146\343\261\224\007\014\062\071\246\352\033\260\171\330 -\035\234\160\104\343\212\335\304\371\225\037\212\070\103\077\001 -\205\245\107\247\075\106\262\274\345\042\150\367\173\234\330\054 -\076\012\041\310\055\063\254\277\305\201\231\061\164\301\165\161 -\305\276\261\360\043\105\364\235\153\374\031\143\235\243\274\004 -\306\030\013\045\273\123\211\017\263\200\120\336\105\356\104\177 -\253\224\170\144\230\323\366\050\335\207\330\160\145\164\373\016 -\271\023\353\247\017\141\251\062\226\314\336\273\355\143\114\030 -\273\251\100\367\240\124\156\040\210\161\165\030\352\172\264\064 -\162\340\043\047\167\134\266\220\352\206\045\100\253\357\063\017 -\313\237\202\276\242\040\373\366\265\055\032\346\302\205\261\164 -\017\373\310\145\002\244\122\001\107\335\111\042\301\277\330\353 -\153\254\176\336\354\143\063\025\267\043\010\217\306\017\215\101 -\132\335\216\305\271\217\345\105\077\170\333\272\322\033\100\261 -\376\161\115\077\340\201\242\272\136\264\354\025\340\223\335\010 -\037\176\341\125\231\013\041\336\223\236\012\373\346\243\111\275 -\066\060\376\347\167\262\240\165\227\265\055\201\210\027\145\040 -\367\332\220\000\237\311\122\314\062\312\065\174\365\075\017\330 -\053\327\365\046\154\311\006\064\226\026\352\160\131\032\062\171 -\171\013\266\210\177\017\122\110\075\277\154\330\242\104\056\321 -\116\267\162\130\323\211\023\225\376\104\253\370\327\213\033\156 -\234\274\054\240\133\325\152\000\257\137\067\341\325\372\020\013 -\230\234\206\347\046\217\316\360\354\156\212\127\013\200\343\116 -\262\300\240\143\141\220\272\125\150\067\164\152\266\222\333\237 -\241\206\042\266\145\047\016\354\266\237\102\140\344\147\302\265 -\332\101\013\304\323\213\141\033\274\372\037\221\053\327\104\007 -\136\272\051\254\331\305\351\357\123\110\132\353\200\361\050\130 -\041\315\260\006\125\373\047\077\123\220\160\251\004\036\127\047 -\271 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "SSL.com Root Certification Authority RSA" -# Issuer: CN=SSL.com Root Certification Authority RSA,O=SSL Corporation,L=Houston,ST=Texas,C=US -# Serial Number:7b:2c:9b:d3:16:80:32:99 -# Subject: CN=SSL.com Root Certification Authority RSA,O=SSL Corporation,L=Houston,ST=Texas,C=US -# Not Valid Before: Fri Feb 12 17:39:39 2016 -# Not Valid After : Tue Feb 12 17:39:39 2041 -# Fingerprint (SHA-256): 85:66:6A:56:2E:E0:BE:5C:E9:25:C1:D8:89:0A:6F:76:A8:7E:C1:6D:4D:7D:5F:29:EA:74:19:CF:20:12:3B:69 -# Fingerprint (SHA1): B7:AB:33:08:D1:EA:44:77:BA:14:80:12:5A:6F:BD:A9:36:49:0C:BB -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "SSL.com Root Certification Authority RSA" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\267\253\063\010\321\352\104\167\272\024\200\022\132\157\275\251 -\066\111\014\273 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\206\151\022\300\160\361\354\254\254\302\325\274\245\133\241\051 -END -CKA_ISSUER MULTILINE_OCTAL -\060\174\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\016\060\014\006\003\125\004\010\014\005\124\145\170\141\163\061 -\020\060\016\006\003\125\004\007\014\007\110\157\165\163\164\157 -\156\061\030\060\026\006\003\125\004\012\014\017\123\123\114\040 -\103\157\162\160\157\162\141\164\151\157\156\061\061\060\057\006 -\003\125\004\003\014\050\123\123\114\056\143\157\155\040\122\157 -\157\164\040\103\145\162\164\151\146\151\143\141\164\151\157\156 -\040\101\165\164\150\157\162\151\164\171\040\122\123\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\010\173\054\233\323\026\200\062\231 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "SSL.com Root Certification Authority ECC" -# -# Issuer: CN=SSL.com Root Certification Authority ECC,O=SSL Corporation,L=Houston,ST=Texas,C=US -# Serial Number:75:e6:df:cb:c1:68:5b:a8 -# Subject: CN=SSL.com Root Certification Authority ECC,O=SSL Corporation,L=Houston,ST=Texas,C=US -# Not Valid Before: Fri Feb 12 18:14:03 2016 -# Not Valid After : Tue Feb 12 18:14:03 2041 -# Fingerprint (SHA-256): 34:17:BB:06:CC:60:07:DA:1B:96:1C:92:0B:8A:B4:CE:3F:AD:82:0E:4A:A3:0B:9A:CB:C4:A7:4E:BD:CE:BC:65 -# Fingerprint (SHA1): C3:19:7C:39:24:E6:54:AF:1B:C4:AB:20:95:7A:E2:C3:0E:13:02:6A -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "SSL.com Root Certification Authority ECC" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\174\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\016\060\014\006\003\125\004\010\014\005\124\145\170\141\163\061 -\020\060\016\006\003\125\004\007\014\007\110\157\165\163\164\157 -\156\061\030\060\026\006\003\125\004\012\014\017\123\123\114\040 -\103\157\162\160\157\162\141\164\151\157\156\061\061\060\057\006 -\003\125\004\003\014\050\123\123\114\056\143\157\155\040\122\157 -\157\164\040\103\145\162\164\151\146\151\143\141\164\151\157\156 -\040\101\165\164\150\157\162\151\164\171\040\105\103\103 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\174\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\016\060\014\006\003\125\004\010\014\005\124\145\170\141\163\061 -\020\060\016\006\003\125\004\007\014\007\110\157\165\163\164\157 -\156\061\030\060\026\006\003\125\004\012\014\017\123\123\114\040 -\103\157\162\160\157\162\141\164\151\157\156\061\061\060\057\006 -\003\125\004\003\014\050\123\123\114\056\143\157\155\040\122\157 -\157\164\040\103\145\162\164\151\146\151\143\141\164\151\157\156 -\040\101\165\164\150\157\162\151\164\171\040\105\103\103 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\010\165\346\337\313\301\150\133\250 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\215\060\202\002\024\240\003\002\001\002\002\010\165 -\346\337\313\301\150\133\250\060\012\006\010\052\206\110\316\075 -\004\003\002\060\174\061\013\060\011\006\003\125\004\006\023\002 -\125\123\061\016\060\014\006\003\125\004\010\014\005\124\145\170 -\141\163\061\020\060\016\006\003\125\004\007\014\007\110\157\165 -\163\164\157\156\061\030\060\026\006\003\125\004\012\014\017\123 -\123\114\040\103\157\162\160\157\162\141\164\151\157\156\061\061 -\060\057\006\003\125\004\003\014\050\123\123\114\056\143\157\155 -\040\122\157\157\164\040\103\145\162\164\151\146\151\143\141\164 -\151\157\156\040\101\165\164\150\157\162\151\164\171\040\105\103 -\103\060\036\027\015\061\066\060\062\061\062\061\070\061\064\060 -\063\132\027\015\064\061\060\062\061\062\061\070\061\064\060\063 -\132\060\174\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\016\060\014\006\003\125\004\010\014\005\124\145\170\141\163 -\061\020\060\016\006\003\125\004\007\014\007\110\157\165\163\164 -\157\156\061\030\060\026\006\003\125\004\012\014\017\123\123\114 -\040\103\157\162\160\157\162\141\164\151\157\156\061\061\060\057 -\006\003\125\004\003\014\050\123\123\114\056\143\157\155\040\122 -\157\157\164\040\103\145\162\164\151\146\151\143\141\164\151\157 -\156\040\101\165\164\150\157\162\151\164\171\040\105\103\103\060 -\166\060\020\006\007\052\206\110\316\075\002\001\006\005\053\201 -\004\000\042\003\142\000\004\105\156\251\120\304\246\043\066\236 -\137\050\215\027\313\226\042\144\077\334\172\216\035\314\010\263 -\242\161\044\272\216\111\271\004\033\107\226\130\253\055\225\310 -\355\236\010\065\310\047\353\211\214\123\130\353\142\212\376\360 -\133\017\153\061\122\143\101\073\211\315\354\354\266\215\031\323 -\064\007\334\273\306\006\177\302\105\225\354\313\177\250\043\340 -\011\351\201\372\363\107\323\243\143\060\141\060\035\006\003\125 -\035\016\004\026\004\024\202\321\205\163\060\347\065\004\323\216 -\002\222\373\345\244\321\304\041\350\315\060\017\006\003\125\035 -\023\001\001\377\004\005\060\003\001\001\377\060\037\006\003\125 -\035\043\004\030\060\026\200\024\202\321\205\163\060\347\065\004 -\323\216\002\222\373\345\244\321\304\041\350\315\060\016\006\003 -\125\035\017\001\001\377\004\004\003\002\001\206\060\012\006\010 -\052\206\110\316\075\004\003\002\003\147\000\060\144\002\060\157 -\347\353\131\021\244\140\317\141\260\226\173\355\005\371\057\023 -\221\334\355\345\374\120\153\021\106\106\263\034\041\000\142\273 -\276\303\347\350\315\007\231\371\015\013\135\162\076\304\252\002 -\060\037\274\272\013\342\060\044\373\174\155\200\125\012\231\076 -\200\015\063\345\146\243\263\243\273\245\325\213\217\011\054\246 -\135\176\342\360\007\010\150\155\322\174\151\156\137\337\345\152 -\145 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "SSL.com Root Certification Authority ECC" -# Issuer: CN=SSL.com Root Certification Authority ECC,O=SSL Corporation,L=Houston,ST=Texas,C=US -# Serial Number:75:e6:df:cb:c1:68:5b:a8 -# Subject: CN=SSL.com Root Certification Authority ECC,O=SSL Corporation,L=Houston,ST=Texas,C=US -# Not Valid Before: Fri Feb 12 18:14:03 2016 -# Not Valid After : Tue Feb 12 18:14:03 2041 -# Fingerprint (SHA-256): 34:17:BB:06:CC:60:07:DA:1B:96:1C:92:0B:8A:B4:CE:3F:AD:82:0E:4A:A3:0B:9A:CB:C4:A7:4E:BD:CE:BC:65 -# Fingerprint (SHA1): C3:19:7C:39:24:E6:54:AF:1B:C4:AB:20:95:7A:E2:C3:0E:13:02:6A -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "SSL.com Root Certification Authority ECC" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\303\031\174\071\044\346\124\257\033\304\253\040\225\172\342\303 -\016\023\002\152 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\056\332\344\071\177\234\217\067\321\160\237\046\027\121\072\216 -END -CKA_ISSUER MULTILINE_OCTAL -\060\174\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\016\060\014\006\003\125\004\010\014\005\124\145\170\141\163\061 -\020\060\016\006\003\125\004\007\014\007\110\157\165\163\164\157 -\156\061\030\060\026\006\003\125\004\012\014\017\123\123\114\040 -\103\157\162\160\157\162\141\164\151\157\156\061\061\060\057\006 -\003\125\004\003\014\050\123\123\114\056\143\157\155\040\122\157 -\157\164\040\103\145\162\164\151\146\151\143\141\164\151\157\156 -\040\101\165\164\150\157\162\151\164\171\040\105\103\103 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\010\165\346\337\313\301\150\133\250 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "SSL.com EV Root Certification Authority RSA R2" -# -# Issuer: CN=SSL.com EV Root Certification Authority RSA R2,O=SSL Corporation,L=Houston,ST=Texas,C=US -# Serial Number:56:b6:29:cd:34:bc:78:f6 -# Subject: CN=SSL.com EV Root Certification Authority RSA R2,O=SSL Corporation,L=Houston,ST=Texas,C=US -# Not Valid Before: Wed May 31 18:14:37 2017 -# Not Valid After : Fri May 30 18:14:37 2042 -# Fingerprint (SHA-256): 2E:7B:F1:6C:C2:24:85:A7:BB:E2:AA:86:96:75:07:61:B0:AE:39:BE:3B:2F:E9:D0:CC:6D:4E:F7:34:91:42:5C -# Fingerprint (SHA1): 74:3A:F0:52:9B:D0:32:A0:F4:4A:83:CD:D4:BA:A9:7B:7C:2E:C4:9A -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "SSL.com EV Root Certification Authority RSA R2" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\201\202\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\016\060\014\006\003\125\004\010\014\005\124\145\170\141\163 -\061\020\060\016\006\003\125\004\007\014\007\110\157\165\163\164 -\157\156\061\030\060\026\006\003\125\004\012\014\017\123\123\114 -\040\103\157\162\160\157\162\141\164\151\157\156\061\067\060\065 -\006\003\125\004\003\014\056\123\123\114\056\143\157\155\040\105 -\126\040\122\157\157\164\040\103\145\162\164\151\146\151\143\141 -\164\151\157\156\040\101\165\164\150\157\162\151\164\171\040\122 -\123\101\040\122\062 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\201\202\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\016\060\014\006\003\125\004\010\014\005\124\145\170\141\163 -\061\020\060\016\006\003\125\004\007\014\007\110\157\165\163\164 -\157\156\061\030\060\026\006\003\125\004\012\014\017\123\123\114 -\040\103\157\162\160\157\162\141\164\151\157\156\061\067\060\065 -\006\003\125\004\003\014\056\123\123\114\056\143\157\155\040\105 -\126\040\122\157\157\164\040\103\145\162\164\151\146\151\143\141 -\164\151\157\156\040\101\165\164\150\157\162\151\164\171\040\122 -\123\101\040\122\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\010\126\266\051\315\064\274\170\366 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\353\060\202\003\323\240\003\002\001\002\002\010\126 -\266\051\315\064\274\170\366\060\015\006\011\052\206\110\206\367 -\015\001\001\013\005\000\060\201\202\061\013\060\011\006\003\125 -\004\006\023\002\125\123\061\016\060\014\006\003\125\004\010\014 -\005\124\145\170\141\163\061\020\060\016\006\003\125\004\007\014 -\007\110\157\165\163\164\157\156\061\030\060\026\006\003\125\004 -\012\014\017\123\123\114\040\103\157\162\160\157\162\141\164\151 -\157\156\061\067\060\065\006\003\125\004\003\014\056\123\123\114 -\056\143\157\155\040\105\126\040\122\157\157\164\040\103\145\162 -\164\151\146\151\143\141\164\151\157\156\040\101\165\164\150\157 -\162\151\164\171\040\122\123\101\040\122\062\060\036\027\015\061 -\067\060\065\063\061\061\070\061\064\063\067\132\027\015\064\062 -\060\065\063\060\061\070\061\064\063\067\132\060\201\202\061\013 -\060\011\006\003\125\004\006\023\002\125\123\061\016\060\014\006 -\003\125\004\010\014\005\124\145\170\141\163\061\020\060\016\006 -\003\125\004\007\014\007\110\157\165\163\164\157\156\061\030\060 -\026\006\003\125\004\012\014\017\123\123\114\040\103\157\162\160 -\157\162\141\164\151\157\156\061\067\060\065\006\003\125\004\003 -\014\056\123\123\114\056\143\157\155\040\105\126\040\122\157\157 -\164\040\103\145\162\164\151\146\151\143\141\164\151\157\156\040 -\101\165\164\150\157\162\151\164\171\040\122\123\101\040\122\062 -\060\202\002\042\060\015\006\011\052\206\110\206\367\015\001\001 -\001\005\000\003\202\002\017\000\060\202\002\012\002\202\002\001 -\000\217\066\145\100\341\326\115\300\327\264\351\106\332\153\352 -\063\107\315\114\371\175\175\276\275\055\075\360\333\170\341\206 -\245\331\272\011\127\150\355\127\076\240\320\010\101\203\347\050 -\101\044\037\343\162\025\320\001\032\373\136\160\043\262\313\237 -\071\343\317\305\116\306\222\155\046\306\173\273\263\332\047\235 -\012\206\351\201\067\005\376\360\161\161\354\303\034\351\143\242 -\027\024\235\357\033\147\323\205\125\002\002\326\111\311\314\132 -\341\261\367\157\062\237\311\324\073\210\101\250\234\275\313\253 -\333\155\173\011\037\242\114\162\220\332\053\010\374\317\074\124 -\316\147\017\250\317\135\226\031\013\304\343\162\353\255\321\175 -\035\047\357\222\353\020\277\133\353\073\257\317\200\335\301\322 -\226\004\133\172\176\244\251\074\070\166\244\142\216\240\071\136 -\352\167\317\135\000\131\217\146\054\076\007\242\243\005\046\021 -\151\227\352\205\267\017\226\013\113\310\100\341\120\272\056\212 -\313\367\017\232\042\347\177\232\067\023\315\362\115\023\153\041 -\321\300\314\042\362\241\106\366\104\151\234\312\141\065\007\000 -\157\326\141\010\021\352\272\270\366\351\263\140\345\115\271\354 -\237\024\146\311\127\130\333\315\207\151\370\212\206\022\003\107 -\277\146\023\166\254\167\175\064\044\205\203\315\327\252\234\220 -\032\237\041\054\177\170\267\144\270\330\350\246\364\170\263\125 -\313\204\322\062\304\170\256\243\217\141\335\316\010\123\255\354 -\210\374\025\344\232\015\346\237\032\167\316\114\217\270\024\025 -\075\142\234\206\070\006\000\146\022\344\131\166\132\123\300\002 -\230\242\020\053\150\104\173\216\171\316\063\112\166\252\133\201 -\026\033\265\212\330\320\000\173\136\142\264\011\326\206\143\016 -\246\005\225\111\272\050\213\210\223\262\064\034\330\244\125\156 -\267\034\320\336\231\125\073\043\364\042\340\371\051\146\046\354 -\040\120\167\333\112\013\217\276\345\002\140\160\101\136\324\256 -\120\071\042\024\046\313\262\073\163\164\125\107\007\171\201\071 -\250\060\023\104\345\004\212\256\226\023\045\102\017\271\123\304 -\233\374\315\344\034\336\074\372\253\326\006\112\037\147\246\230 -\060\034\335\054\333\334\030\225\127\146\306\377\134\213\126\365 -\167\002\003\001\000\001\243\143\060\141\060\017\006\003\125\035 -\023\001\001\377\004\005\060\003\001\001\377\060\037\006\003\125 -\035\043\004\030\060\026\200\024\371\140\273\324\343\325\064\366 -\270\365\006\200\045\247\163\333\106\151\250\236\060\035\006\003 -\125\035\016\004\026\004\024\371\140\273\324\343\325\064\366\270 -\365\006\200\045\247\163\333\106\151\250\236\060\016\006\003\125 -\035\017\001\001\377\004\004\003\002\001\206\060\015\006\011\052 -\206\110\206\367\015\001\001\013\005\000\003\202\002\001\000\126 -\263\216\313\012\235\111\216\277\244\304\221\273\146\027\005\121 -\230\165\373\345\120\054\172\236\361\024\372\253\323\212\076\377 -\221\051\217\143\213\330\264\251\124\001\015\276\223\206\057\371 -\112\155\307\136\365\127\371\312\125\034\022\276\107\017\066\305 -\337\152\267\333\165\302\107\045\177\271\361\143\370\150\055\125 -\004\321\362\215\260\244\317\274\074\136\037\170\347\245\240\040 -\160\260\004\305\267\367\162\247\336\042\015\275\063\045\106\214 -\144\222\046\343\076\056\143\226\332\233\214\075\370\030\011\327 -\003\314\175\206\202\340\312\004\007\121\120\327\377\222\325\014 -\357\332\206\237\231\327\353\267\257\150\342\071\046\224\272\150 -\267\277\203\323\352\172\147\075\142\147\256\045\345\162\350\342 -\344\354\256\022\366\113\053\074\237\351\260\100\363\070\124\263 -\375\267\150\310\332\306\217\121\074\262\373\221\334\034\347\233 -\235\341\267\015\162\217\342\244\304\251\170\371\353\024\254\306 -\103\005\302\145\071\050\030\002\303\202\262\235\005\276\145\355 -\226\137\145\164\074\373\011\065\056\173\234\023\375\033\017\135 -\307\155\201\072\126\017\314\073\341\257\002\057\042\254\106\312 -\106\074\240\034\114\326\104\264\136\056\134\025\146\011\341\046 -\051\376\306\122\141\272\261\163\377\303\014\234\345\154\152\224 -\077\024\312\100\026\225\204\363\131\251\254\137\114\141\223\155 -\321\073\314\242\225\014\042\246\147\147\104\056\271\331\322\212 -\101\263\146\013\132\373\175\043\245\362\032\260\377\336\233\203 -\224\056\321\077\337\222\267\221\257\005\073\145\307\240\154\261 -\315\142\022\303\220\033\343\045\316\064\274\157\167\166\261\020 -\303\367\005\032\300\326\257\164\142\110\027\167\222\151\220\141 -\034\336\225\200\164\124\217\030\034\303\363\003\320\277\244\103 -\165\206\123\030\172\012\056\011\034\066\237\221\375\202\212\042 -\113\321\016\120\045\335\313\003\014\027\311\203\000\010\116\065 -\115\212\213\355\360\002\224\146\054\104\177\313\225\047\226\027 -\255\011\060\254\266\161\027\156\213\027\366\034\011\324\055\073 -\230\245\161\323\124\023\331\140\363\365\113\146\117\372\361\356 -\040\022\215\264\254\127\261\105\143\241\254\166\251\302\373 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "SSL.com EV Root Certification Authority RSA R2" -# Issuer: CN=SSL.com EV Root Certification Authority RSA R2,O=SSL Corporation,L=Houston,ST=Texas,C=US -# Serial Number:56:b6:29:cd:34:bc:78:f6 -# Subject: CN=SSL.com EV Root Certification Authority RSA R2,O=SSL Corporation,L=Houston,ST=Texas,C=US -# Not Valid Before: Wed May 31 18:14:37 2017 -# Not Valid After : Fri May 30 18:14:37 2042 -# Fingerprint (SHA-256): 2E:7B:F1:6C:C2:24:85:A7:BB:E2:AA:86:96:75:07:61:B0:AE:39:BE:3B:2F:E9:D0:CC:6D:4E:F7:34:91:42:5C -# Fingerprint (SHA1): 74:3A:F0:52:9B:D0:32:A0:F4:4A:83:CD:D4:BA:A9:7B:7C:2E:C4:9A -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "SSL.com EV Root Certification Authority RSA R2" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\164\072\360\122\233\320\062\240\364\112\203\315\324\272\251\173 -\174\056\304\232 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\341\036\061\130\032\256\124\123\002\366\027\152\021\173\115\225 -END -CKA_ISSUER MULTILINE_OCTAL -\060\201\202\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\016\060\014\006\003\125\004\010\014\005\124\145\170\141\163 -\061\020\060\016\006\003\125\004\007\014\007\110\157\165\163\164 -\157\156\061\030\060\026\006\003\125\004\012\014\017\123\123\114 -\040\103\157\162\160\157\162\141\164\151\157\156\061\067\060\065 -\006\003\125\004\003\014\056\123\123\114\056\143\157\155\040\105 -\126\040\122\157\157\164\040\103\145\162\164\151\146\151\143\141 -\164\151\157\156\040\101\165\164\150\157\162\151\164\171\040\122 -\123\101\040\122\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\010\126\266\051\315\064\274\170\366 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "SSL.com EV Root Certification Authority ECC" -# -# Issuer: CN=SSL.com EV Root Certification Authority ECC,O=SSL Corporation,L=Houston,ST=Texas,C=US -# Serial Number:2c:29:9c:5b:16:ed:05:95 -# Subject: CN=SSL.com EV Root Certification Authority ECC,O=SSL Corporation,L=Houston,ST=Texas,C=US -# Not Valid Before: Fri Feb 12 18:15:23 2016 -# Not Valid After : Tue Feb 12 18:15:23 2041 -# Fingerprint (SHA-256): 22:A2:C1:F7:BD:ED:70:4C:C1:E7:01:B5:F4:08:C3:10:88:0F:E9:56:B5:DE:2A:4A:44:F9:9C:87:3A:25:A7:C8 -# Fingerprint (SHA1): 4C:DD:51:A3:D1:F5:20:32:14:B0:C6:C5:32:23:03:91:C7:46:42:6D -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "SSL.com EV Root Certification Authority ECC" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\177\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\016\060\014\006\003\125\004\010\014\005\124\145\170\141\163\061 -\020\060\016\006\003\125\004\007\014\007\110\157\165\163\164\157 -\156\061\030\060\026\006\003\125\004\012\014\017\123\123\114\040 -\103\157\162\160\157\162\141\164\151\157\156\061\064\060\062\006 -\003\125\004\003\014\053\123\123\114\056\143\157\155\040\105\126 -\040\122\157\157\164\040\103\145\162\164\151\146\151\143\141\164 -\151\157\156\040\101\165\164\150\157\162\151\164\171\040\105\103 -\103 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\177\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\016\060\014\006\003\125\004\010\014\005\124\145\170\141\163\061 -\020\060\016\006\003\125\004\007\014\007\110\157\165\163\164\157 -\156\061\030\060\026\006\003\125\004\012\014\017\123\123\114\040 -\103\157\162\160\157\162\141\164\151\157\156\061\064\060\062\006 -\003\125\004\003\014\053\123\123\114\056\143\157\155\040\105\126 -\040\122\157\157\164\040\103\145\162\164\151\146\151\143\141\164 -\151\157\156\040\101\165\164\150\157\162\151\164\171\040\105\103 -\103 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\010\054\051\234\133\026\355\005\225 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\224\060\202\002\032\240\003\002\001\002\002\010\054 -\051\234\133\026\355\005\225\060\012\006\010\052\206\110\316\075 -\004\003\002\060\177\061\013\060\011\006\003\125\004\006\023\002 -\125\123\061\016\060\014\006\003\125\004\010\014\005\124\145\170 -\141\163\061\020\060\016\006\003\125\004\007\014\007\110\157\165 -\163\164\157\156\061\030\060\026\006\003\125\004\012\014\017\123 -\123\114\040\103\157\162\160\157\162\141\164\151\157\156\061\064 -\060\062\006\003\125\004\003\014\053\123\123\114\056\143\157\155 -\040\105\126\040\122\157\157\164\040\103\145\162\164\151\146\151 -\143\141\164\151\157\156\040\101\165\164\150\157\162\151\164\171 -\040\105\103\103\060\036\027\015\061\066\060\062\061\062\061\070 -\061\065\062\063\132\027\015\064\061\060\062\061\062\061\070\061 -\065\062\063\132\060\177\061\013\060\011\006\003\125\004\006\023 -\002\125\123\061\016\060\014\006\003\125\004\010\014\005\124\145 -\170\141\163\061\020\060\016\006\003\125\004\007\014\007\110\157 -\165\163\164\157\156\061\030\060\026\006\003\125\004\012\014\017 -\123\123\114\040\103\157\162\160\157\162\141\164\151\157\156\061 -\064\060\062\006\003\125\004\003\014\053\123\123\114\056\143\157 -\155\040\105\126\040\122\157\157\164\040\103\145\162\164\151\146 -\151\143\141\164\151\157\156\040\101\165\164\150\157\162\151\164 -\171\040\105\103\103\060\166\060\020\006\007\052\206\110\316\075 -\002\001\006\005\053\201\004\000\042\003\142\000\004\252\022\107 -\220\230\033\373\357\303\100\007\203\040\116\361\060\202\242\006 -\321\362\222\206\141\362\366\041\150\312\000\304\307\352\103\000 -\124\206\334\375\037\337\000\270\101\142\134\334\160\026\062\336 -\037\231\324\314\305\007\310\010\037\141\026\007\121\075\175\134 -\007\123\343\065\070\214\337\315\237\331\056\015\112\266\031\056 -\132\160\132\006\355\276\360\241\260\312\320\011\051\243\143\060 -\141\060\035\006\003\125\035\016\004\026\004\024\133\312\136\345 -\336\322\201\252\315\250\055\144\121\266\331\162\233\227\346\117 -\060\017\006\003\125\035\023\001\001\377\004\005\060\003\001\001 -\377\060\037\006\003\125\035\043\004\030\060\026\200\024\133\312 -\136\345\336\322\201\252\315\250\055\144\121\266\331\162\233\227 -\346\117\060\016\006\003\125\035\017\001\001\377\004\004\003\002 -\001\206\060\012\006\010\052\206\110\316\075\004\003\002\003\150 -\000\060\145\002\061\000\212\346\100\211\067\353\351\325\023\331 -\312\324\153\044\363\260\075\207\106\130\032\354\261\337\157\373 -\126\272\160\153\307\070\314\350\261\214\117\017\367\361\147\166 -\016\203\320\036\121\217\002\060\075\366\043\050\046\114\306\140 -\207\223\046\233\262\065\036\272\326\367\074\321\034\316\372\045 -\074\246\032\201\025\133\363\022\017\154\356\145\212\311\207\250 -\371\007\340\142\232\214\134\112 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "SSL.com EV Root Certification Authority ECC" -# Issuer: CN=SSL.com EV Root Certification Authority ECC,O=SSL Corporation,L=Houston,ST=Texas,C=US -# Serial Number:2c:29:9c:5b:16:ed:05:95 -# Subject: CN=SSL.com EV Root Certification Authority ECC,O=SSL Corporation,L=Houston,ST=Texas,C=US -# Not Valid Before: Fri Feb 12 18:15:23 2016 -# Not Valid After : Tue Feb 12 18:15:23 2041 -# Fingerprint (SHA-256): 22:A2:C1:F7:BD:ED:70:4C:C1:E7:01:B5:F4:08:C3:10:88:0F:E9:56:B5:DE:2A:4A:44:F9:9C:87:3A:25:A7:C8 -# Fingerprint (SHA1): 4C:DD:51:A3:D1:F5:20:32:14:B0:C6:C5:32:23:03:91:C7:46:42:6D -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "SSL.com EV Root Certification Authority ECC" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\114\335\121\243\321\365\040\062\024\260\306\305\062\043\003\221 -\307\106\102\155 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\131\123\042\145\203\102\001\124\300\316\102\271\132\174\362\220 -END -CKA_ISSUER MULTILINE_OCTAL -\060\177\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\016\060\014\006\003\125\004\010\014\005\124\145\170\141\163\061 -\020\060\016\006\003\125\004\007\014\007\110\157\165\163\164\157 -\156\061\030\060\026\006\003\125\004\012\014\017\123\123\114\040 -\103\157\162\160\157\162\141\164\151\157\156\061\064\060\062\006 -\003\125\004\003\014\053\123\123\114\056\143\157\155\040\105\126 -\040\122\157\157\164\040\103\145\162\164\151\146\151\143\141\164 -\151\157\156\040\101\165\164\150\157\162\151\164\171\040\105\103 -\103 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\010\054\051\234\133\026\355\005\225 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "GlobalSign Root CA - R6" -# -# Issuer: CN=GlobalSign,O=GlobalSign,OU=GlobalSign Root CA - R6 -# Serial Number:45:e6:bb:03:83:33:c3:85:65:48:e6:ff:45:51 -# Subject: CN=GlobalSign,O=GlobalSign,OU=GlobalSign Root CA - R6 -# Not Valid Before: Wed Dec 10 00:00:00 2014 -# Not Valid After : Sun Dec 10 00:00:00 2034 -# Fingerprint (SHA-256): 2C:AB:EA:FE:37:D0:6C:A2:2A:BA:73:91:C0:03:3D:25:98:29:52:C4:53:64:73:49:76:3A:3A:B5:AD:6C:CF:69 -# Fingerprint (SHA1): 80:94:64:0E:B5:A7:A1:CA:11:9C:1F:DD:D5:9F:81:02:63:A7:FB:D1 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "GlobalSign Root CA - R6" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\114\061\040\060\036\006\003\125\004\013\023\027\107\154\157 -\142\141\154\123\151\147\156\040\122\157\157\164\040\103\101\040 -\055\040\122\066\061\023\060\021\006\003\125\004\012\023\012\107 -\154\157\142\141\154\123\151\147\156\061\023\060\021\006\003\125 -\004\003\023\012\107\154\157\142\141\154\123\151\147\156 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\114\061\040\060\036\006\003\125\004\013\023\027\107\154\157 -\142\141\154\123\151\147\156\040\122\157\157\164\040\103\101\040 -\055\040\122\066\061\023\060\021\006\003\125\004\012\023\012\107 -\154\157\142\141\154\123\151\147\156\061\023\060\021\006\003\125 -\004\003\023\012\107\154\157\142\141\154\123\151\147\156 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\016\105\346\273\003\203\063\303\205\145\110\346\377\105\121 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\203\060\202\003\153\240\003\002\001\002\002\016\105 -\346\273\003\203\063\303\205\145\110\346\377\105\121\060\015\006 -\011\052\206\110\206\367\015\001\001\014\005\000\060\114\061\040 -\060\036\006\003\125\004\013\023\027\107\154\157\142\141\154\123 -\151\147\156\040\122\157\157\164\040\103\101\040\055\040\122\066 -\061\023\060\021\006\003\125\004\012\023\012\107\154\157\142\141 -\154\123\151\147\156\061\023\060\021\006\003\125\004\003\023\012 -\107\154\157\142\141\154\123\151\147\156\060\036\027\015\061\064 -\061\062\061\060\060\060\060\060\060\060\132\027\015\063\064\061 -\062\061\060\060\060\060\060\060\060\132\060\114\061\040\060\036 -\006\003\125\004\013\023\027\107\154\157\142\141\154\123\151\147 -\156\040\122\157\157\164\040\103\101\040\055\040\122\066\061\023 -\060\021\006\003\125\004\012\023\012\107\154\157\142\141\154\123 -\151\147\156\061\023\060\021\006\003\125\004\003\023\012\107\154 -\157\142\141\154\123\151\147\156\060\202\002\042\060\015\006\011 -\052\206\110\206\367\015\001\001\001\005\000\003\202\002\017\000 -\060\202\002\012\002\202\002\001\000\225\007\350\163\312\146\371 -\354\024\312\173\074\367\015\010\361\264\105\013\054\202\264\110 -\306\353\133\074\256\203\270\101\222\063\024\244\157\177\351\052 -\314\306\260\210\153\305\266\211\321\306\262\377\024\316\121\024 -\041\354\112\335\033\132\306\326\207\356\115\072\025\006\355\144 -\146\013\222\200\312\104\336\163\224\116\363\247\211\177\117\170 -\143\010\310\022\120\155\102\146\057\115\271\171\050\115\122\032 -\212\032\200\267\031\201\016\176\304\212\274\144\114\041\034\103 -\150\327\075\074\212\305\262\146\325\220\232\267\061\006\305\276 -\342\155\062\006\246\036\371\271\353\252\243\270\277\276\202\143 -\120\320\360\030\211\337\344\017\171\365\352\242\037\052\322\160 -\056\173\347\274\223\273\155\123\342\110\174\214\020\007\070\377 -\146\262\167\141\176\340\352\214\074\252\264\244\366\363\225\112 -\022\007\155\375\214\262\211\317\320\240\141\167\310\130\164\260 -\324\043\072\367\135\072\312\242\333\235\011\336\135\104\055\220 -\361\201\315\127\222\372\176\274\120\004\143\064\337\153\223\030 -\276\153\066\262\071\344\254\044\066\267\360\357\266\034\023\127 -\223\266\336\262\370\342\205\267\163\242\270\065\252\105\362\340 -\235\066\241\157\124\212\361\162\126\156\056\210\305\121\102\104 -\025\224\356\243\305\070\226\233\116\116\132\013\107\363\006\066 -\111\167\060\274\161\067\345\246\354\041\010\165\374\346\141\026 -\077\167\325\331\221\227\204\012\154\324\002\115\164\300\024\355 -\375\071\373\203\362\136\024\241\004\260\013\351\376\356\217\341 -\156\013\262\010\263\141\146\011\152\261\006\072\145\226\131\300 -\360\065\375\311\332\050\215\032\021\207\160\201\012\250\232\165 -\035\236\072\206\005\000\236\333\200\326\045\371\334\005\236\047 -\131\114\166\071\133\352\371\245\241\330\203\017\321\377\337\060 -\021\371\205\317\063\110\365\312\155\144\024\054\172\130\117\323 -\113\010\111\305\225\144\032\143\016\171\075\365\263\214\312\130 -\255\234\102\105\171\156\016\207\031\134\124\261\145\266\277\214 -\233\334\023\351\015\157\270\056\334\147\156\311\213\021\265\204 -\024\212\000\031\160\203\171\221\227\221\324\032\047\277\067\036 -\062\007\330\024\143\074\050\114\257\002\003\001\000\001\243\143 -\060\141\060\016\006\003\125\035\017\001\001\377\004\004\003\002 -\001\006\060\017\006\003\125\035\023\001\001\377\004\005\060\003 -\001\001\377\060\035\006\003\125\035\016\004\026\004\024\256\154 -\005\243\223\023\342\242\347\342\327\034\326\307\360\177\310\147 -\123\240\060\037\006\003\125\035\043\004\030\060\026\200\024\256 -\154\005\243\223\023\342\242\347\342\327\034\326\307\360\177\310 -\147\123\240\060\015\006\011\052\206\110\206\367\015\001\001\014 -\005\000\003\202\002\001\000\203\045\355\350\321\375\225\122\315 -\236\300\004\240\221\151\346\134\320\204\336\334\255\242\117\350 -\107\170\326\145\230\251\133\250\074\207\174\002\212\321\156\267 -\026\163\346\137\300\124\230\325\164\276\301\315\342\021\221\255 -\043\030\075\335\341\162\104\226\264\225\136\300\173\216\231\170 -\026\103\023\126\127\263\242\263\073\265\167\334\100\162\254\243 -\353\233\065\076\261\010\041\241\347\304\103\067\171\062\276\265 -\347\234\054\114\274\103\051\231\216\060\323\254\041\340\343\035 -\372\330\007\063\166\124\000\042\052\271\115\040\056\160\150\332 -\345\123\374\203\134\323\235\362\377\104\014\104\146\362\322\343 -\275\106\000\032\155\002\272\045\135\215\241\061\121\335\124\106 -\034\115\333\231\226\357\032\034\004\134\246\025\357\170\340\171 -\376\135\333\076\252\114\125\375\232\025\251\157\341\246\373\337 -\160\060\351\303\356\102\106\355\302\223\005\211\372\175\143\173 -\077\320\161\201\174\000\350\230\256\016\170\064\303\045\373\257 -\012\237\040\153\335\073\023\217\022\214\342\101\032\110\172\163 -\240\167\151\307\266\134\177\202\310\036\376\130\033\050\053\250 -\154\255\136\155\300\005\322\173\267\353\200\376\045\067\376\002 -\233\150\254\102\135\303\356\365\314\334\360\120\165\322\066\151 -\234\346\173\004\337\156\006\151\266\336\012\011\110\131\207\353 -\173\024\140\172\144\252\151\103\357\221\307\114\354\030\335\154 -\357\123\055\214\231\341\136\362\162\076\317\124\310\275\147\354 -\244\017\114\105\377\323\271\060\043\007\114\217\020\277\206\226 -\331\231\132\264\231\127\034\244\314\273\025\211\123\272\054\005 -\017\344\304\236\031\261\030\064\325\114\235\272\355\367\037\257 -\044\225\004\170\250\003\273\356\201\345\332\137\174\213\112\241 -\220\164\045\247\263\076\113\310\054\126\275\307\310\357\070\342 -\134\222\360\171\367\234\204\272\164\055\141\001\040\176\176\321 -\362\117\007\131\137\213\055\103\122\353\106\014\224\341\365\146 -\107\171\167\325\124\133\037\255\044\067\313\105\132\116\240\104 -\110\310\330\260\231\305\025\204\011\366\326\111\111\300\145\270 -\346\032\161\156\240\250\361\202\350\105\076\154\326\002\327\012 -\147\203\005\132\311\244\020 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "GlobalSign Root CA - R6" -# Issuer: CN=GlobalSign,O=GlobalSign,OU=GlobalSign Root CA - R6 -# Serial Number:45:e6:bb:03:83:33:c3:85:65:48:e6:ff:45:51 -# Subject: CN=GlobalSign,O=GlobalSign,OU=GlobalSign Root CA - R6 -# Not Valid Before: Wed Dec 10 00:00:00 2014 -# Not Valid After : Sun Dec 10 00:00:00 2034 -# Fingerprint (SHA-256): 2C:AB:EA:FE:37:D0:6C:A2:2A:BA:73:91:C0:03:3D:25:98:29:52:C4:53:64:73:49:76:3A:3A:B5:AD:6C:CF:69 -# Fingerprint (SHA1): 80:94:64:0E:B5:A7:A1:CA:11:9C:1F:DD:D5:9F:81:02:63:A7:FB:D1 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "GlobalSign Root CA - R6" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\200\224\144\016\265\247\241\312\021\234\037\335\325\237\201\002 -\143\247\373\321 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\117\335\007\344\324\042\144\071\036\014\067\102\352\321\306\256 -END -CKA_ISSUER MULTILINE_OCTAL -\060\114\061\040\060\036\006\003\125\004\013\023\027\107\154\157 -\142\141\154\123\151\147\156\040\122\157\157\164\040\103\101\040 -\055\040\122\066\061\023\060\021\006\003\125\004\012\023\012\107 -\154\157\142\141\154\123\151\147\156\061\023\060\021\006\003\125 -\004\003\023\012\107\154\157\142\141\154\123\151\147\156 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\016\105\346\273\003\203\063\303\205\145\110\346\377\105\121 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "OISTE WISeKey Global Root GC CA" -# -# Issuer: CN=OISTE WISeKey Global Root GC CA,OU=OISTE Foundation Endorsed,O=WISeKey,C=CH -# Serial Number:21:2a:56:0c:ae:da:0c:ab:40:45:bf:2b:a2:2d:3a:ea -# Subject: CN=OISTE WISeKey Global Root GC CA,OU=OISTE Foundation Endorsed,O=WISeKey,C=CH -# Not Valid Before: Tue May 09 09:48:34 2017 -# Not Valid After : Fri May 09 09:58:33 2042 -# Fingerprint (SHA-256): 85:60:F9:1C:36:24:DA:BA:95:70:B5:FE:A0:DB:E3:6F:F1:1A:83:23:BE:94:86:85:4F:B3:F3:4A:55:71:19:8D -# Fingerprint (SHA1): E0:11:84:5E:34:DE:BE:88:81:B9:9C:F6:16:26:D1:96:1F:C3:B9:31 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "OISTE WISeKey Global Root GC CA" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\155\061\013\060\011\006\003\125\004\006\023\002\103\110\061 -\020\060\016\006\003\125\004\012\023\007\127\111\123\145\113\145 -\171\061\042\060\040\006\003\125\004\013\023\031\117\111\123\124 -\105\040\106\157\165\156\144\141\164\151\157\156\040\105\156\144 -\157\162\163\145\144\061\050\060\046\006\003\125\004\003\023\037 -\117\111\123\124\105\040\127\111\123\145\113\145\171\040\107\154 -\157\142\141\154\040\122\157\157\164\040\107\103\040\103\101 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\155\061\013\060\011\006\003\125\004\006\023\002\103\110\061 -\020\060\016\006\003\125\004\012\023\007\127\111\123\145\113\145 -\171\061\042\060\040\006\003\125\004\013\023\031\117\111\123\124 -\105\040\106\157\165\156\144\141\164\151\157\156\040\105\156\144 -\157\162\163\145\144\061\050\060\046\006\003\125\004\003\023\037 -\117\111\123\124\105\040\127\111\123\145\113\145\171\040\107\154 -\157\142\141\154\040\122\157\157\164\040\107\103\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\041\052\126\014\256\332\014\253\100\105\277\053\242\055 -\072\352 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\151\060\202\001\357\240\003\002\001\002\002\020\041 -\052\126\014\256\332\014\253\100\105\277\053\242\055\072\352\060 -\012\006\010\052\206\110\316\075\004\003\003\060\155\061\013\060 -\011\006\003\125\004\006\023\002\103\110\061\020\060\016\006\003 -\125\004\012\023\007\127\111\123\145\113\145\171\061\042\060\040 -\006\003\125\004\013\023\031\117\111\123\124\105\040\106\157\165 -\156\144\141\164\151\157\156\040\105\156\144\157\162\163\145\144 -\061\050\060\046\006\003\125\004\003\023\037\117\111\123\124\105 -\040\127\111\123\145\113\145\171\040\107\154\157\142\141\154\040 -\122\157\157\164\040\107\103\040\103\101\060\036\027\015\061\067 -\060\065\060\071\060\071\064\070\063\064\132\027\015\064\062\060 -\065\060\071\060\071\065\070\063\063\132\060\155\061\013\060\011 -\006\003\125\004\006\023\002\103\110\061\020\060\016\006\003\125 -\004\012\023\007\127\111\123\145\113\145\171\061\042\060\040\006 -\003\125\004\013\023\031\117\111\123\124\105\040\106\157\165\156 -\144\141\164\151\157\156\040\105\156\144\157\162\163\145\144\061 -\050\060\046\006\003\125\004\003\023\037\117\111\123\124\105\040 -\127\111\123\145\113\145\171\040\107\154\157\142\141\154\040\122 -\157\157\164\040\107\103\040\103\101\060\166\060\020\006\007\052 -\206\110\316\075\002\001\006\005\053\201\004\000\042\003\142\000 -\004\114\351\120\300\306\017\162\030\274\330\361\272\263\211\342 -\171\112\243\026\247\153\124\044\333\121\377\352\364\011\044\303 -\013\042\237\313\152\047\202\201\015\322\300\257\061\344\164\202 -\156\312\045\331\214\165\235\361\333\320\232\242\113\041\176\026 -\247\143\220\322\071\324\261\207\170\137\030\226\017\120\033\065 -\067\017\152\306\334\331\023\115\244\216\220\067\346\275\133\061 -\221\243\124\060\122\060\016\006\003\125\035\017\001\001\377\004 -\004\003\002\001\006\060\017\006\003\125\035\023\001\001\377\004 -\005\060\003\001\001\377\060\035\006\003\125\035\016\004\026\004 -\024\110\207\024\254\343\303\236\220\140\072\327\312\211\356\323 -\255\214\264\120\146\060\020\006\011\053\006\001\004\001\202\067 -\025\001\004\003\002\001\000\060\012\006\010\052\206\110\316\075 -\004\003\003\003\150\000\060\145\002\060\046\307\151\133\334\325 -\347\262\347\310\014\214\214\303\335\171\214\033\143\325\311\122 -\224\116\115\202\112\163\036\262\200\204\251\045\300\114\132\155 -\111\051\140\170\023\342\176\110\353\144\002\061\000\333\064\040 -\062\010\377\232\111\002\266\210\336\024\257\135\154\231\161\215 -\032\077\213\327\340\242\066\206\034\007\202\072\166\123\375\302 -\242\355\357\173\260\200\117\130\017\113\123\071\275 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "OISTE WISeKey Global Root GC CA" -# Issuer: CN=OISTE WISeKey Global Root GC CA,OU=OISTE Foundation Endorsed,O=WISeKey,C=CH -# Serial Number:21:2a:56:0c:ae:da:0c:ab:40:45:bf:2b:a2:2d:3a:ea -# Subject: CN=OISTE WISeKey Global Root GC CA,OU=OISTE Foundation Endorsed,O=WISeKey,C=CH -# Not Valid Before: Tue May 09 09:48:34 2017 -# Not Valid After : Fri May 09 09:58:33 2042 -# Fingerprint (SHA-256): 85:60:F9:1C:36:24:DA:BA:95:70:B5:FE:A0:DB:E3:6F:F1:1A:83:23:BE:94:86:85:4F:B3:F3:4A:55:71:19:8D -# Fingerprint (SHA1): E0:11:84:5E:34:DE:BE:88:81:B9:9C:F6:16:26:D1:96:1F:C3:B9:31 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "OISTE WISeKey Global Root GC CA" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\340\021\204\136\064\336\276\210\201\271\234\366\026\046\321\226 -\037\303\271\061 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\251\326\271\055\057\223\144\370\245\151\312\221\351\150\007\043 -END -CKA_ISSUER MULTILINE_OCTAL -\060\155\061\013\060\011\006\003\125\004\006\023\002\103\110\061 -\020\060\016\006\003\125\004\012\023\007\127\111\123\145\113\145 -\171\061\042\060\040\006\003\125\004\013\023\031\117\111\123\124 -\105\040\106\157\165\156\144\141\164\151\157\156\040\105\156\144 -\157\162\163\145\144\061\050\060\046\006\003\125\004\003\023\037 -\117\111\123\124\105\040\127\111\123\145\113\145\171\040\107\154 -\157\142\141\154\040\122\157\157\164\040\107\103\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\041\052\126\014\256\332\014\253\100\105\277\053\242\055 -\072\352 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "UCA Global G2 Root" -# -# Issuer: CN=UCA Global G2 Root,O=UniTrust,C=CN -# Serial Number:5d:df:b1:da:5a:a3:ed:5d:be:5a:65:20:65:03:90:ef -# Subject: CN=UCA Global G2 Root,O=UniTrust,C=CN -# Not Valid Before: Fri Mar 11 00:00:00 2016 -# Not Valid After : Mon Dec 31 00:00:00 2040 -# Fingerprint (SHA-256): 9B:EA:11:C9:76:FE:01:47:64:C1:BE:56:A6:F9:14:B5:A5:60:31:7A:BD:99:88:39:33:82:E5:16:1A:A0:49:3C -# Fingerprint (SHA1): 28:F9:78:16:19:7A:FF:18:25:18:AA:44:FE:C1:A0:CE:5C:B6:4C:8A -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "UCA Global G2 Root" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\075\061\013\060\011\006\003\125\004\006\023\002\103\116\061 -\021\060\017\006\003\125\004\012\014\010\125\156\151\124\162\165 -\163\164\061\033\060\031\006\003\125\004\003\014\022\125\103\101 -\040\107\154\157\142\141\154\040\107\062\040\122\157\157\164 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\075\061\013\060\011\006\003\125\004\006\023\002\103\116\061 -\021\060\017\006\003\125\004\012\014\010\125\156\151\124\162\165 -\163\164\061\033\060\031\006\003\125\004\003\014\022\125\103\101 -\040\107\154\157\142\141\154\040\107\062\040\122\157\157\164 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\135\337\261\332\132\243\355\135\276\132\145\040\145\003 -\220\357 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\106\060\202\003\056\240\003\002\001\002\002\020\135 -\337\261\332\132\243\355\135\276\132\145\040\145\003\220\357\060 -\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060\075 -\061\013\060\011\006\003\125\004\006\023\002\103\116\061\021\060 -\017\006\003\125\004\012\014\010\125\156\151\124\162\165\163\164 -\061\033\060\031\006\003\125\004\003\014\022\125\103\101\040\107 -\154\157\142\141\154\040\107\062\040\122\157\157\164\060\036\027 -\015\061\066\060\063\061\061\060\060\060\060\060\060\132\027\015 -\064\060\061\062\063\061\060\060\060\060\060\060\132\060\075\061 -\013\060\011\006\003\125\004\006\023\002\103\116\061\021\060\017 -\006\003\125\004\012\014\010\125\156\151\124\162\165\163\164\061 -\033\060\031\006\003\125\004\003\014\022\125\103\101\040\107\154 -\157\142\141\154\040\107\062\040\122\157\157\164\060\202\002\042 -\060\015\006\011\052\206\110\206\367\015\001\001\001\005\000\003 -\202\002\017\000\060\202\002\012\002\202\002\001\000\305\346\053 -\157\174\357\046\005\047\243\201\044\332\157\313\001\371\231\232 -\251\062\302\042\207\141\101\221\073\313\303\150\033\006\305\114 -\251\053\301\147\027\042\035\053\355\371\051\211\223\242\170\275 -\222\153\240\243\015\242\176\312\223\263\246\321\214\065\325\165 -\371\027\366\317\105\305\345\172\354\167\223\240\217\043\256\016 -\032\003\177\276\324\320\355\056\173\253\106\043\133\377\054\346 -\124\172\224\300\052\025\360\311\215\260\172\073\044\341\327\150 -\342\061\074\006\063\106\266\124\021\246\245\057\042\124\052\130 -\015\001\002\361\372\025\121\147\154\300\372\327\266\033\177\321 -\126\210\057\032\072\215\073\273\202\021\340\107\000\320\122\207 -\253\373\206\176\017\044\153\100\235\064\147\274\215\307\055\206 -\157\171\076\216\251\074\027\113\177\260\231\343\260\161\140\334 -\013\365\144\303\316\103\274\155\161\271\322\336\047\133\212\350 -\330\306\256\341\131\175\317\050\055\065\270\225\126\032\361\262 -\130\113\267\022\067\310\174\263\355\113\200\341\215\372\062\043 -\266\157\267\110\225\010\261\104\116\205\214\072\002\124\040\057 -\337\277\127\117\073\072\220\041\327\301\046\065\124\040\354\307 -\077\107\354\357\132\277\113\172\301\255\073\027\120\134\142\330 -\017\113\112\334\053\372\156\274\163\222\315\354\307\120\350\101 -\226\327\251\176\155\330\351\035\217\212\265\271\130\222\272\112 -\222\053\014\126\375\200\353\010\360\136\051\156\033\034\014\257 -\217\223\211\255\333\275\243\236\041\312\211\031\354\337\265\303 -\032\353\026\376\170\066\114\326\156\320\076\027\034\220\027\153 -\046\272\373\172\057\277\021\034\030\016\055\163\003\217\240\345 -\065\240\132\342\114\165\035\161\341\071\070\123\170\100\314\203 -\223\327\012\236\235\133\217\212\344\345\340\110\344\110\262\107 -\315\116\052\165\052\173\362\042\366\311\276\011\221\226\127\172 -\210\210\254\356\160\254\371\334\051\343\014\034\073\022\116\104 -\326\247\116\260\046\310\363\331\032\227\221\150\352\357\215\106 -\006\322\126\105\130\232\074\014\017\203\270\005\045\303\071\317 -\073\244\064\211\267\171\022\057\107\305\347\251\227\151\374\246 -\167\147\265\337\173\361\172\145\025\344\141\126\145\002\003\001 -\000\001\243\102\060\100\060\016\006\003\125\035\017\001\001\377 -\004\004\003\002\001\006\060\017\006\003\125\035\023\001\001\377 -\004\005\060\003\001\001\377\060\035\006\003\125\035\016\004\026 -\004\024\201\304\214\314\365\344\060\377\245\014\010\137\214\025 -\147\041\164\001\337\337\060\015\006\011\052\206\110\206\367\015 -\001\001\013\005\000\003\202\002\001\000\023\145\042\365\216\053 -\255\104\344\313\377\271\150\346\303\200\110\075\004\173\372\043 -\057\172\355\066\332\262\316\155\366\346\236\345\137\130\217\313 -\067\062\241\310\145\266\256\070\075\065\033\076\274\073\266\004 -\320\274\371\111\365\233\367\205\305\066\266\313\274\370\310\071 -\325\344\137\007\275\025\124\227\164\312\312\355\117\272\272\144 -\166\237\201\270\204\105\111\114\215\157\242\353\261\314\321\303 -\224\332\104\302\346\342\352\030\350\242\037\047\005\272\327\345 -\326\251\315\335\357\166\230\215\000\016\315\033\372\003\267\216 -\200\130\016\047\077\122\373\224\242\312\136\145\311\326\204\332 -\271\065\161\363\046\300\117\167\346\201\047\322\167\073\232\024 -\157\171\364\366\320\341\323\224\272\320\127\121\275\047\005\015 -\301\375\310\022\060\356\157\215\021\053\010\235\324\324\277\200 -\105\024\232\210\104\332\060\352\264\247\343\356\357\133\202\325 -\076\326\255\170\222\333\134\074\363\330\255\372\270\153\177\304 -\066\050\266\002\025\212\124\054\234\260\027\163\216\320\067\243 -\024\074\230\225\000\014\051\005\133\236\111\111\261\137\307\343 -\313\317\047\145\216\065\027\267\127\310\060\331\101\133\271\024 -\266\350\302\017\224\061\247\224\230\314\152\353\265\341\047\365 -\020\250\001\350\216\022\142\350\210\314\265\177\106\227\300\233 -\020\146\070\032\066\106\137\042\150\075\337\311\306\023\047\253 -\123\006\254\242\074\206\006\145\157\261\176\261\051\104\232\243 -\272\111\151\050\151\217\327\345\137\255\004\206\144\157\032\240 -\014\305\010\142\316\200\243\320\363\354\150\336\276\063\307\027 -\133\177\200\304\114\114\261\246\204\212\303\073\270\011\315\024 -\201\272\030\343\124\127\066\376\333\057\174\107\241\072\063\310 -\371\130\073\104\117\261\312\002\211\004\226\050\150\305\113\270 -\046\211\273\326\063\057\120\325\376\232\211\272\030\062\222\124 -\306\133\340\235\371\136\345\015\042\233\366\332\342\310\041\262 -\142\041\252\206\100\262\056\144\323\137\310\343\176\021\147\105 -\037\005\376\343\242\357\263\250\263\363\175\217\370\014\037\042 -\037\055\160\264\270\001\064\166\060\000\345\043\170\247\126\327 -\120\037\212\373\006\365\302\031\360\320 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "UCA Global G2 Root" -# Issuer: CN=UCA Global G2 Root,O=UniTrust,C=CN -# Serial Number:5d:df:b1:da:5a:a3:ed:5d:be:5a:65:20:65:03:90:ef -# Subject: CN=UCA Global G2 Root,O=UniTrust,C=CN -# Not Valid Before: Fri Mar 11 00:00:00 2016 -# Not Valid After : Mon Dec 31 00:00:00 2040 -# Fingerprint (SHA-256): 9B:EA:11:C9:76:FE:01:47:64:C1:BE:56:A6:F9:14:B5:A5:60:31:7A:BD:99:88:39:33:82:E5:16:1A:A0:49:3C -# Fingerprint (SHA1): 28:F9:78:16:19:7A:FF:18:25:18:AA:44:FE:C1:A0:CE:5C:B6:4C:8A -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "UCA Global G2 Root" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\050\371\170\026\031\172\377\030\045\030\252\104\376\301\240\316 -\134\266\114\212 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\200\376\360\304\112\360\134\142\062\237\034\272\170\251\120\370 -END -CKA_ISSUER MULTILINE_OCTAL -\060\075\061\013\060\011\006\003\125\004\006\023\002\103\116\061 -\021\060\017\006\003\125\004\012\014\010\125\156\151\124\162\165 -\163\164\061\033\060\031\006\003\125\004\003\014\022\125\103\101 -\040\107\154\157\142\141\154\040\107\062\040\122\157\157\164 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\135\337\261\332\132\243\355\135\276\132\145\040\145\003 -\220\357 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "UCA Extended Validation Root" -# -# Issuer: CN=UCA Extended Validation Root,O=UniTrust,C=CN -# Serial Number:4f:d2:2b:8f:f5:64:c8:33:9e:4f:34:58:66:23:70:60 -# Subject: CN=UCA Extended Validation Root,O=UniTrust,C=CN -# Not Valid Before: Fri Mar 13 00:00:00 2015 -# Not Valid After : Fri Dec 31 00:00:00 2038 -# Fingerprint (SHA-256): D4:3A:F9:B3:54:73:75:5C:96:84:FC:06:D7:D8:CB:70:EE:5C:28:E7:73:FB:29:4E:B4:1E:E7:17:22:92:4D:24 -# Fingerprint (SHA1): A3:A1:B0:6F:24:61:23:4A:E3:36:A5:C2:37:FC:A6:FF:DD:F0:D7:3A -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "UCA Extended Validation Root" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\107\061\013\060\011\006\003\125\004\006\023\002\103\116\061 -\021\060\017\006\003\125\004\012\014\010\125\156\151\124\162\165 -\163\164\061\045\060\043\006\003\125\004\003\014\034\125\103\101 -\040\105\170\164\145\156\144\145\144\040\126\141\154\151\144\141 -\164\151\157\156\040\122\157\157\164 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\107\061\013\060\011\006\003\125\004\006\023\002\103\116\061 -\021\060\017\006\003\125\004\012\014\010\125\156\151\124\162\165 -\163\164\061\045\060\043\006\003\125\004\003\014\034\125\103\101 -\040\105\170\164\145\156\144\145\144\040\126\141\154\151\144\141 -\164\151\157\156\040\122\157\157\164 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\117\322\053\217\365\144\310\063\236\117\064\130\146\043 -\160\140 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\132\060\202\003\102\240\003\002\001\002\002\020\117 -\322\053\217\365\144\310\063\236\117\064\130\146\043\160\140\060 -\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060\107 -\061\013\060\011\006\003\125\004\006\023\002\103\116\061\021\060 -\017\006\003\125\004\012\014\010\125\156\151\124\162\165\163\164 -\061\045\060\043\006\003\125\004\003\014\034\125\103\101\040\105 -\170\164\145\156\144\145\144\040\126\141\154\151\144\141\164\151 -\157\156\040\122\157\157\164\060\036\027\015\061\065\060\063\061 -\063\060\060\060\060\060\060\132\027\015\063\070\061\062\063\061 -\060\060\060\060\060\060\132\060\107\061\013\060\011\006\003\125 -\004\006\023\002\103\116\061\021\060\017\006\003\125\004\012\014 -\010\125\156\151\124\162\165\163\164\061\045\060\043\006\003\125 -\004\003\014\034\125\103\101\040\105\170\164\145\156\144\145\144 -\040\126\141\154\151\144\141\164\151\157\156\040\122\157\157\164 -\060\202\002\042\060\015\006\011\052\206\110\206\367\015\001\001 -\001\005\000\003\202\002\017\000\060\202\002\012\002\202\002\001 -\000\251\011\007\050\023\002\260\231\340\144\252\036\103\026\172 -\163\261\221\240\165\076\250\372\343\070\000\172\354\211\152\040 -\017\213\305\260\233\063\003\132\206\306\130\206\325\301\205\273 -\117\306\234\100\115\312\276\356\151\226\270\255\201\060\232\174 -\222\005\353\005\053\232\110\320\270\166\076\226\310\040\273\322 -\260\361\217\330\254\105\106\377\252\147\140\264\167\176\152\037 -\074\032\122\172\004\075\007\074\205\015\204\320\037\166\012\367 -\152\024\337\162\343\064\174\127\116\126\001\076\171\361\252\051 -\073\154\372\370\217\155\115\310\065\337\256\353\334\044\356\171 -\105\247\205\266\005\210\336\210\135\045\174\227\144\147\011\331 -\277\132\025\005\206\363\011\036\354\130\062\063\021\363\167\144 -\260\166\037\344\020\065\027\033\362\016\261\154\244\052\243\163 -\374\011\037\036\062\031\123\021\347\331\263\054\056\166\056\241 -\243\336\176\152\210\011\350\362\007\212\370\262\315\020\347\342 -\163\100\223\273\010\321\077\341\374\013\224\263\045\357\174\246 -\327\321\257\237\377\226\232\365\221\173\230\013\167\324\176\350 -\007\322\142\265\225\071\343\363\361\155\017\016\145\204\212\143 -\124\305\200\266\340\236\113\175\107\046\247\001\010\135\321\210 -\236\327\303\062\104\372\202\112\012\150\124\177\070\123\003\314 -\244\000\063\144\121\131\013\243\202\221\172\136\354\026\302\363 -\052\346\142\332\052\333\131\142\020\045\112\052\201\013\107\007 -\103\006\160\207\322\372\223\021\051\172\110\115\353\224\307\160 -\115\257\147\325\121\261\200\040\001\001\264\172\010\246\220\177 -\116\340\357\007\101\207\257\152\245\136\213\373\317\120\262\232 -\124\257\303\211\272\130\055\365\060\230\261\066\162\071\176\111 -\004\375\051\247\114\171\344\005\127\333\224\271\026\123\215\106 -\263\035\225\141\127\126\177\257\360\026\133\141\130\157\066\120 -\021\013\330\254\053\225\026\032\016\037\010\315\066\064\145\020 -\142\146\325\200\137\024\040\137\055\014\240\170\012\150\326\054 -\327\351\157\053\322\112\005\223\374\236\157\153\147\377\210\361 -\116\245\151\112\122\067\005\352\306\026\215\322\304\231\321\202 -\053\073\272\065\165\367\121\121\130\363\310\007\335\344\264\003 -\177\002\003\001\000\001\243\102\060\100\060\035\006\003\125\035 -\016\004\026\004\024\331\164\072\344\060\075\015\367\022\334\176 -\132\005\237\036\064\232\367\341\024\060\017\006\003\125\035\023 -\001\001\377\004\005\060\003\001\001\377\060\016\006\003\125\035 -\017\001\001\377\004\004\003\002\001\206\060\015\006\011\052\206 -\110\206\367\015\001\001\013\005\000\003\202\002\001\000\066\215 -\227\314\102\025\144\051\067\233\046\054\326\373\256\025\151\054 -\153\032\032\367\137\266\371\007\114\131\352\363\311\310\271\256 -\314\272\056\172\334\300\365\260\055\300\073\257\237\160\005\021 -\152\237\045\117\001\051\160\343\345\014\341\352\132\174\334\111 -\273\301\036\052\201\365\026\113\162\221\310\242\061\271\252\332 -\374\235\037\363\135\100\002\023\374\116\034\006\312\263\024\220 -\124\027\031\022\032\361\037\327\014\151\132\366\161\170\364\224 -\175\221\013\216\354\220\124\216\274\157\241\114\253\374\164\144 -\375\161\232\370\101\007\241\315\221\344\074\232\340\233\062\071 -\163\253\052\325\151\310\170\221\046\061\175\342\307\060\361\374 -\024\170\167\022\016\023\364\335\026\224\277\113\147\173\160\123 -\205\312\260\273\363\070\115\054\220\071\300\015\302\135\153\351 -\342\345\325\210\215\326\054\277\253\033\276\265\050\207\022\027 -\164\156\374\175\374\217\320\207\046\260\033\373\271\154\253\342 -\236\075\025\301\073\056\147\002\130\221\237\357\370\102\037\054 -\267\150\365\165\255\317\265\366\377\021\175\302\360\044\245\255 -\323\372\240\074\251\372\135\334\245\240\357\104\244\276\326\350 -\345\344\023\226\027\173\006\076\062\355\307\267\102\274\166\243 -\330\145\070\053\070\065\121\041\016\016\157\056\064\023\100\341 -\053\147\014\155\112\101\060\030\043\132\062\125\231\311\027\340 -\074\336\366\354\171\255\053\130\031\242\255\054\042\032\225\216 -\276\226\220\135\102\127\304\371\024\003\065\053\034\055\121\127 -\010\247\072\336\077\344\310\264\003\163\302\301\046\200\273\013 -\102\037\255\015\257\046\162\332\314\276\263\243\203\130\015\202 -\305\037\106\121\343\234\030\314\215\233\215\354\111\353\165\120 -\325\214\050\131\312\164\064\332\214\013\041\253\036\352\033\345 -\307\375\025\076\300\027\252\373\043\156\046\106\313\372\371\261 -\162\153\151\317\042\204\013\142\017\254\331\031\000\224\242\166 -\074\324\055\232\355\004\236\055\006\142\020\067\122\034\205\162 -\033\047\345\314\306\061\354\067\354\143\131\233\013\035\166\314 -\176\062\232\210\225\010\066\122\273\336\166\137\166\111\111\255 -\177\275\145\040\262\311\301\053\166\030\166\237\126\261 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "UCA Extended Validation Root" -# Issuer: CN=UCA Extended Validation Root,O=UniTrust,C=CN -# Serial Number:4f:d2:2b:8f:f5:64:c8:33:9e:4f:34:58:66:23:70:60 -# Subject: CN=UCA Extended Validation Root,O=UniTrust,C=CN -# Not Valid Before: Fri Mar 13 00:00:00 2015 -# Not Valid After : Fri Dec 31 00:00:00 2038 -# Fingerprint (SHA-256): D4:3A:F9:B3:54:73:75:5C:96:84:FC:06:D7:D8:CB:70:EE:5C:28:E7:73:FB:29:4E:B4:1E:E7:17:22:92:4D:24 -# Fingerprint (SHA1): A3:A1:B0:6F:24:61:23:4A:E3:36:A5:C2:37:FC:A6:FF:DD:F0:D7:3A -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "UCA Extended Validation Root" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\243\241\260\157\044\141\043\112\343\066\245\302\067\374\246\377 -\335\360\327\072 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\241\363\137\103\306\064\233\332\277\214\176\005\123\255\226\342 -END -CKA_ISSUER MULTILINE_OCTAL -\060\107\061\013\060\011\006\003\125\004\006\023\002\103\116\061 -\021\060\017\006\003\125\004\012\014\010\125\156\151\124\162\165 -\163\164\061\045\060\043\006\003\125\004\003\014\034\125\103\101 -\040\105\170\164\145\156\144\145\144\040\126\141\154\151\144\141 -\164\151\157\156\040\122\157\157\164 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\117\322\053\217\365\144\310\063\236\117\064\130\146\043 -\160\140 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Certigna Root CA" -# -# Issuer: CN=Certigna Root CA,OU=0002 48146308100036,O=Dhimyotis,C=FR -# Serial Number:00:ca:e9:1b:89:f1:55:03:0d:a3:e6:41:6d:c4:e3:a6:e1 -# Subject: CN=Certigna Root CA,OU=0002 48146308100036,O=Dhimyotis,C=FR -# Not Valid Before: Tue Oct 01 08:32:27 2013 -# Not Valid After : Sat Oct 01 08:32:27 2033 -# Fingerprint (SHA-256): D4:8D:3D:23:EE:DB:50:A4:59:E5:51:97:60:1C:27:77:4B:9D:7B:18:C9:4D:5A:05:95:11:A1:02:50:B9:31:68 -# Fingerprint (SHA1): 2D:0D:52:14:FF:9E:AD:99:24:01:74:20:47:6E:6C:85:27:27:F5:43 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Certigna Root CA" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\132\061\013\060\011\006\003\125\004\006\023\002\106\122\061 -\022\060\020\006\003\125\004\012\014\011\104\150\151\155\171\157 -\164\151\163\061\034\060\032\006\003\125\004\013\014\023\060\060 -\060\062\040\064\070\061\064\066\063\060\070\061\060\060\060\063 -\066\061\031\060\027\006\003\125\004\003\014\020\103\145\162\164 -\151\147\156\141\040\122\157\157\164\040\103\101 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\132\061\013\060\011\006\003\125\004\006\023\002\106\122\061 -\022\060\020\006\003\125\004\012\014\011\104\150\151\155\171\157 -\164\151\163\061\034\060\032\006\003\125\004\013\014\023\060\060 -\060\062\040\064\070\061\064\066\063\060\070\061\060\060\060\063 -\066\061\031\060\027\006\003\125\004\003\014\020\103\145\162\164 -\151\147\156\141\040\122\157\157\164\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\021\000\312\351\033\211\361\125\003\015\243\346\101\155\304 -\343\246\341 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\006\133\060\202\004\103\240\003\002\001\002\002\021\000 -\312\351\033\211\361\125\003\015\243\346\101\155\304\343\246\341 -\060\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060 -\132\061\013\060\011\006\003\125\004\006\023\002\106\122\061\022 -\060\020\006\003\125\004\012\014\011\104\150\151\155\171\157\164 -\151\163\061\034\060\032\006\003\125\004\013\014\023\060\060\060 -\062\040\064\070\061\064\066\063\060\070\061\060\060\060\063\066 -\061\031\060\027\006\003\125\004\003\014\020\103\145\162\164\151 -\147\156\141\040\122\157\157\164\040\103\101\060\036\027\015\061 -\063\061\060\060\061\060\070\063\062\062\067\132\027\015\063\063 -\061\060\060\061\060\070\063\062\062\067\132\060\132\061\013\060 -\011\006\003\125\004\006\023\002\106\122\061\022\060\020\006\003 -\125\004\012\014\011\104\150\151\155\171\157\164\151\163\061\034 -\060\032\006\003\125\004\013\014\023\060\060\060\062\040\064\070 -\061\064\066\063\060\070\061\060\060\060\063\066\061\031\060\027 -\006\003\125\004\003\014\020\103\145\162\164\151\147\156\141\040 -\122\157\157\164\040\103\101\060\202\002\042\060\015\006\011\052 -\206\110\206\367\015\001\001\001\005\000\003\202\002\017\000\060 -\202\002\012\002\202\002\001\000\315\030\071\145\032\131\261\352 -\144\026\016\214\224\044\225\174\203\323\305\071\046\334\014\357 -\026\127\215\327\330\254\243\102\177\202\312\355\315\133\333\016 -\267\055\355\105\010\027\262\331\263\313\326\027\122\162\050\333 -\216\116\236\212\266\013\371\236\204\232\115\166\336\042\051\134 -\322\263\322\006\076\060\071\251\164\243\222\126\034\241\157\114 -\012\040\155\237\043\172\264\306\332\054\344\035\054\334\263\050 -\320\023\362\114\116\002\111\241\124\100\236\346\345\005\240\055 -\204\310\377\230\154\320\353\212\032\204\010\036\267\150\043\356 -\043\325\160\316\155\121\151\020\356\241\172\302\321\042\061\302 -\202\205\322\362\125\166\120\174\045\172\311\204\134\013\254\335 -\102\116\053\347\202\242\044\211\313\220\262\320\356\043\272\146 -\114\273\142\244\371\123\132\144\173\174\230\372\243\110\236\017 -\225\256\247\030\364\152\354\056\003\105\257\360\164\370\052\315 -\172\135\321\276\104\046\062\051\361\361\365\154\314\176\002\041 -\013\237\157\244\077\276\235\123\342\317\175\251\054\174\130\032 -\227\341\075\067\067\030\146\050\322\100\305\121\212\214\303\055 -\316\123\210\044\130\144\060\026\305\252\340\326\012\246\100\337 -\170\366\365\004\174\151\023\204\274\321\321\247\006\317\001\367 -\150\300\250\127\273\072\141\255\004\214\223\343\255\374\360\333 -\104\155\131\334\111\131\256\254\232\231\066\060\101\173\166\063 -\042\207\243\302\222\206\156\371\160\356\256\207\207\225\033\304 -\172\275\061\363\324\322\345\231\377\276\110\354\165\365\170\026 -\035\246\160\301\177\074\033\241\222\373\317\310\074\326\305\223 -\012\217\365\125\072\166\225\316\131\230\212\011\225\167\062\232 -\203\272\054\004\072\227\275\324\057\276\327\154\233\242\312\175 -\155\046\311\125\325\317\303\171\122\010\011\231\007\044\055\144 -\045\153\246\041\151\233\152\335\164\115\153\227\172\101\275\253 -\027\371\220\027\110\217\066\371\055\325\305\333\356\252\205\105 -\101\372\315\072\105\261\150\346\066\114\233\220\127\354\043\271 -\207\010\302\304\011\361\227\206\052\050\115\342\164\300\332\304 -\214\333\337\342\241\027\131\316\044\131\164\061\332\177\375\060 -\155\331\334\341\152\341\374\137\002\003\001\000\001\243\202\001 -\032\060\202\001\026\060\017\006\003\125\035\023\001\001\377\004 -\005\060\003\001\001\377\060\016\006\003\125\035\017\001\001\377 -\004\004\003\002\001\006\060\035\006\003\125\035\016\004\026\004 -\024\030\207\126\340\156\167\356\044\065\074\116\163\232\037\326 -\341\342\171\176\053\060\037\006\003\125\035\043\004\030\060\026 -\200\024\030\207\126\340\156\167\356\044\065\074\116\163\232\037 -\326\341\342\171\176\053\060\104\006\003\125\035\040\004\075\060 -\073\060\071\006\004\125\035\040\000\060\061\060\057\006\010\053 -\006\001\005\005\007\002\001\026\043\150\164\164\160\163\072\057 -\057\167\167\167\167\056\143\145\162\164\151\147\156\141\056\146 -\162\057\141\165\164\157\162\151\164\145\163\057\060\155\006\003 -\125\035\037\004\146\060\144\060\057\240\055\240\053\206\051\150 -\164\164\160\072\057\057\143\162\154\056\143\145\162\164\151\147 -\156\141\056\146\162\057\143\145\162\164\151\147\156\141\162\157 -\157\164\143\141\056\143\162\154\060\061\240\057\240\055\206\053 -\150\164\164\160\072\057\057\143\162\154\056\144\150\151\155\171 -\157\164\151\163\056\143\157\155\057\143\145\162\164\151\147\156 -\141\162\157\157\164\143\141\056\143\162\154\060\015\006\011\052 -\206\110\206\367\015\001\001\013\005\000\003\202\002\001\000\224 -\270\236\117\360\343\225\010\042\347\315\150\101\367\034\125\325 -\174\000\342\055\072\211\135\150\070\057\121\042\013\112\215\313 -\351\273\135\076\273\134\075\261\050\376\344\123\125\023\317\241 -\220\033\002\035\137\146\106\011\063\050\341\015\044\227\160\323 -\020\037\352\144\127\226\273\135\332\347\304\214\117\114\144\106 -\035\134\207\343\131\336\102\321\233\250\176\246\211\335\217\034 -\311\060\202\355\073\234\315\300\351\031\340\152\330\002\165\067 -\253\367\064\050\050\221\362\004\012\117\065\343\140\046\001\372 -\320\021\214\371\021\152\356\257\075\303\120\323\217\137\063\171 -\074\206\250\163\105\220\214\040\266\162\163\027\043\276\007\145 -\345\170\222\015\272\001\300\353\214\034\146\277\254\206\167\001 -\224\015\234\346\351\071\215\037\246\121\214\231\014\071\167\341 -\264\233\372\034\147\127\157\152\152\216\251\053\114\127\171\172 -\127\042\317\315\137\143\106\215\134\131\072\206\370\062\107\142 -\243\147\015\030\221\334\373\246\153\365\110\141\163\043\131\216 -\002\247\274\104\352\364\111\235\361\124\130\371\140\257\332\030 -\244\057\050\105\334\172\240\210\206\135\363\073\347\377\051\065 -\200\374\144\103\224\346\343\034\157\276\255\016\052\143\231\053 -\311\176\205\366\161\350\006\003\225\376\336\217\110\034\132\324 -\222\350\053\356\347\061\333\272\004\152\207\230\347\305\137\357 -\175\247\042\367\001\330\115\371\211\320\016\232\005\131\244\236 -\230\331\157\053\312\160\276\144\302\125\243\364\351\257\303\222 -\051\334\210\026\044\231\074\215\046\230\266\133\267\314\316\267 -\067\007\375\046\331\230\205\044\377\131\043\003\232\355\235\235 -\250\344\136\070\316\327\122\015\157\322\077\155\261\005\153\111 -\316\212\221\106\163\364\366\057\360\250\163\167\016\145\254\241 -\215\146\122\151\176\113\150\014\307\036\067\047\203\245\214\307 -\002\344\024\315\111\001\260\163\263\375\306\220\072\157\322\154 -\355\073\356\354\221\276\242\103\135\213\000\112\146\045\104\160 -\336\100\017\370\174\025\367\242\316\074\327\136\023\214\201\027 -\030\027\321\275\361\167\020\072\324\145\071\301\047\254\127\054 -\045\124\377\242\332\117\212\141\071\136\256\075\112\214\275 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Certigna Root CA" -# Issuer: CN=Certigna Root CA,OU=0002 48146308100036,O=Dhimyotis,C=FR -# Serial Number:00:ca:e9:1b:89:f1:55:03:0d:a3:e6:41:6d:c4:e3:a6:e1 -# Subject: CN=Certigna Root CA,OU=0002 48146308100036,O=Dhimyotis,C=FR -# Not Valid Before: Tue Oct 01 08:32:27 2013 -# Not Valid After : Sat Oct 01 08:32:27 2033 -# Fingerprint (SHA-256): D4:8D:3D:23:EE:DB:50:A4:59:E5:51:97:60:1C:27:77:4B:9D:7B:18:C9:4D:5A:05:95:11:A1:02:50:B9:31:68 -# Fingerprint (SHA1): 2D:0D:52:14:FF:9E:AD:99:24:01:74:20:47:6E:6C:85:27:27:F5:43 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Certigna Root CA" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\055\015\122\024\377\236\255\231\044\001\164\040\107\156\154\205 -\047\047\365\103 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\016\134\060\142\047\353\133\274\327\256\142\272\351\325\337\167 -END -CKA_ISSUER MULTILINE_OCTAL -\060\132\061\013\060\011\006\003\125\004\006\023\002\106\122\061 -\022\060\020\006\003\125\004\012\014\011\104\150\151\155\171\157 -\164\151\163\061\034\060\032\006\003\125\004\013\014\023\060\060 -\060\062\040\064\070\061\064\066\063\060\070\061\060\060\060\063 -\066\061\031\060\027\006\003\125\004\003\014\020\103\145\162\164 -\151\147\156\141\040\122\157\157\164\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\021\000\312\351\033\211\361\125\003\015\243\346\101\155\304 -\343\246\341 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "emSign Root CA - G1" -# -# Issuer: CN=emSign Root CA - G1,O=eMudhra Technologies Limited,OU=emSign PKI,C=IN -# Serial Number:31:f5:e4:62:0c:6c:58:ed:d6:d8 -# Subject: CN=emSign Root CA - G1,O=eMudhra Technologies Limited,OU=emSign PKI,C=IN -# Not Valid Before: Sun Feb 18 18:30:00 2018 -# Not Valid After : Wed Feb 18 18:30:00 2043 -# Fingerprint (SHA-256): 40:F6:AF:03:46:A9:9A:A1:CD:1D:55:5A:4E:9C:CE:62:C7:F9:63:46:03:EE:40:66:15:83:3D:C8:C8:D0:03:67 -# Fingerprint (SHA1): 8A:C7:AD:8F:73:AC:4E:C1:B5:75:4D:A5:40:F4:FC:CF:7C:B5:8E:8C -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "emSign Root CA - G1" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\147\061\013\060\011\006\003\125\004\006\023\002\111\116\061 -\023\060\021\006\003\125\004\013\023\012\145\155\123\151\147\156 -\040\120\113\111\061\045\060\043\006\003\125\004\012\023\034\145 -\115\165\144\150\162\141\040\124\145\143\150\156\157\154\157\147 -\151\145\163\040\114\151\155\151\164\145\144\061\034\060\032\006 -\003\125\004\003\023\023\145\155\123\151\147\156\040\122\157\157 -\164\040\103\101\040\055\040\107\061 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\147\061\013\060\011\006\003\125\004\006\023\002\111\116\061 -\023\060\021\006\003\125\004\013\023\012\145\155\123\151\147\156 -\040\120\113\111\061\045\060\043\006\003\125\004\012\023\034\145 -\115\165\144\150\162\141\040\124\145\143\150\156\157\154\157\147 -\151\145\163\040\114\151\155\151\164\145\144\061\034\060\032\006 -\003\125\004\003\023\023\145\155\123\151\147\156\040\122\157\157 -\164\040\103\101\040\055\040\107\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\012\061\365\344\142\014\154\130\355\326\330 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\003\224\060\202\002\174\240\003\002\001\002\002\012\061 -\365\344\142\014\154\130\355\326\330\060\015\006\011\052\206\110 -\206\367\015\001\001\013\005\000\060\147\061\013\060\011\006\003 -\125\004\006\023\002\111\116\061\023\060\021\006\003\125\004\013 -\023\012\145\155\123\151\147\156\040\120\113\111\061\045\060\043 -\006\003\125\004\012\023\034\145\115\165\144\150\162\141\040\124 -\145\143\150\156\157\154\157\147\151\145\163\040\114\151\155\151 -\164\145\144\061\034\060\032\006\003\125\004\003\023\023\145\155 -\123\151\147\156\040\122\157\157\164\040\103\101\040\055\040\107 -\061\060\036\027\015\061\070\060\062\061\070\061\070\063\060\060 -\060\132\027\015\064\063\060\062\061\070\061\070\063\060\060\060 -\132\060\147\061\013\060\011\006\003\125\004\006\023\002\111\116 -\061\023\060\021\006\003\125\004\013\023\012\145\155\123\151\147 -\156\040\120\113\111\061\045\060\043\006\003\125\004\012\023\034 -\145\115\165\144\150\162\141\040\124\145\143\150\156\157\154\157 -\147\151\145\163\040\114\151\155\151\164\145\144\061\034\060\032 -\006\003\125\004\003\023\023\145\155\123\151\147\156\040\122\157 -\157\164\040\103\101\040\055\040\107\061\060\202\001\042\060\015 -\006\011\052\206\110\206\367\015\001\001\001\005\000\003\202\001 -\017\000\060\202\001\012\002\202\001\001\000\223\113\273\351\146 -\212\356\235\133\325\064\223\320\033\036\303\347\236\270\144\063 -\177\143\170\150\264\315\056\161\165\327\233\040\306\115\051\274 -\266\150\140\212\367\041\232\126\065\132\363\166\275\330\315\232 -\377\223\126\113\245\131\006\241\223\064\051\335\026\064\165\116 -\362\201\264\307\226\116\255\031\025\122\112\376\074\160\165\160 -\315\257\053\253\025\232\063\074\252\263\213\252\315\103\375\365 -\352\160\377\355\317\021\073\224\316\116\062\026\323\043\100\052 -\167\263\257\074\001\054\154\355\231\054\213\331\116\151\230\262 -\367\217\101\260\062\170\141\326\015\137\303\372\242\100\222\035 -\134\027\346\160\076\065\347\242\267\302\142\342\253\244\070\114 -\265\071\065\157\352\003\151\372\072\124\150\205\155\326\362\057 -\103\125\036\221\015\016\330\325\152\244\226\321\023\074\054\170 -\120\350\072\222\322\027\126\345\065\032\100\034\076\215\054\355 -\071\337\102\340\203\101\164\337\243\315\302\206\140\110\150\343 -\151\013\124\000\213\344\166\151\041\015\171\116\064\010\136\024 -\302\314\261\267\255\327\174\160\212\307\205\002\003\001\000\001 -\243\102\060\100\060\035\006\003\125\035\016\004\026\004\024\373 -\357\015\206\236\260\343\335\251\271\361\041\027\177\076\374\360 -\167\053\032\060\016\006\003\125\035\017\001\001\377\004\004\003 -\002\001\006\060\017\006\003\125\035\023\001\001\377\004\005\060 -\003\001\001\377\060\015\006\011\052\206\110\206\367\015\001\001 -\013\005\000\003\202\001\001\000\131\377\362\214\365\207\175\161 -\075\243\237\033\133\321\332\370\323\234\153\066\275\233\251\141 -\353\336\026\054\164\075\236\346\165\332\327\272\247\274\102\027 -\347\075\221\353\345\175\335\076\234\361\317\222\254\154\110\314 -\302\042\077\151\073\305\266\025\057\243\065\306\150\052\034\127 -\257\071\357\215\320\065\303\030\014\173\000\126\034\315\213\031 -\164\336\276\017\022\340\320\252\241\077\002\064\261\160\316\235 -\030\326\010\003\011\106\356\140\340\176\266\304\111\004\121\175 -\160\140\274\252\262\377\171\162\172\246\035\075\137\052\370\312 -\342\375\071\267\107\271\353\176\337\004\043\257\372\234\006\007 -\351\373\143\223\200\100\265\306\154\012\061\050\316\014\237\317 -\263\043\065\200\101\215\154\304\067\173\201\057\200\241\100\102 -\205\351\331\070\215\350\241\123\315\001\277\151\350\132\006\362 -\105\013\220\372\256\341\277\235\362\256\127\074\245\256\262\126 -\364\213\145\100\351\375\061\201\054\364\071\011\330\356\153\247 -\264\246\035\025\245\230\367\001\201\330\205\175\363\121\134\161 -\210\336\272\314\037\200\176\112 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "emSign Root CA - G1" -# Issuer: CN=emSign Root CA - G1,O=eMudhra Technologies Limited,OU=emSign PKI,C=IN -# Serial Number:31:f5:e4:62:0c:6c:58:ed:d6:d8 -# Subject: CN=emSign Root CA - G1,O=eMudhra Technologies Limited,OU=emSign PKI,C=IN -# Not Valid Before: Sun Feb 18 18:30:00 2018 -# Not Valid After : Wed Feb 18 18:30:00 2043 -# Fingerprint (SHA-256): 40:F6:AF:03:46:A9:9A:A1:CD:1D:55:5A:4E:9C:CE:62:C7:F9:63:46:03:EE:40:66:15:83:3D:C8:C8:D0:03:67 -# Fingerprint (SHA1): 8A:C7:AD:8F:73:AC:4E:C1:B5:75:4D:A5:40:F4:FC:CF:7C:B5:8E:8C -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "emSign Root CA - G1" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\212\307\255\217\163\254\116\301\265\165\115\245\100\364\374\317 -\174\265\216\214 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\234\102\204\127\335\313\013\247\056\225\255\266\363\332\274\254 -END -CKA_ISSUER MULTILINE_OCTAL -\060\147\061\013\060\011\006\003\125\004\006\023\002\111\116\061 -\023\060\021\006\003\125\004\013\023\012\145\155\123\151\147\156 -\040\120\113\111\061\045\060\043\006\003\125\004\012\023\034\145 -\115\165\144\150\162\141\040\124\145\143\150\156\157\154\157\147 -\151\145\163\040\114\151\155\151\164\145\144\061\034\060\032\006 -\003\125\004\003\023\023\145\155\123\151\147\156\040\122\157\157 -\164\040\103\101\040\055\040\107\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\012\061\365\344\142\014\154\130\355\326\330 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "emSign ECC Root CA - G3" -# -# Issuer: CN=emSign ECC Root CA - G3,O=eMudhra Technologies Limited,OU=emSign PKI,C=IN -# Serial Number:3c:f6:07:a9:68:70:0e:da:8b:84 -# Subject: CN=emSign ECC Root CA - G3,O=eMudhra Technologies Limited,OU=emSign PKI,C=IN -# Not Valid Before: Sun Feb 18 18:30:00 2018 -# Not Valid After : Wed Feb 18 18:30:00 2043 -# Fingerprint (SHA-256): 86:A1:EC:BA:08:9C:4A:8D:3B:BE:27:34:C6:12:BA:34:1D:81:3E:04:3C:F9:E8:A8:62:CD:5C:57:A3:6B:BE:6B -# Fingerprint (SHA1): 30:43:FA:4F:F2:57:DC:A0:C3:80:EE:2E:58:EA:78:B2:3F:E6:BB:C1 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "emSign ECC Root CA - G3" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\153\061\013\060\011\006\003\125\004\006\023\002\111\116\061 -\023\060\021\006\003\125\004\013\023\012\145\155\123\151\147\156 -\040\120\113\111\061\045\060\043\006\003\125\004\012\023\034\145 -\115\165\144\150\162\141\040\124\145\143\150\156\157\154\157\147 -\151\145\163\040\114\151\155\151\164\145\144\061\040\060\036\006 -\003\125\004\003\023\027\145\155\123\151\147\156\040\105\103\103 -\040\122\157\157\164\040\103\101\040\055\040\107\063 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\153\061\013\060\011\006\003\125\004\006\023\002\111\116\061 -\023\060\021\006\003\125\004\013\023\012\145\155\123\151\147\156 -\040\120\113\111\061\045\060\043\006\003\125\004\012\023\034\145 -\115\165\144\150\162\141\040\124\145\143\150\156\157\154\157\147 -\151\145\163\040\114\151\155\151\164\145\144\061\040\060\036\006 -\003\125\004\003\023\027\145\155\123\151\147\156\040\105\103\103 -\040\122\157\157\164\040\103\101\040\055\040\107\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\012\074\366\007\251\150\160\016\332\213\204 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\116\060\202\001\323\240\003\002\001\002\002\012\074 -\366\007\251\150\160\016\332\213\204\060\012\006\010\052\206\110 -\316\075\004\003\003\060\153\061\013\060\011\006\003\125\004\006 -\023\002\111\116\061\023\060\021\006\003\125\004\013\023\012\145 -\155\123\151\147\156\040\120\113\111\061\045\060\043\006\003\125 -\004\012\023\034\145\115\165\144\150\162\141\040\124\145\143\150 -\156\157\154\157\147\151\145\163\040\114\151\155\151\164\145\144 -\061\040\060\036\006\003\125\004\003\023\027\145\155\123\151\147 -\156\040\105\103\103\040\122\157\157\164\040\103\101\040\055\040 -\107\063\060\036\027\015\061\070\060\062\061\070\061\070\063\060 -\060\060\132\027\015\064\063\060\062\061\070\061\070\063\060\060 -\060\132\060\153\061\013\060\011\006\003\125\004\006\023\002\111 -\116\061\023\060\021\006\003\125\004\013\023\012\145\155\123\151 -\147\156\040\120\113\111\061\045\060\043\006\003\125\004\012\023 -\034\145\115\165\144\150\162\141\040\124\145\143\150\156\157\154 -\157\147\151\145\163\040\114\151\155\151\164\145\144\061\040\060 -\036\006\003\125\004\003\023\027\145\155\123\151\147\156\040\105 -\103\103\040\122\157\157\164\040\103\101\040\055\040\107\063\060 -\166\060\020\006\007\052\206\110\316\075\002\001\006\005\053\201 -\004\000\042\003\142\000\004\043\245\014\270\055\022\365\050\363 -\261\262\335\342\002\022\200\236\071\137\111\115\237\311\045\064 -\131\164\354\273\006\034\347\300\162\257\350\256\057\341\101\124 -\207\024\250\112\262\350\174\202\346\133\152\265\334\263\165\316 -\213\006\320\206\043\277\106\325\216\017\077\004\364\327\034\222 -\176\366\245\143\302\365\137\216\056\117\241\030\031\002\053\062 -\012\202\144\175\026\223\321\243\102\060\100\060\035\006\003\125 -\035\016\004\026\004\024\174\135\002\204\023\324\314\212\233\201 -\316\027\034\056\051\036\234\110\143\102\060\016\006\003\125\035 -\017\001\001\377\004\004\003\002\001\006\060\017\006\003\125\035 -\023\001\001\377\004\005\060\003\001\001\377\060\012\006\010\052 -\206\110\316\075\004\003\003\003\151\000\060\146\002\061\000\276 -\363\141\317\002\020\035\144\225\007\270\030\156\210\205\005\057 -\203\010\027\220\312\037\212\114\350\015\033\172\261\255\325\201 -\011\107\357\073\254\010\004\174\134\231\261\355\107\007\322\002 -\061\000\235\272\125\374\251\112\350\355\355\346\166\001\102\173 -\310\370\140\331\215\121\213\125\073\373\214\173\353\145\011\303 -\370\226\315\107\250\202\362\026\125\167\044\176\022\020\225\004 -\054\243 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "emSign ECC Root CA - G3" -# Issuer: CN=emSign ECC Root CA - G3,O=eMudhra Technologies Limited,OU=emSign PKI,C=IN -# Serial Number:3c:f6:07:a9:68:70:0e:da:8b:84 -# Subject: CN=emSign ECC Root CA - G3,O=eMudhra Technologies Limited,OU=emSign PKI,C=IN -# Not Valid Before: Sun Feb 18 18:30:00 2018 -# Not Valid After : Wed Feb 18 18:30:00 2043 -# Fingerprint (SHA-256): 86:A1:EC:BA:08:9C:4A:8D:3B:BE:27:34:C6:12:BA:34:1D:81:3E:04:3C:F9:E8:A8:62:CD:5C:57:A3:6B:BE:6B -# Fingerprint (SHA1): 30:43:FA:4F:F2:57:DC:A0:C3:80:EE:2E:58:EA:78:B2:3F:E6:BB:C1 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "emSign ECC Root CA - G3" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\060\103\372\117\362\127\334\240\303\200\356\056\130\352\170\262 -\077\346\273\301 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\316\013\162\321\237\210\216\320\120\003\350\343\270\213\147\100 -END -CKA_ISSUER MULTILINE_OCTAL -\060\153\061\013\060\011\006\003\125\004\006\023\002\111\116\061 -\023\060\021\006\003\125\004\013\023\012\145\155\123\151\147\156 -\040\120\113\111\061\045\060\043\006\003\125\004\012\023\034\145 -\115\165\144\150\162\141\040\124\145\143\150\156\157\154\157\147 -\151\145\163\040\114\151\155\151\164\145\144\061\040\060\036\006 -\003\125\004\003\023\027\145\155\123\151\147\156\040\105\103\103 -\040\122\157\157\164\040\103\101\040\055\040\107\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\012\074\366\007\251\150\160\016\332\213\204 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "emSign Root CA - C1" -# -# Issuer: CN=emSign Root CA - C1,O=eMudhra Inc,OU=emSign PKI,C=US -# Serial Number:00:ae:cf:00:ba:c4:cf:32:f8:43:b2 -# Subject: CN=emSign Root CA - C1,O=eMudhra Inc,OU=emSign PKI,C=US -# Not Valid Before: Sun Feb 18 18:30:00 2018 -# Not Valid After : Wed Feb 18 18:30:00 2043 -# Fingerprint (SHA-256): 12:56:09:AA:30:1D:A0:A2:49:B9:7A:82:39:CB:6A:34:21:6F:44:DC:AC:9F:39:54:B1:42:92:F2:E8:C8:60:8F -# Fingerprint (SHA1): E7:2E:F1:DF:FC:B2:09:28:CF:5D:D4:D5:67:37:B1:51:CB:86:4F:01 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "emSign Root CA - C1" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\126\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\023\060\021\006\003\125\004\013\023\012\145\155\123\151\147\156 -\040\120\113\111\061\024\060\022\006\003\125\004\012\023\013\145 -\115\165\144\150\162\141\040\111\156\143\061\034\060\032\006\003 -\125\004\003\023\023\145\155\123\151\147\156\040\122\157\157\164 -\040\103\101\040\055\040\103\061 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\126\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\023\060\021\006\003\125\004\013\023\012\145\155\123\151\147\156 -\040\120\113\111\061\024\060\022\006\003\125\004\012\023\013\145 -\115\165\144\150\162\141\040\111\156\143\061\034\060\032\006\003 -\125\004\003\023\023\145\155\123\151\147\156\040\122\157\157\164 -\040\103\101\040\055\040\103\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\013\000\256\317\000\272\304\317\062\370\103\262 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\003\163\060\202\002\133\240\003\002\001\002\002\013\000 -\256\317\000\272\304\317\062\370\103\262\060\015\006\011\052\206 -\110\206\367\015\001\001\013\005\000\060\126\061\013\060\011\006 -\003\125\004\006\023\002\125\123\061\023\060\021\006\003\125\004 -\013\023\012\145\155\123\151\147\156\040\120\113\111\061\024\060 -\022\006\003\125\004\012\023\013\145\115\165\144\150\162\141\040 -\111\156\143\061\034\060\032\006\003\125\004\003\023\023\145\155 -\123\151\147\156\040\122\157\157\164\040\103\101\040\055\040\103 -\061\060\036\027\015\061\070\060\062\061\070\061\070\063\060\060 -\060\132\027\015\064\063\060\062\061\070\061\070\063\060\060\060 -\132\060\126\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\023\060\021\006\003\125\004\013\023\012\145\155\123\151\147 -\156\040\120\113\111\061\024\060\022\006\003\125\004\012\023\013 -\145\115\165\144\150\162\141\040\111\156\143\061\034\060\032\006 -\003\125\004\003\023\023\145\155\123\151\147\156\040\122\157\157 -\164\040\103\101\040\055\040\103\061\060\202\001\042\060\015\006 -\011\052\206\110\206\367\015\001\001\001\005\000\003\202\001\017 -\000\060\202\001\012\002\202\001\001\000\317\353\251\271\361\231 -\005\314\330\050\041\112\363\163\064\121\204\126\020\365\240\117 -\054\022\343\372\023\232\047\320\317\371\171\032\164\137\035\171 -\071\374\133\370\160\216\340\222\122\367\344\045\371\124\203\331 -\035\323\310\132\205\077\136\307\266\007\356\076\300\316\232\257 -\254\126\102\052\071\045\160\326\277\265\173\066\255\254\366\163 -\334\315\327\035\212\203\245\373\053\220\025\067\153\034\046\107 -\334\073\051\126\223\152\263\301\152\072\235\075\365\301\227\070 -\130\005\213\034\021\343\344\264\270\135\205\035\203\376\170\137 -\013\105\150\030\110\245\106\163\064\073\376\017\310\166\273\307 -\030\363\005\321\206\363\205\355\347\271\331\062\255\125\210\316 -\246\266\221\260\117\254\176\025\043\226\366\077\360\040\064\026 -\336\012\306\304\004\105\171\177\247\375\276\322\251\245\257\234 -\305\043\052\367\074\041\154\275\257\217\116\305\072\262\363\064 -\022\374\337\200\032\111\244\324\251\225\367\236\211\136\242\211 -\254\224\313\250\150\233\257\212\145\047\315\211\356\335\214\265 -\153\051\160\103\240\151\013\344\271\017\002\003\001\000\001\243 -\102\060\100\060\035\006\003\125\035\016\004\026\004\024\376\241 -\340\160\036\052\003\071\122\132\102\276\134\221\205\172\030\252 -\115\265\060\016\006\003\125\035\017\001\001\377\004\004\003\002 -\001\006\060\017\006\003\125\035\023\001\001\377\004\005\060\003 -\001\001\377\060\015\006\011\052\206\110\206\367\015\001\001\013 -\005\000\003\202\001\001\000\302\112\126\372\025\041\173\050\242 -\351\345\035\373\370\055\304\071\226\101\114\073\047\054\304\154 -\030\025\200\306\254\257\107\131\057\046\013\343\066\260\357\073 -\376\103\227\111\062\231\022\025\133\337\021\051\377\253\123\370 -\273\301\170\017\254\234\123\257\127\275\150\214\075\151\063\360 -\243\240\043\143\073\144\147\042\104\255\325\161\313\126\052\170 -\222\243\117\022\061\066\066\342\336\376\000\304\243\140\017\047 -\255\240\260\212\265\066\172\122\241\275\047\364\040\047\142\350 -\115\224\044\023\344\012\004\351\074\253\056\310\103\011\112\306 -\141\004\345\111\064\176\323\304\310\365\017\300\252\351\272\124 -\136\363\143\053\117\117\120\324\376\271\173\231\214\075\300\056 -\274\002\053\323\304\100\344\212\007\061\036\233\316\046\231\023 -\373\021\352\232\042\014\021\031\307\136\033\201\120\060\310\226 -\022\156\347\313\101\177\221\073\242\107\267\124\200\033\334\000 -\314\232\220\352\303\303\120\006\142\014\060\300\025\110\247\250 -\131\174\341\256\042\242\342\012\172\017\372\142\253\122\114\341 -\361\337\312\276\203\015\102 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "emSign Root CA - C1" -# Issuer: CN=emSign Root CA - C1,O=eMudhra Inc,OU=emSign PKI,C=US -# Serial Number:00:ae:cf:00:ba:c4:cf:32:f8:43:b2 -# Subject: CN=emSign Root CA - C1,O=eMudhra Inc,OU=emSign PKI,C=US -# Not Valid Before: Sun Feb 18 18:30:00 2018 -# Not Valid After : Wed Feb 18 18:30:00 2043 -# Fingerprint (SHA-256): 12:56:09:AA:30:1D:A0:A2:49:B9:7A:82:39:CB:6A:34:21:6F:44:DC:AC:9F:39:54:B1:42:92:F2:E8:C8:60:8F -# Fingerprint (SHA1): E7:2E:F1:DF:FC:B2:09:28:CF:5D:D4:D5:67:37:B1:51:CB:86:4F:01 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "emSign Root CA - C1" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\347\056\361\337\374\262\011\050\317\135\324\325\147\067\261\121 -\313\206\117\001 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\330\343\135\001\041\372\170\132\260\337\272\322\356\052\137\150 -END -CKA_ISSUER MULTILINE_OCTAL -\060\126\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\023\060\021\006\003\125\004\013\023\012\145\155\123\151\147\156 -\040\120\113\111\061\024\060\022\006\003\125\004\012\023\013\145 -\115\165\144\150\162\141\040\111\156\143\061\034\060\032\006\003 -\125\004\003\023\023\145\155\123\151\147\156\040\122\157\157\164 -\040\103\101\040\055\040\103\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\013\000\256\317\000\272\304\317\062\370\103\262 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "emSign ECC Root CA - C3" -# -# Issuer: CN=emSign ECC Root CA - C3,O=eMudhra Inc,OU=emSign PKI,C=US -# Serial Number:7b:71:b6:82:56:b8:12:7c:9c:a8 -# Subject: CN=emSign ECC Root CA - C3,O=eMudhra Inc,OU=emSign PKI,C=US -# Not Valid Before: Sun Feb 18 18:30:00 2018 -# Not Valid After : Wed Feb 18 18:30:00 2043 -# Fingerprint (SHA-256): BC:4D:80:9B:15:18:9D:78:DB:3E:1D:8C:F4:F9:72:6A:79:5D:A1:64:3C:A5:F1:35:8E:1D:DB:0E:DC:0D:7E:B3 -# Fingerprint (SHA1): B6:AF:43:C2:9B:81:53:7D:F6:EF:6B:C3:1F:1F:60:15:0C:EE:48:66 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "emSign ECC Root CA - C3" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\132\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\023\060\021\006\003\125\004\013\023\012\145\155\123\151\147\156 -\040\120\113\111\061\024\060\022\006\003\125\004\012\023\013\145 -\115\165\144\150\162\141\040\111\156\143\061\040\060\036\006\003 -\125\004\003\023\027\145\155\123\151\147\156\040\105\103\103\040 -\122\157\157\164\040\103\101\040\055\040\103\063 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\132\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\023\060\021\006\003\125\004\013\023\012\145\155\123\151\147\156 -\040\120\113\111\061\024\060\022\006\003\125\004\012\023\013\145 -\115\165\144\150\162\141\040\111\156\143\061\040\060\036\006\003 -\125\004\003\023\027\145\155\123\151\147\156\040\105\103\103\040 -\122\157\157\164\040\103\101\040\055\040\103\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\012\173\161\266\202\126\270\022\174\234\250 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\053\060\202\001\261\240\003\002\001\002\002\012\173 -\161\266\202\126\270\022\174\234\250\060\012\006\010\052\206\110 -\316\075\004\003\003\060\132\061\013\060\011\006\003\125\004\006 -\023\002\125\123\061\023\060\021\006\003\125\004\013\023\012\145 -\155\123\151\147\156\040\120\113\111\061\024\060\022\006\003\125 -\004\012\023\013\145\115\165\144\150\162\141\040\111\156\143\061 -\040\060\036\006\003\125\004\003\023\027\145\155\123\151\147\156 -\040\105\103\103\040\122\157\157\164\040\103\101\040\055\040\103 -\063\060\036\027\015\061\070\060\062\061\070\061\070\063\060\060 -\060\132\027\015\064\063\060\062\061\070\061\070\063\060\060\060 -\132\060\132\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\023\060\021\006\003\125\004\013\023\012\145\155\123\151\147 -\156\040\120\113\111\061\024\060\022\006\003\125\004\012\023\013 -\145\115\165\144\150\162\141\040\111\156\143\061\040\060\036\006 -\003\125\004\003\023\027\145\155\123\151\147\156\040\105\103\103 -\040\122\157\157\164\040\103\101\040\055\040\103\063\060\166\060 -\020\006\007\052\206\110\316\075\002\001\006\005\053\201\004\000 -\042\003\142\000\004\375\245\141\256\173\046\020\035\351\267\042 -\060\256\006\364\201\263\261\102\161\225\071\274\323\122\343\257 -\257\371\362\227\065\222\066\106\016\207\225\215\271\071\132\351 -\273\337\320\376\310\007\101\074\273\125\157\203\243\152\373\142 -\260\201\211\002\160\175\110\305\112\343\351\042\124\042\115\223 -\273\102\014\257\167\234\043\246\175\327\141\021\316\145\307\370 -\177\376\365\362\251\243\102\060\100\060\035\006\003\125\035\016 -\004\026\004\024\373\132\110\320\200\040\100\362\250\351\000\007 -\151\031\167\247\346\303\364\317\060\016\006\003\125\035\017\001 -\001\377\004\004\003\002\001\006\060\017\006\003\125\035\023\001 -\001\377\004\005\060\003\001\001\377\060\012\006\010\052\206\110 -\316\075\004\003\003\003\150\000\060\145\002\061\000\264\330\057 -\002\211\375\266\114\142\272\103\116\023\204\162\265\256\335\034 -\336\326\265\334\126\217\130\100\132\055\336\040\114\042\203\312 -\223\250\176\356\022\100\307\326\207\117\370\337\205\002\060\034 -\024\144\344\174\226\203\021\234\260\321\132\141\113\246\017\111 -\323\000\374\241\374\344\245\377\177\255\327\060\320\307\167\177 -\276\201\007\125\060\120\040\024\365\127\070\012\250\061\121 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "emSign ECC Root CA - C3" -# Issuer: CN=emSign ECC Root CA - C3,O=eMudhra Inc,OU=emSign PKI,C=US -# Serial Number:7b:71:b6:82:56:b8:12:7c:9c:a8 -# Subject: CN=emSign ECC Root CA - C3,O=eMudhra Inc,OU=emSign PKI,C=US -# Not Valid Before: Sun Feb 18 18:30:00 2018 -# Not Valid After : Wed Feb 18 18:30:00 2043 -# Fingerprint (SHA-256): BC:4D:80:9B:15:18:9D:78:DB:3E:1D:8C:F4:F9:72:6A:79:5D:A1:64:3C:A5:F1:35:8E:1D:DB:0E:DC:0D:7E:B3 -# Fingerprint (SHA1): B6:AF:43:C2:9B:81:53:7D:F6:EF:6B:C3:1F:1F:60:15:0C:EE:48:66 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "emSign ECC Root CA - C3" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\266\257\103\302\233\201\123\175\366\357\153\303\037\037\140\025 -\014\356\110\146 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\076\123\263\243\201\356\327\020\370\323\260\035\027\222\365\325 -END -CKA_ISSUER MULTILINE_OCTAL -\060\132\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\023\060\021\006\003\125\004\013\023\012\145\155\123\151\147\156 -\040\120\113\111\061\024\060\022\006\003\125\004\012\023\013\145 -\115\165\144\150\162\141\040\111\156\143\061\040\060\036\006\003 -\125\004\003\023\027\145\155\123\151\147\156\040\105\103\103\040 -\122\157\157\164\040\103\101\040\055\040\103\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\012\173\161\266\202\126\270\022\174\234\250 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Hongkong Post Root CA 3" -# -# Issuer: CN=Hongkong Post Root CA 3,O=Hongkong Post,L=Hong Kong,ST=Hong Kong,C=HK -# Serial Number:08:16:5f:8a:4c:a5:ec:00:c9:93:40:df:c4:c6:ae:23:b8:1c:5a:a4 -# Subject: CN=Hongkong Post Root CA 3,O=Hongkong Post,L=Hong Kong,ST=Hong Kong,C=HK -# Not Valid Before: Sat Jun 03 02:29:46 2017 -# Not Valid After : Tue Jun 03 02:29:46 2042 -# Fingerprint (SHA-256): 5A:2F:C0:3F:0C:83:B0:90:BB:FA:40:60:4B:09:88:44:6C:76:36:18:3D:F9:84:6E:17:10:1A:44:7F:B8:EF:D6 -# Fingerprint (SHA1): 58:A2:D0:EC:20:52:81:5B:C1:F3:F8:64:02:24:4E:C2:8E:02:4B:02 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Hongkong Post Root CA 3" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\157\061\013\060\011\006\003\125\004\006\023\002\110\113\061 -\022\060\020\006\003\125\004\010\023\011\110\157\156\147\040\113 -\157\156\147\061\022\060\020\006\003\125\004\007\023\011\110\157 -\156\147\040\113\157\156\147\061\026\060\024\006\003\125\004\012 -\023\015\110\157\156\147\153\157\156\147\040\120\157\163\164\061 -\040\060\036\006\003\125\004\003\023\027\110\157\156\147\153\157 -\156\147\040\120\157\163\164\040\122\157\157\164\040\103\101\040 -\063 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\157\061\013\060\011\006\003\125\004\006\023\002\110\113\061 -\022\060\020\006\003\125\004\010\023\011\110\157\156\147\040\113 -\157\156\147\061\022\060\020\006\003\125\004\007\023\011\110\157 -\156\147\040\113\157\156\147\061\026\060\024\006\003\125\004\012 -\023\015\110\157\156\147\153\157\156\147\040\120\157\163\164\061 -\040\060\036\006\003\125\004\003\023\027\110\157\156\147\153\157 -\156\147\040\120\157\163\164\040\122\157\157\164\040\103\101\040 -\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\010\026\137\212\114\245\354\000\311\223\100\337\304\306 -\256\043\270\034\132\244 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\317\060\202\003\267\240\003\002\001\002\002\024\010 -\026\137\212\114\245\354\000\311\223\100\337\304\306\256\043\270 -\034\132\244\060\015\006\011\052\206\110\206\367\015\001\001\013 -\005\000\060\157\061\013\060\011\006\003\125\004\006\023\002\110 -\113\061\022\060\020\006\003\125\004\010\023\011\110\157\156\147 -\040\113\157\156\147\061\022\060\020\006\003\125\004\007\023\011 -\110\157\156\147\040\113\157\156\147\061\026\060\024\006\003\125 -\004\012\023\015\110\157\156\147\153\157\156\147\040\120\157\163 -\164\061\040\060\036\006\003\125\004\003\023\027\110\157\156\147 -\153\157\156\147\040\120\157\163\164\040\122\157\157\164\040\103 -\101\040\063\060\036\027\015\061\067\060\066\060\063\060\062\062 -\071\064\066\132\027\015\064\062\060\066\060\063\060\062\062\071 -\064\066\132\060\157\061\013\060\011\006\003\125\004\006\023\002 -\110\113\061\022\060\020\006\003\125\004\010\023\011\110\157\156 -\147\040\113\157\156\147\061\022\060\020\006\003\125\004\007\023 -\011\110\157\156\147\040\113\157\156\147\061\026\060\024\006\003 -\125\004\012\023\015\110\157\156\147\153\157\156\147\040\120\157 -\163\164\061\040\060\036\006\003\125\004\003\023\027\110\157\156 -\147\153\157\156\147\040\120\157\163\164\040\122\157\157\164\040 -\103\101\040\063\060\202\002\042\060\015\006\011\052\206\110\206 -\367\015\001\001\001\005\000\003\202\002\017\000\060\202\002\012 -\002\202\002\001\000\263\210\327\352\316\017\040\116\276\346\326 -\003\155\356\131\374\302\127\337\051\150\241\203\016\076\150\307 -\150\130\234\034\140\113\211\103\014\271\324\025\262\356\301\116 -\165\351\265\247\357\345\351\065\231\344\314\034\347\113\137\215 -\063\060\040\063\123\331\246\273\325\076\023\216\351\037\207\111 -\255\120\055\120\312\030\276\001\130\242\023\160\226\273\211\210 -\126\200\134\370\275\054\074\341\114\127\210\273\323\271\225\357 -\313\307\366\332\061\164\050\246\346\124\211\365\101\061\312\345 -\046\032\315\202\340\160\332\073\051\273\325\003\365\231\272\125 -\365\144\321\140\016\263\211\111\270\212\057\005\322\204\105\050 -\174\217\150\120\022\170\374\013\265\123\313\302\230\034\204\243 -\236\260\276\043\244\332\334\310\053\036\332\156\105\036\211\230 -\332\371\000\056\006\351\014\073\160\325\120\045\210\231\313\315 -\163\140\367\325\377\065\147\305\241\274\136\253\315\112\270\105 -\353\310\150\036\015\015\024\106\022\343\322\144\142\212\102\230 -\274\264\306\010\010\370\375\250\114\144\234\166\001\275\057\251 -\154\063\017\330\077\050\270\074\151\001\102\206\176\151\301\311 -\006\312\345\172\106\145\351\302\326\120\101\056\077\267\344\355 -\154\327\277\046\001\021\242\026\051\112\153\064\006\220\354\023 -\322\266\373\152\166\322\074\355\360\326\055\335\341\025\354\243 -\233\057\054\311\076\053\344\151\073\377\162\045\261\066\206\133 -\307\177\153\213\125\033\112\305\040\141\075\256\313\120\341\010 -\072\276\260\217\143\101\123\060\010\131\074\230\035\167\272\143 -\221\172\312\020\120\140\277\360\327\274\225\207\217\227\305\376 -\227\152\001\224\243\174\133\205\035\052\071\072\320\124\241\321 -\071\161\235\375\041\371\265\173\360\342\340\002\217\156\226\044 -\045\054\240\036\054\250\304\211\247\357\355\231\006\057\266\012 -\114\117\333\242\314\067\032\257\107\205\055\212\137\304\064\064 -\114\000\375\030\223\147\023\321\067\346\110\264\213\006\305\127 -\173\031\206\012\171\313\000\311\122\257\102\377\067\217\341\243 -\036\172\075\120\253\143\006\347\025\265\077\266\105\067\224\067 -\261\176\362\110\303\177\305\165\376\227\215\105\217\032\247\032 -\162\050\032\100\017\002\003\001\000\001\243\143\060\141\060\017 -\006\003\125\035\023\001\001\377\004\005\060\003\001\001\377\060 -\016\006\003\125\035\017\001\001\377\004\004\003\002\001\006\060 -\037\006\003\125\035\043\004\030\060\026\200\024\027\235\315\036 -\213\326\071\053\160\323\134\324\240\270\037\260\000\374\305\141 -\060\035\006\003\125\035\016\004\026\004\024\027\235\315\036\213 -\326\071\053\160\323\134\324\240\270\037\260\000\374\305\141\060 -\015\006\011\052\206\110\206\367\015\001\001\013\005\000\003\202 -\002\001\000\126\325\173\156\346\042\001\322\102\233\030\325\016 -\327\146\043\134\343\376\240\307\222\322\351\224\255\113\242\306 -\354\022\174\164\325\110\322\131\024\231\300\353\271\321\353\364 -\110\060\133\255\247\127\163\231\251\323\345\267\321\056\131\044 -\130\334\150\056\056\142\330\152\344\160\013\055\040\120\040\244 -\062\225\321\000\230\273\323\375\367\062\362\111\256\306\172\340 -\107\276\156\316\313\243\162\072\055\151\135\313\310\350\105\071 -\324\372\102\301\021\114\167\135\222\373\152\377\130\104\345\353 -\201\236\257\240\231\255\276\251\001\146\313\070\035\074\337\103 -\037\364\115\156\264\272\027\106\374\175\375\207\201\171\152\015 -\063\017\372\057\370\024\271\200\263\135\115\252\227\341\371\344 -\030\305\370\325\070\214\046\074\375\362\050\342\356\132\111\210 -\054\337\171\075\216\236\220\074\275\101\112\072\335\133\366\232 -\264\316\077\045\060\177\062\175\242\003\224\320\334\172\241\122 -\336\156\223\215\030\046\375\125\254\275\217\233\322\317\257\347 -\206\054\313\037\011\157\243\157\251\204\324\163\277\115\241\164 -\033\116\043\140\362\314\016\252\177\244\234\114\045\250\262\146 -\073\070\377\331\224\060\366\162\204\276\150\125\020\017\306\163 -\054\026\151\223\007\376\261\105\355\273\242\125\152\260\332\265 -\112\002\045\047\205\327\267\267\206\104\026\211\154\200\053\076 -\227\251\234\325\176\125\114\306\336\105\020\034\352\351\073\237 -\003\123\356\356\172\001\002\026\170\324\350\302\276\106\166\210 -\023\077\042\273\110\022\035\122\000\264\002\176\041\032\036\234 -\045\364\363\075\136\036\322\034\371\263\055\266\367\067\134\306 -\313\041\116\260\367\231\107\030\205\301\053\272\125\256\006\352 -\320\007\262\334\253\320\202\226\165\316\322\120\376\231\347\317 -\057\237\347\166\321\141\052\373\041\273\061\320\252\237\107\244 -\262\042\312\026\072\120\127\304\133\103\147\305\145\142\003\111 -\001\353\103\331\330\370\236\255\317\261\143\016\105\364\240\132 -\054\233\055\305\246\300\255\250\107\364\047\114\070\015\056\033 -\111\073\122\364\350\210\203\053\124\050\324\362\065\122\264\062 -\203\142\151\144\014\221\234\237\227\352\164\026\375\037\021\006 -\232\233\364 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Hongkong Post Root CA 3" -# Issuer: CN=Hongkong Post Root CA 3,O=Hongkong Post,L=Hong Kong,ST=Hong Kong,C=HK -# Serial Number:08:16:5f:8a:4c:a5:ec:00:c9:93:40:df:c4:c6:ae:23:b8:1c:5a:a4 -# Subject: CN=Hongkong Post Root CA 3,O=Hongkong Post,L=Hong Kong,ST=Hong Kong,C=HK -# Not Valid Before: Sat Jun 03 02:29:46 2017 -# Not Valid After : Tue Jun 03 02:29:46 2042 -# Fingerprint (SHA-256): 5A:2F:C0:3F:0C:83:B0:90:BB:FA:40:60:4B:09:88:44:6C:76:36:18:3D:F9:84:6E:17:10:1A:44:7F:B8:EF:D6 -# Fingerprint (SHA1): 58:A2:D0:EC:20:52:81:5B:C1:F3:F8:64:02:24:4E:C2:8E:02:4B:02 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Hongkong Post Root CA 3" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\130\242\320\354\040\122\201\133\301\363\370\144\002\044\116\302 -\216\002\113\002 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\021\374\237\275\163\060\002\212\375\077\363\130\271\313\040\360 -END -CKA_ISSUER MULTILINE_OCTAL -\060\157\061\013\060\011\006\003\125\004\006\023\002\110\113\061 -\022\060\020\006\003\125\004\010\023\011\110\157\156\147\040\113 -\157\156\147\061\022\060\020\006\003\125\004\007\023\011\110\157 -\156\147\040\113\157\156\147\061\026\060\024\006\003\125\004\012 -\023\015\110\157\156\147\153\157\156\147\040\120\157\163\164\061 -\040\060\036\006\003\125\004\003\023\027\110\157\156\147\153\157 -\156\147\040\120\157\163\164\040\122\157\157\164\040\103\101\040 -\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\010\026\137\212\114\245\354\000\311\223\100\337\304\306 -\256\043\270\034\132\244 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Entrust Root Certification Authority - G4" -# -# Issuer: CN=Entrust Root Certification Authority - G4,OU="(c) 2015 Entrust, Inc. - for authorized use only",OU=See www.entrust.net/legal-terms,O="Entrust, Inc.",C=US -# Serial Number:00:d9:b5:43:7f:af:a9:39:0f:00:00:00:00:55:65:ad:58 -# Subject: CN=Entrust Root Certification Authority - G4,OU="(c) 2015 Entrust, Inc. - for authorized use only",OU=See www.entrust.net/legal-terms,O="Entrust, Inc.",C=US -# Not Valid Before: Wed May 27 11:11:16 2015 -# Not Valid After : Sun Dec 27 11:41:16 2037 -# Fingerprint (SHA-256): DB:35:17:D1:F6:73:2A:2D:5A:B9:7C:53:3E:C7:07:79:EE:32:70:A6:2F:B4:AC:42:38:37:24:60:E6:F0:1E:88 -# Fingerprint (SHA1): 14:88:4E:86:26:37:B0:26:AF:59:62:5C:40:77:EC:35:29:BA:96:01 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Entrust Root Certification Authority - G4" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\201\276\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\026\060\024\006\003\125\004\012\023\015\105\156\164\162\165 -\163\164\054\040\111\156\143\056\061\050\060\046\006\003\125\004 -\013\023\037\123\145\145\040\167\167\167\056\145\156\164\162\165 -\163\164\056\156\145\164\057\154\145\147\141\154\055\164\145\162 -\155\163\061\071\060\067\006\003\125\004\013\023\060\050\143\051 -\040\062\060\061\065\040\105\156\164\162\165\163\164\054\040\111 -\156\143\056\040\055\040\146\157\162\040\141\165\164\150\157\162 -\151\172\145\144\040\165\163\145\040\157\156\154\171\061\062\060 -\060\006\003\125\004\003\023\051\105\156\164\162\165\163\164\040 -\122\157\157\164\040\103\145\162\164\151\146\151\143\141\164\151 -\157\156\040\101\165\164\150\157\162\151\164\171\040\055\040\107 -\064 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\201\276\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\026\060\024\006\003\125\004\012\023\015\105\156\164\162\165 -\163\164\054\040\111\156\143\056\061\050\060\046\006\003\125\004 -\013\023\037\123\145\145\040\167\167\167\056\145\156\164\162\165 -\163\164\056\156\145\164\057\154\145\147\141\154\055\164\145\162 -\155\163\061\071\060\067\006\003\125\004\013\023\060\050\143\051 -\040\062\060\061\065\040\105\156\164\162\165\163\164\054\040\111 -\156\143\056\040\055\040\146\157\162\040\141\165\164\150\157\162 -\151\172\145\144\040\165\163\145\040\157\156\154\171\061\062\060 -\060\006\003\125\004\003\023\051\105\156\164\162\165\163\164\040 -\122\157\157\164\040\103\145\162\164\151\146\151\143\141\164\151 -\157\156\040\101\165\164\150\157\162\151\164\171\040\055\040\107 -\064 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\021\000\331\265\103\177\257\251\071\017\000\000\000\000\125 -\145\255\130 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\006\113\060\202\004\063\240\003\002\001\002\002\021\000 -\331\265\103\177\257\251\071\017\000\000\000\000\125\145\255\130 -\060\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060 -\201\276\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\026\060\024\006\003\125\004\012\023\015\105\156\164\162\165\163 -\164\054\040\111\156\143\056\061\050\060\046\006\003\125\004\013 -\023\037\123\145\145\040\167\167\167\056\145\156\164\162\165\163 -\164\056\156\145\164\057\154\145\147\141\154\055\164\145\162\155 -\163\061\071\060\067\006\003\125\004\013\023\060\050\143\051\040 -\062\060\061\065\040\105\156\164\162\165\163\164\054\040\111\156 -\143\056\040\055\040\146\157\162\040\141\165\164\150\157\162\151 -\172\145\144\040\165\163\145\040\157\156\154\171\061\062\060\060 -\006\003\125\004\003\023\051\105\156\164\162\165\163\164\040\122 -\157\157\164\040\103\145\162\164\151\146\151\143\141\164\151\157 -\156\040\101\165\164\150\157\162\151\164\171\040\055\040\107\064 -\060\036\027\015\061\065\060\065\062\067\061\061\061\061\061\066 -\132\027\015\063\067\061\062\062\067\061\061\064\061\061\066\132 -\060\201\276\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\026\060\024\006\003\125\004\012\023\015\105\156\164\162\165 -\163\164\054\040\111\156\143\056\061\050\060\046\006\003\125\004 -\013\023\037\123\145\145\040\167\167\167\056\145\156\164\162\165 -\163\164\056\156\145\164\057\154\145\147\141\154\055\164\145\162 -\155\163\061\071\060\067\006\003\125\004\013\023\060\050\143\051 -\040\062\060\061\065\040\105\156\164\162\165\163\164\054\040\111 -\156\143\056\040\055\040\146\157\162\040\141\165\164\150\157\162 -\151\172\145\144\040\165\163\145\040\157\156\154\171\061\062\060 -\060\006\003\125\004\003\023\051\105\156\164\162\165\163\164\040 -\122\157\157\164\040\103\145\162\164\151\146\151\143\141\164\151 -\157\156\040\101\165\164\150\157\162\151\164\171\040\055\040\107 -\064\060\202\002\042\060\015\006\011\052\206\110\206\367\015\001 -\001\001\005\000\003\202\002\017\000\060\202\002\012\002\202\002 -\001\000\261\354\054\102\356\342\321\060\377\245\222\107\342\055 -\303\272\144\227\155\312\367\015\265\131\301\263\313\250\150\031 -\330\257\204\155\060\160\135\176\363\056\322\123\231\341\376\037 -\136\331\110\257\135\023\215\333\377\143\063\115\323\000\002\274 -\304\370\321\006\010\224\171\130\212\025\336\051\263\375\375\304 -\117\350\252\342\240\073\171\315\277\153\103\062\335\331\164\020 -\271\367\364\150\324\273\320\207\325\252\113\212\052\157\052\004 -\265\262\246\307\240\172\346\110\253\322\321\131\314\326\176\043 -\346\227\154\360\102\345\334\121\113\025\101\355\111\112\311\336 -\020\227\326\166\301\357\245\265\066\024\227\065\330\170\042\065 -\122\357\103\275\333\047\333\141\126\202\064\334\313\210\140\014 -\013\132\345\054\001\306\124\257\327\252\301\020\173\322\005\132 -\270\100\236\206\247\303\220\206\002\126\122\011\172\234\322\047 -\202\123\112\145\122\152\365\074\347\250\362\234\257\213\275\323 -\016\324\324\136\156\207\236\152\075\105\035\321\135\033\364\351 -\012\254\140\231\373\211\264\377\230\054\317\174\035\351\002\252 -\004\232\036\270\334\210\156\045\263\154\146\367\074\220\363\127 -\301\263\057\365\155\362\373\312\241\370\051\235\106\213\263\152 -\366\346\147\007\276\054\147\012\052\037\132\262\076\127\304\323 -\041\041\143\145\122\221\033\261\231\216\171\176\346\353\215\000 -\331\132\252\352\163\350\244\202\002\107\226\376\133\216\124\141 -\243\353\057\113\060\260\213\043\165\162\174\041\074\310\366\361 -\164\324\034\173\243\005\125\356\273\115\073\062\276\232\167\146 -\236\254\151\220\042\007\037\141\072\226\276\345\232\117\314\005 -\074\050\131\323\301\014\124\250\131\141\275\310\162\114\350\334 -\237\207\177\275\234\110\066\136\225\243\016\271\070\044\125\374 -\165\146\353\002\343\010\064\051\112\306\343\053\057\063\240\332 -\243\206\245\022\227\375\200\053\332\024\102\343\222\275\076\362 -\135\136\147\164\056\034\210\107\051\064\137\342\062\250\234\045 -\067\214\272\230\000\227\213\111\226\036\375\045\212\254\334\332 -\330\135\164\156\146\260\377\104\337\241\030\306\276\110\057\067 -\224\170\370\225\112\077\177\023\136\135\131\375\164\206\103\143 -\163\111\002\003\001\000\001\243\102\060\100\060\017\006\003\125 -\035\023\001\001\377\004\005\060\003\001\001\377\060\016\006\003 -\125\035\017\001\001\377\004\004\003\002\001\006\060\035\006\003 -\125\035\016\004\026\004\024\237\070\304\126\043\303\071\350\240 -\161\154\350\124\114\344\350\072\261\277\147\060\015\006\011\052 -\206\110\206\367\015\001\001\013\005\000\003\202\002\001\000\022 -\345\102\246\173\213\017\014\344\106\245\266\140\100\207\214\045 -\176\255\270\150\056\133\306\100\166\074\003\370\311\131\364\363 -\253\142\316\020\215\264\132\144\214\150\300\260\162\103\064\322 -\033\013\366\054\123\322\312\220\113\206\146\374\252\203\042\364 -\213\032\157\046\110\254\166\167\010\277\305\230\134\364\046\211 -\236\173\303\271\144\062\001\177\323\303\335\130\155\354\261\253 -\204\125\164\167\204\004\047\122\153\206\114\316\335\271\145\377 -\326\306\136\237\232\020\231\113\165\152\376\152\351\227\040\344 -\344\166\172\306\320\044\252\220\315\040\220\272\107\144\373\177 -\007\263\123\170\265\012\142\362\163\103\316\101\053\201\152\056 -\205\026\224\123\324\153\137\162\042\253\121\055\102\325\000\234 -\231\277\336\273\224\073\127\375\232\365\206\313\126\073\133\210 -\001\345\174\050\113\003\371\111\203\174\262\177\174\343\355\216 -\241\177\140\123\216\125\235\120\064\022\017\267\227\173\154\207 -\112\104\347\365\155\354\200\067\360\130\031\156\112\150\166\360 -\037\222\344\352\265\222\323\141\121\020\013\255\247\331\137\307 -\137\334\037\243\134\214\241\176\233\267\236\323\126\157\146\136 -\007\226\040\355\013\164\373\146\116\213\021\025\351\201\111\176 -\157\260\324\120\177\042\327\137\145\002\015\246\364\205\036\330 -\256\006\113\112\247\322\061\146\302\370\316\345\010\246\244\002 -\226\104\150\127\304\325\063\317\031\057\024\304\224\034\173\244 -\331\360\237\016\261\200\342\321\236\021\144\251\210\021\072\166 -\202\345\142\302\200\330\244\203\355\223\357\174\057\220\260\062 -\114\226\025\150\110\122\324\231\010\300\044\350\034\343\263\245 -\041\016\222\300\220\037\317\040\137\312\073\070\307\267\155\072 -\363\346\104\270\016\061\153\210\216\160\353\234\027\122\250\101 -\224\056\207\266\347\246\022\305\165\337\133\300\012\156\173\244 -\344\136\206\371\066\224\337\167\303\351\015\300\071\361\171\273 -\106\216\253\103\131\047\267\040\273\043\351\126\100\041\354\061 -\075\145\252\103\362\075\337\160\104\341\272\115\046\020\073\230 -\237\363\310\216\033\070\126\041\152\121\223\323\221\312\106\332 -\211\267\075\123\203\054\010\037\213\217\123\335\377\254\037 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE - -# Trust for "Entrust Root Certification Authority - G4" -# Issuer: CN=Entrust Root Certification Authority - G4,OU="(c) 2015 Entrust, Inc. - for authorized use only",OU=See www.entrust.net/legal-terms,O="Entrust, Inc.",C=US -# Serial Number:00:d9:b5:43:7f:af:a9:39:0f:00:00:00:00:55:65:ad:58 -# Subject: CN=Entrust Root Certification Authority - G4,OU="(c) 2015 Entrust, Inc. - for authorized use only",OU=See www.entrust.net/legal-terms,O="Entrust, Inc.",C=US -# Not Valid Before: Wed May 27 11:11:16 2015 -# Not Valid After : Sun Dec 27 11:41:16 2037 -# Fingerprint (SHA-256): DB:35:17:D1:F6:73:2A:2D:5A:B9:7C:53:3E:C7:07:79:EE:32:70:A6:2F:B4:AC:42:38:37:24:60:E6:F0:1E:88 -# Fingerprint (SHA1): 14:88:4E:86:26:37:B0:26:AF:59:62:5C:40:77:EC:35:29:BA:96:01 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Entrust Root Certification Authority - G4" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\024\210\116\206\046\067\260\046\257\131\142\134\100\167\354\065 -\051\272\226\001 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\211\123\361\203\043\267\174\216\005\361\214\161\070\116\037\210 -END -CKA_ISSUER MULTILINE_OCTAL -\060\201\276\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\026\060\024\006\003\125\004\012\023\015\105\156\164\162\165 -\163\164\054\040\111\156\143\056\061\050\060\046\006\003\125\004 -\013\023\037\123\145\145\040\167\167\167\056\145\156\164\162\165 -\163\164\056\156\145\164\057\154\145\147\141\154\055\164\145\162 -\155\163\061\071\060\067\006\003\125\004\013\023\060\050\143\051 -\040\062\060\061\065\040\105\156\164\162\165\163\164\054\040\111 -\156\143\056\040\055\040\146\157\162\040\141\165\164\150\157\162 -\151\172\145\144\040\165\163\145\040\157\156\154\171\061\062\060 -\060\006\003\125\004\003\023\051\105\156\164\162\165\163\164\040 -\122\157\157\164\040\103\145\162\164\151\146\151\143\141\164\151 -\157\156\040\101\165\164\150\157\162\151\164\171\040\055\040\107 -\064 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\021\000\331\265\103\177\257\251\071\017\000\000\000\000\125 -\145\255\130 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Microsoft ECC Root Certificate Authority 2017" -# -# Issuer: CN=Microsoft ECC Root Certificate Authority 2017,O=Microsoft Corporation,C=US -# Serial Number:66:f2:3d:af:87:de:8b:b1:4a:ea:0c:57:31:01:c2:ec -# Subject: CN=Microsoft ECC Root Certificate Authority 2017,O=Microsoft Corporation,C=US -# Not Valid Before: Wed Dec 18 23:06:45 2019 -# Not Valid After : Fri Jul 18 23:16:04 2042 -# Fingerprint (SHA-256): 35:8D:F3:9D:76:4A:F9:E1:B7:66:E9:C9:72:DF:35:2E:E1:5C:FA:C2:27:AF:6A:D1:D7:0E:8E:4A:6E:DC:BA:02 -# Fingerprint (SHA1): 99:9A:64:C3:7F:F4:7D:9F:AB:95:F1:47:69:89:14:60:EE:C4:C3:C5 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Microsoft ECC Root Certificate Authority 2017" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\145\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\036\060\034\006\003\125\004\012\023\025\115\151\143\162\157\163 -\157\146\164\040\103\157\162\160\157\162\141\164\151\157\156\061 -\066\060\064\006\003\125\004\003\023\055\115\151\143\162\157\163 -\157\146\164\040\105\103\103\040\122\157\157\164\040\103\145\162 -\164\151\146\151\143\141\164\145\040\101\165\164\150\157\162\151 -\164\171\040\062\060\061\067 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\145\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\036\060\034\006\003\125\004\012\023\025\115\151\143\162\157\163 -\157\146\164\040\103\157\162\160\157\162\141\164\151\157\156\061 -\066\060\064\006\003\125\004\003\023\055\115\151\143\162\157\163 -\157\146\164\040\105\103\103\040\122\157\157\164\040\103\145\162 -\164\151\146\151\143\141\164\145\040\101\165\164\150\157\162\151 -\164\171\040\062\060\061\067 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\146\362\075\257\207\336\213\261\112\352\014\127\061\001 -\302\354 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\131\060\202\001\337\240\003\002\001\002\002\020\146 -\362\075\257\207\336\213\261\112\352\014\127\061\001\302\354\060 -\012\006\010\052\206\110\316\075\004\003\003\060\145\061\013\060 -\011\006\003\125\004\006\023\002\125\123\061\036\060\034\006\003 -\125\004\012\023\025\115\151\143\162\157\163\157\146\164\040\103 -\157\162\160\157\162\141\164\151\157\156\061\066\060\064\006\003 -\125\004\003\023\055\115\151\143\162\157\163\157\146\164\040\105 -\103\103\040\122\157\157\164\040\103\145\162\164\151\146\151\143 -\141\164\145\040\101\165\164\150\157\162\151\164\171\040\062\060 -\061\067\060\036\027\015\061\071\061\062\061\070\062\063\060\066 -\064\065\132\027\015\064\062\060\067\061\070\062\063\061\066\060 -\064\132\060\145\061\013\060\011\006\003\125\004\006\023\002\125 -\123\061\036\060\034\006\003\125\004\012\023\025\115\151\143\162 -\157\163\157\146\164\040\103\157\162\160\157\162\141\164\151\157 -\156\061\066\060\064\006\003\125\004\003\023\055\115\151\143\162 -\157\163\157\146\164\040\105\103\103\040\122\157\157\164\040\103 -\145\162\164\151\146\151\143\141\164\145\040\101\165\164\150\157 -\162\151\164\171\040\062\060\061\067\060\166\060\020\006\007\052 -\206\110\316\075\002\001\006\005\053\201\004\000\042\003\142\000 -\004\324\274\075\002\102\165\101\023\043\315\200\004\206\002\121 -\057\152\250\201\142\013\145\314\366\312\235\036\157\112\146\121 -\242\003\331\235\221\372\266\026\261\214\156\336\174\315\333\171 -\246\057\316\273\316\161\057\345\245\253\050\354\143\004\146\231 -\370\372\362\223\020\005\341\201\050\102\343\306\150\364\346\033 -\204\140\112\211\257\355\171\017\073\316\361\366\104\365\001\170 -\300\243\124\060\122\060\016\006\003\125\035\017\001\001\377\004 -\004\003\002\001\206\060\017\006\003\125\035\023\001\001\377\004 -\005\060\003\001\001\377\060\035\006\003\125\035\016\004\026\004 -\024\310\313\231\162\160\122\014\370\346\276\262\004\127\051\052 -\317\102\020\355\065\060\020\006\011\053\006\001\004\001\202\067 -\025\001\004\003\002\001\000\060\012\006\010\052\206\110\316\075 -\004\003\003\003\150\000\060\145\002\060\130\362\115\352\014\371 -\137\136\356\140\051\313\072\362\333\326\062\204\031\077\174\325 -\057\302\261\314\223\256\120\273\011\062\306\306\355\176\311\066 -\224\022\344\150\205\006\242\033\320\057\002\061\000\231\351\026 -\264\016\372\126\110\324\244\060\026\221\170\333\124\214\145\001 -\212\347\120\146\302\061\267\071\272\270\032\042\007\116\374\153 -\124\026\040\377\053\265\347\114\014\115\246\117\163 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Microsoft ECC Root Certificate Authority 2017" -# Issuer: CN=Microsoft ECC Root Certificate Authority 2017,O=Microsoft Corporation,C=US -# Serial Number:66:f2:3d:af:87:de:8b:b1:4a:ea:0c:57:31:01:c2:ec -# Subject: CN=Microsoft ECC Root Certificate Authority 2017,O=Microsoft Corporation,C=US -# Not Valid Before: Wed Dec 18 23:06:45 2019 -# Not Valid After : Fri Jul 18 23:16:04 2042 -# Fingerprint (SHA-256): 35:8D:F3:9D:76:4A:F9:E1:B7:66:E9:C9:72:DF:35:2E:E1:5C:FA:C2:27:AF:6A:D1:D7:0E:8E:4A:6E:DC:BA:02 -# Fingerprint (SHA1): 99:9A:64:C3:7F:F4:7D:9F:AB:95:F1:47:69:89:14:60:EE:C4:C3:C5 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Microsoft ECC Root Certificate Authority 2017" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\231\232\144\303\177\364\175\237\253\225\361\107\151\211\024\140 -\356\304\303\305 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\335\241\003\346\112\223\020\321\277\360\031\102\313\376\355\147 -END -CKA_ISSUER MULTILINE_OCTAL -\060\145\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\036\060\034\006\003\125\004\012\023\025\115\151\143\162\157\163 -\157\146\164\040\103\157\162\160\157\162\141\164\151\157\156\061 -\066\060\064\006\003\125\004\003\023\055\115\151\143\162\157\163 -\157\146\164\040\105\103\103\040\122\157\157\164\040\103\145\162 -\164\151\146\151\143\141\164\145\040\101\165\164\150\157\162\151 -\164\171\040\062\060\061\067 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\146\362\075\257\207\336\213\261\112\352\014\127\061\001 -\302\354 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Microsoft RSA Root Certificate Authority 2017" -# -# Issuer: CN=Microsoft RSA Root Certificate Authority 2017,O=Microsoft Corporation,C=US -# Serial Number:1e:d3:97:09:5f:d8:b4:b3:47:70:1e:aa:be:7f:45:b3 -# Subject: CN=Microsoft RSA Root Certificate Authority 2017,O=Microsoft Corporation,C=US -# Not Valid Before: Wed Dec 18 22:51:22 2019 -# Not Valid After : Fri Jul 18 23:00:23 2042 -# Fingerprint (SHA-256): C7:41:F7:0F:4B:2A:8D:88:BF:2E:71:C1:41:22:EF:53:EF:10:EB:A0:CF:A5:E6:4C:FA:20:F4:18:85:30:73:E0 -# Fingerprint (SHA1): 73:A5:E6:4A:3B:FF:83:16:FF:0E:DC:CC:61:8A:90:6E:4E:AE:4D:74 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Microsoft RSA Root Certificate Authority 2017" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\145\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\036\060\034\006\003\125\004\012\023\025\115\151\143\162\157\163 -\157\146\164\040\103\157\162\160\157\162\141\164\151\157\156\061 -\066\060\064\006\003\125\004\003\023\055\115\151\143\162\157\163 -\157\146\164\040\122\123\101\040\122\157\157\164\040\103\145\162 -\164\151\146\151\143\141\164\145\040\101\165\164\150\157\162\151 -\164\171\040\062\060\061\067 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\145\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\036\060\034\006\003\125\004\012\023\025\115\151\143\162\157\163 -\157\146\164\040\103\157\162\160\157\162\141\164\151\157\156\061 -\066\060\064\006\003\125\004\003\023\055\115\151\143\162\157\163 -\157\146\164\040\122\123\101\040\122\157\157\164\040\103\145\162 -\164\151\146\151\143\141\164\145\040\101\165\164\150\157\162\151 -\164\171\040\062\060\061\067 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\036\323\227\011\137\330\264\263\107\160\036\252\276\177 -\105\263 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\250\060\202\003\220\240\003\002\001\002\002\020\036 -\323\227\011\137\330\264\263\107\160\036\252\276\177\105\263\060 -\015\006\011\052\206\110\206\367\015\001\001\014\005\000\060\145 -\061\013\060\011\006\003\125\004\006\023\002\125\123\061\036\060 -\034\006\003\125\004\012\023\025\115\151\143\162\157\163\157\146 -\164\040\103\157\162\160\157\162\141\164\151\157\156\061\066\060 -\064\006\003\125\004\003\023\055\115\151\143\162\157\163\157\146 -\164\040\122\123\101\040\122\157\157\164\040\103\145\162\164\151 -\146\151\143\141\164\145\040\101\165\164\150\157\162\151\164\171 -\040\062\060\061\067\060\036\027\015\061\071\061\062\061\070\062 -\062\065\061\062\062\132\027\015\064\062\060\067\061\070\062\063 -\060\060\062\063\132\060\145\061\013\060\011\006\003\125\004\006 -\023\002\125\123\061\036\060\034\006\003\125\004\012\023\025\115 -\151\143\162\157\163\157\146\164\040\103\157\162\160\157\162\141 -\164\151\157\156\061\066\060\064\006\003\125\004\003\023\055\115 -\151\143\162\157\163\157\146\164\040\122\123\101\040\122\157\157 -\164\040\103\145\162\164\151\146\151\143\141\164\145\040\101\165 -\164\150\157\162\151\164\171\040\062\060\061\067\060\202\002\042 -\060\015\006\011\052\206\110\206\367\015\001\001\001\005\000\003 -\202\002\017\000\060\202\002\012\002\202\002\001\000\312\133\276 -\224\063\214\051\225\221\026\012\225\275\107\142\301\211\363\231 -\066\337\106\220\311\245\355\170\152\157\107\221\150\370\047\147 -\120\063\035\241\246\373\340\345\103\243\204\002\127\001\135\234 -\110\100\202\123\020\274\277\307\073\150\220\266\202\055\345\364 -\145\320\314\155\031\314\225\371\173\254\112\224\255\016\336\113 -\103\035\207\007\222\023\220\200\203\144\065\071\004\374\345\351 -\154\263\266\037\120\224\070\145\120\134\027\106\271\266\205\265 -\034\265\027\350\326\105\235\330\262\046\260\312\304\160\112\256 -\140\244\335\263\331\354\374\073\325\127\162\274\077\310\311\262 -\336\113\153\370\043\154\003\300\005\275\225\307\315\163\073\146 -\200\144\343\032\254\056\371\107\005\362\006\266\233\163\365\170 -\063\133\307\241\373\047\052\241\264\232\221\214\221\323\072\202 -\076\166\100\264\315\122\141\121\160\050\077\305\305\132\362\311 -\214\111\273\024\133\115\310\377\147\115\114\022\226\255\365\376 -\170\250\227\207\327\375\136\040\200\334\241\113\042\373\324\211 -\255\272\316\107\227\107\125\173\217\105\310\147\050\204\225\034 -\150\060\357\357\111\340\065\173\144\347\230\260\224\332\115\205 -\073\076\125\304\050\257\127\363\236\023\333\106\047\237\036\242 -\136\104\203\244\245\312\325\023\263\113\077\304\343\302\346\206 -\141\244\122\060\271\172\040\117\157\017\070\123\313\063\014\023 -\053\217\326\232\275\052\310\055\261\034\175\113\121\312\107\321 -\110\047\162\135\207\353\325\105\346\110\145\235\257\122\220\272 -\133\242\030\145\127\022\237\150\271\324\025\153\224\304\151\042 -\230\364\063\340\355\371\121\216\101\120\311\064\117\166\220\254 -\374\070\301\330\341\173\271\343\343\224\341\106\151\313\016\012 -\120\153\023\272\254\017\067\132\267\022\265\220\201\036\126\256 -\127\042\206\331\311\322\321\327\121\343\253\073\306\125\375\036 -\016\323\164\012\321\332\252\352\151\270\227\050\217\110\304\007 -\370\122\103\072\364\312\125\065\054\260\246\152\300\234\371\362 -\201\341\022\152\300\105\331\147\263\316\377\043\242\211\012\124 -\324\024\271\052\250\327\354\371\253\315\045\130\062\171\217\220 -\133\230\071\304\010\006\301\254\177\016\075\000\245\002\003\001 -\000\001\243\124\060\122\060\016\006\003\125\035\017\001\001\377 -\004\004\003\002\001\206\060\017\006\003\125\035\023\001\001\377 -\004\005\060\003\001\001\377\060\035\006\003\125\035\016\004\026 -\004\024\011\313\131\177\206\262\160\217\032\303\071\343\300\331 -\351\277\273\115\262\043\060\020\006\011\053\006\001\004\001\202 -\067\025\001\004\003\002\001\000\060\015\006\011\052\206\110\206 -\367\015\001\001\014\005\000\003\202\002\001\000\254\257\076\135 -\302\021\226\211\216\243\347\222\326\227\025\270\023\242\246\102 -\056\002\315\026\005\131\047\312\040\350\272\270\350\032\354\115 -\250\227\126\256\145\103\261\217\000\233\122\315\125\315\123\071 -\155\142\114\213\015\133\174\056\104\277\203\020\217\363\123\202 -\200\303\117\072\307\156\021\077\346\343\026\221\204\373\155\204 -\177\064\164\255\211\247\316\271\327\327\237\204\144\222\276\225 -\241\255\011\123\063\335\356\012\352\112\121\216\157\125\253\272 -\265\224\106\256\214\177\330\242\120\045\145\140\200\106\333\063 -\004\256\154\265\230\164\124\045\334\223\344\370\343\125\025\075 -\270\155\303\012\244\022\301\151\205\156\337\144\361\123\231\341 -\112\165\040\235\225\017\344\326\334\003\361\131\030\350\107\211 -\262\127\132\224\266\251\330\027\053\027\111\345\166\313\301\126 -\231\072\067\261\377\151\054\221\221\223\341\337\114\243\067\166 -\115\241\237\370\155\036\035\323\372\354\373\364\105\035\023\155 -\317\367\131\345\042\047\162\053\206\363\127\273\060\355\044\115 -\334\175\126\273\243\263\370\064\171\211\301\340\362\002\141\367 -\246\374\017\273\034\027\013\256\101\331\174\275\047\243\375\056 -\072\321\223\224\261\163\035\044\213\257\133\040\211\255\267\147 -\146\171\365\072\306\246\226\063\376\123\222\310\106\261\021\221 -\306\231\177\217\311\326\146\061\040\101\020\207\055\014\326\301 -\257\064\230\312\144\203\373\023\127\321\301\360\074\172\214\245 -\301\375\225\041\240\161\301\223\147\161\022\352\217\210\012\151 -\031\144\231\043\126\373\254\052\056\160\276\146\304\014\204\357 -\345\213\363\223\001\370\152\220\223\147\113\262\150\243\265\142 -\217\351\077\214\172\073\136\017\347\214\270\306\174\357\067\375 -\164\342\310\117\063\162\341\224\071\155\275\022\257\276\014\116 -\160\174\033\157\215\263\062\223\163\104\026\155\350\364\367\340 -\225\200\217\226\135\070\244\364\253\336\012\060\207\223\330\115 -\000\161\142\105\047\113\072\102\204\133\177\145\267\147\064\122 -\055\234\026\153\252\250\330\173\243\102\114\161\307\014\312\076 -\203\344\246\357\267\001\060\136\121\243\171\365\160\151\246\101 -\104\017\206\260\054\221\306\075\352\256\017\204 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Microsoft RSA Root Certificate Authority 2017" -# Issuer: CN=Microsoft RSA Root Certificate Authority 2017,O=Microsoft Corporation,C=US -# Serial Number:1e:d3:97:09:5f:d8:b4:b3:47:70:1e:aa:be:7f:45:b3 -# Subject: CN=Microsoft RSA Root Certificate Authority 2017,O=Microsoft Corporation,C=US -# Not Valid Before: Wed Dec 18 22:51:22 2019 -# Not Valid After : Fri Jul 18 23:00:23 2042 -# Fingerprint (SHA-256): C7:41:F7:0F:4B:2A:8D:88:BF:2E:71:C1:41:22:EF:53:EF:10:EB:A0:CF:A5:E6:4C:FA:20:F4:18:85:30:73:E0 -# Fingerprint (SHA1): 73:A5:E6:4A:3B:FF:83:16:FF:0E:DC:CC:61:8A:90:6E:4E:AE:4D:74 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Microsoft RSA Root Certificate Authority 2017" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\163\245\346\112\073\377\203\026\377\016\334\314\141\212\220\156 -\116\256\115\164 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\020\377\000\377\317\311\370\307\172\300\356\065\216\311\017\107 -END -CKA_ISSUER MULTILINE_OCTAL -\060\145\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\036\060\034\006\003\125\004\012\023\025\115\151\143\162\157\163 -\157\146\164\040\103\157\162\160\157\162\141\164\151\157\156\061 -\066\060\064\006\003\125\004\003\023\055\115\151\143\162\157\163 -\157\146\164\040\122\123\101\040\122\157\157\164\040\103\145\162 -\164\151\146\151\143\141\164\145\040\101\165\164\150\157\162\151 -\164\171\040\062\060\061\067 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\036\323\227\011\137\330\264\263\107\160\036\252\276\177 -\105\263 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "e-Szigno Root CA 2017" -# -# Issuer: CN=e-Szigno Root CA 2017,OID.2.5.4.97=VATHU-23584497,O=Microsec Ltd.,L=Budapest,C=HU -# Serial Number:01:54:48:ef:21:fd:97:59:0d:f5:04:0a -# Subject: CN=e-Szigno Root CA 2017,OID.2.5.4.97=VATHU-23584497,O=Microsec Ltd.,L=Budapest,C=HU -# Not Valid Before: Tue Aug 22 12:07:06 2017 -# Not Valid After : Fri Aug 22 12:07:06 2042 -# Fingerprint (SHA-256): BE:B0:0B:30:83:9B:9B:C3:2C:32:E4:44:79:05:95:06:41:F2:64:21:B1:5E:D0:89:19:8B:51:8A:E2:EA:1B:99 -# Fingerprint (SHA1): 89:D4:83:03:4F:9E:9A:48:80:5F:72:37:D4:A9:A6:EF:CB:7C:1F:D1 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "e-Szigno Root CA 2017" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\161\061\013\060\011\006\003\125\004\006\023\002\110\125\061 -\021\060\017\006\003\125\004\007\014\010\102\165\144\141\160\145 -\163\164\061\026\060\024\006\003\125\004\012\014\015\115\151\143 -\162\157\163\145\143\040\114\164\144\056\061\027\060\025\006\003 -\125\004\141\014\016\126\101\124\110\125\055\062\063\065\070\064 -\064\071\067\061\036\060\034\006\003\125\004\003\014\025\145\055 -\123\172\151\147\156\157\040\122\157\157\164\040\103\101\040\062 -\060\061\067 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\161\061\013\060\011\006\003\125\004\006\023\002\110\125\061 -\021\060\017\006\003\125\004\007\014\010\102\165\144\141\160\145 -\163\164\061\026\060\024\006\003\125\004\012\014\015\115\151\143 -\162\157\163\145\143\040\114\164\144\056\061\027\060\025\006\003 -\125\004\141\014\016\126\101\124\110\125\055\062\063\065\070\064 -\064\071\067\061\036\060\034\006\003\125\004\003\014\025\145\055 -\123\172\151\147\156\157\040\122\157\157\164\040\103\101\040\062 -\060\061\067 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\014\001\124\110\357\041\375\227\131\015\365\004\012 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\100\060\202\001\345\240\003\002\001\002\002\014\001 -\124\110\357\041\375\227\131\015\365\004\012\060\012\006\010\052 -\206\110\316\075\004\003\002\060\161\061\013\060\011\006\003\125 -\004\006\023\002\110\125\061\021\060\017\006\003\125\004\007\014 -\010\102\165\144\141\160\145\163\164\061\026\060\024\006\003\125 -\004\012\014\015\115\151\143\162\157\163\145\143\040\114\164\144 -\056\061\027\060\025\006\003\125\004\141\014\016\126\101\124\110 -\125\055\062\063\065\070\064\064\071\067\061\036\060\034\006\003 -\125\004\003\014\025\145\055\123\172\151\147\156\157\040\122\157 -\157\164\040\103\101\040\062\060\061\067\060\036\027\015\061\067 -\060\070\062\062\061\062\060\067\060\066\132\027\015\064\062\060 -\070\062\062\061\062\060\067\060\066\132\060\161\061\013\060\011 -\006\003\125\004\006\023\002\110\125\061\021\060\017\006\003\125 -\004\007\014\010\102\165\144\141\160\145\163\164\061\026\060\024 -\006\003\125\004\012\014\015\115\151\143\162\157\163\145\143\040 -\114\164\144\056\061\027\060\025\006\003\125\004\141\014\016\126 -\101\124\110\125\055\062\063\065\070\064\064\071\067\061\036\060 -\034\006\003\125\004\003\014\025\145\055\123\172\151\147\156\157 -\040\122\157\157\164\040\103\101\040\062\060\061\067\060\131\060 -\023\006\007\052\206\110\316\075\002\001\006\010\052\206\110\316 -\075\003\001\007\003\102\000\004\226\334\075\212\330\260\173\157 -\306\047\276\104\220\261\263\126\025\173\216\103\044\175\032\204 -\131\356\143\150\262\306\136\207\320\025\110\036\250\220\255\275 -\123\242\332\336\072\220\246\140\137\150\062\265\206\101\337\207 -\133\054\173\305\376\174\172\332\243\143\060\141\060\017\006\003 -\125\035\023\001\001\377\004\005\060\003\001\001\377\060\016\006 -\003\125\035\017\001\001\377\004\004\003\002\001\006\060\035\006 -\003\125\035\016\004\026\004\024\207\021\025\010\321\252\301\170 -\014\261\257\316\306\311\220\357\277\060\004\300\060\037\006\003 -\125\035\043\004\030\060\026\200\024\207\021\025\010\321\252\301 -\170\014\261\257\316\306\311\220\357\277\060\004\300\060\012\006 -\010\052\206\110\316\075\004\003\002\003\111\000\060\106\002\041 -\000\265\127\335\327\212\125\013\066\341\206\104\372\324\331\150 -\215\270\334\043\212\212\015\324\057\175\352\163\354\277\115\154 -\250\002\041\000\313\245\264\022\372\347\265\350\317\176\223\374 -\363\065\217\157\116\132\174\264\274\116\262\374\162\252\133\131 -\371\347\334\061 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "e-Szigno Root CA 2017" -# Issuer: CN=e-Szigno Root CA 2017,OID.2.5.4.97=VATHU-23584497,O=Microsec Ltd.,L=Budapest,C=HU -# Serial Number:01:54:48:ef:21:fd:97:59:0d:f5:04:0a -# Subject: CN=e-Szigno Root CA 2017,OID.2.5.4.97=VATHU-23584497,O=Microsec Ltd.,L=Budapest,C=HU -# Not Valid Before: Tue Aug 22 12:07:06 2017 -# Not Valid After : Fri Aug 22 12:07:06 2042 -# Fingerprint (SHA-256): BE:B0:0B:30:83:9B:9B:C3:2C:32:E4:44:79:05:95:06:41:F2:64:21:B1:5E:D0:89:19:8B:51:8A:E2:EA:1B:99 -# Fingerprint (SHA1): 89:D4:83:03:4F:9E:9A:48:80:5F:72:37:D4:A9:A6:EF:CB:7C:1F:D1 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "e-Szigno Root CA 2017" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\211\324\203\003\117\236\232\110\200\137\162\067\324\251\246\357 -\313\174\037\321 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\336\037\366\236\204\256\247\264\041\316\036\130\175\321\204\230 -END -CKA_ISSUER MULTILINE_OCTAL -\060\161\061\013\060\011\006\003\125\004\006\023\002\110\125\061 -\021\060\017\006\003\125\004\007\014\010\102\165\144\141\160\145 -\163\164\061\026\060\024\006\003\125\004\012\014\015\115\151\143 -\162\157\163\145\143\040\114\164\144\056\061\027\060\025\006\003 -\125\004\141\014\016\126\101\124\110\125\055\062\063\065\070\064 -\064\071\067\061\036\060\034\006\003\125\004\003\014\025\145\055 -\123\172\151\147\156\157\040\122\157\157\164\040\103\101\040\062 -\060\061\067 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\014\001\124\110\357\041\375\227\131\015\365\004\012 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "certSIGN Root CA G2" -# -# Issuer: OU=certSIGN ROOT CA G2,O=CERTSIGN SA,C=RO -# Serial Number:11:00:34:b6:4e:c6:36:2d:36 -# Subject: OU=certSIGN ROOT CA G2,O=CERTSIGN SA,C=RO -# Not Valid Before: Mon Feb 06 09:27:35 2017 -# Not Valid After : Thu Feb 06 09:27:35 2042 -# Fingerprint (SHA-256): 65:7C:FE:2F:A7:3F:AA:38:46:25:71:F3:32:A2:36:3A:46:FC:E7:02:09:51:71:07:02:CD:FB:B6:EE:DA:33:05 -# Fingerprint (SHA1): 26:F9:93:B4:ED:3D:28:27:B0:B9:4B:A7:E9:15:1D:A3:8D:92:E5:32 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "certSIGN Root CA G2" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\101\061\013\060\011\006\003\125\004\006\023\002\122\117\061 -\024\060\022\006\003\125\004\012\023\013\103\105\122\124\123\111 -\107\116\040\123\101\061\034\060\032\006\003\125\004\013\023\023 -\143\145\162\164\123\111\107\116\040\122\117\117\124\040\103\101 -\040\107\062 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\101\061\013\060\011\006\003\125\004\006\023\002\122\117\061 -\024\060\022\006\003\125\004\012\023\013\103\105\122\124\123\111 -\107\116\040\123\101\061\034\060\032\006\003\125\004\013\023\023 -\143\145\162\164\123\111\107\116\040\122\117\117\124\040\103\101 -\040\107\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\011\021\000\064\266\116\306\066\055\066 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\107\060\202\003\057\240\003\002\001\002\002\011\021 -\000\064\266\116\306\066\055\066\060\015\006\011\052\206\110\206 -\367\015\001\001\013\005\000\060\101\061\013\060\011\006\003\125 -\004\006\023\002\122\117\061\024\060\022\006\003\125\004\012\023 -\013\103\105\122\124\123\111\107\116\040\123\101\061\034\060\032 -\006\003\125\004\013\023\023\143\145\162\164\123\111\107\116\040 -\122\117\117\124\040\103\101\040\107\062\060\036\027\015\061\067 -\060\062\060\066\060\071\062\067\063\065\132\027\015\064\062\060 -\062\060\066\060\071\062\067\063\065\132\060\101\061\013\060\011 -\006\003\125\004\006\023\002\122\117\061\024\060\022\006\003\125 -\004\012\023\013\103\105\122\124\123\111\107\116\040\123\101\061 -\034\060\032\006\003\125\004\013\023\023\143\145\162\164\123\111 -\107\116\040\122\117\117\124\040\103\101\040\107\062\060\202\002 -\042\060\015\006\011\052\206\110\206\367\015\001\001\001\005\000 -\003\202\002\017\000\060\202\002\012\002\202\002\001\000\300\305 -\165\031\221\175\104\164\164\207\376\016\073\226\334\330\001\026 -\314\356\143\221\347\013\157\316\073\012\151\032\174\302\343\257 -\202\216\206\327\136\217\127\353\323\041\131\375\071\067\102\060 -\276\120\352\266\017\251\210\330\056\055\151\041\347\321\067\030 -\116\175\221\325\026\137\153\133\000\302\071\103\015\066\205\122 -\271\123\145\017\035\102\345\217\317\005\323\356\334\014\032\331 -\270\213\170\042\147\344\151\260\150\305\074\344\154\132\106\347 -\315\307\372\357\304\354\113\275\152\244\254\375\314\050\121\357 -\222\264\051\253\253\065\232\114\344\304\010\306\046\314\370\151 -\237\344\234\360\051\323\134\371\306\026\045\236\043\303\040\301 -\075\017\077\070\100\260\376\202\104\070\252\132\032\212\153\143 -\130\070\264\025\323\266\021\151\173\036\124\356\214\032\042\254 -\162\227\077\043\131\233\311\042\204\301\007\117\314\177\342\127 -\312\022\160\273\246\145\363\151\165\143\275\225\373\033\227\315 -\344\250\257\366\321\116\250\331\212\161\044\315\066\075\274\226 -\304\361\154\251\256\345\317\015\156\050\015\260\016\265\312\121 -\173\170\024\303\040\057\177\373\024\125\341\021\231\375\325\012 -\241\236\002\343\142\137\353\065\113\054\270\162\350\076\075\117 -\254\054\273\056\206\342\243\166\217\345\223\052\317\245\253\310 -\134\215\113\006\377\022\106\254\170\313\024\007\065\340\251\337 -\213\351\257\025\117\026\211\133\275\366\215\306\131\256\210\205 -\016\301\211\353\037\147\305\105\216\377\155\067\066\053\170\146 -\203\221\121\053\075\377\121\167\166\142\241\354\147\076\076\201 -\203\340\126\251\120\037\037\172\231\253\143\277\204\027\167\361 -\015\073\337\367\234\141\263\065\230\212\072\262\354\074\032\067 -\077\176\217\222\317\331\022\024\144\332\020\002\025\101\377\117 -\304\353\034\243\311\372\231\367\106\351\341\030\331\261\270\062 -\055\313\024\014\120\330\203\145\203\356\271\134\317\313\005\132 -\114\372\031\227\153\326\135\023\323\302\134\124\274\062\163\240 -\170\365\361\155\036\313\237\245\246\237\042\334\321\121\236\202 -\171\144\140\051\023\076\243\375\117\162\152\253\342\324\345\270 -\044\125\054\104\113\212\210\104\234\312\204\323\052\073\002\003 -\001\000\001\243\102\060\100\060\017\006\003\125\035\023\001\001 -\377\004\005\060\003\001\001\377\060\016\006\003\125\035\017\001 -\001\377\004\004\003\002\001\006\060\035\006\003\125\035\016\004 -\026\004\024\202\041\055\146\306\327\240\340\025\353\316\114\011 -\167\304\140\236\124\156\003\060\015\006\011\052\206\110\206\367 -\015\001\001\013\005\000\003\202\002\001\000\140\336\032\270\347 -\362\140\202\325\003\063\201\313\006\212\361\042\111\351\350\352 -\221\177\306\063\136\150\031\003\206\073\103\001\317\007\160\344 -\010\036\145\205\221\346\021\042\267\365\002\043\216\256\271\036 -\175\037\176\154\346\275\045\325\225\032\362\005\246\257\205\002 -\157\256\370\326\061\377\045\311\112\310\307\212\251\331\237\113 -\111\233\021\127\231\222\103\021\336\266\063\244\314\327\215\144 -\175\324\315\074\050\054\264\232\226\352\115\365\304\104\304\045 -\252\040\200\330\051\125\367\340\101\374\006\046\377\271\066\365 -\103\024\003\146\170\341\021\261\332\040\137\106\000\170\000\041 -\245\036\000\050\141\170\157\250\001\001\217\235\064\232\377\364 -\070\220\373\270\321\263\162\006\311\161\346\201\305\171\355\013 -\246\171\362\023\013\234\367\135\016\173\044\223\264\110\333\206 -\137\336\120\206\170\347\100\346\061\250\220\166\160\141\257\234 -\067\054\021\265\202\267\252\256\044\064\133\162\014\151\015\315 -\131\237\366\161\257\234\013\321\012\070\371\006\042\203\123\045 -\014\374\121\304\346\276\342\071\225\013\044\255\257\321\225\344 -\226\327\164\144\153\161\116\002\074\252\205\363\040\243\103\071 -\166\133\154\120\376\232\234\024\036\145\024\212\025\275\243\202 -\105\132\111\126\152\322\234\261\143\062\345\141\340\123\042\016 -\247\012\111\352\313\176\037\250\342\142\200\366\020\105\122\230 -\006\030\336\245\315\057\177\252\324\351\076\010\162\354\043\003 -\002\074\246\252\330\274\147\164\075\024\027\373\124\113\027\343 -\323\171\075\155\153\111\311\050\016\056\164\120\277\014\331\106 -\072\020\206\311\247\077\351\240\354\177\353\245\167\130\151\161 -\346\203\012\067\362\206\111\152\276\171\010\220\366\002\026\144 -\076\345\332\114\176\014\064\311\371\137\266\263\050\121\247\247 -\053\252\111\372\215\145\051\116\343\153\023\247\224\243\055\121 -\155\170\014\104\313\337\336\010\157\316\243\144\253\323\225\204 -\324\271\122\124\162\173\226\045\314\274\151\343\110\156\015\320 -\307\235\047\232\252\370\023\222\335\036\337\143\237\065\251\026 -\066\354\214\270\203\364\075\211\217\315\264\027\136\327\263\027 -\101\020\135\047\163\140\205\127\111\042\007 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "certSIGN Root CA G2" -# Issuer: OU=certSIGN ROOT CA G2,O=CERTSIGN SA,C=RO -# Serial Number:11:00:34:b6:4e:c6:36:2d:36 -# Subject: OU=certSIGN ROOT CA G2,O=CERTSIGN SA,C=RO -# Not Valid Before: Mon Feb 06 09:27:35 2017 -# Not Valid After : Thu Feb 06 09:27:35 2042 -# Fingerprint (SHA-256): 65:7C:FE:2F:A7:3F:AA:38:46:25:71:F3:32:A2:36:3A:46:FC:E7:02:09:51:71:07:02:CD:FB:B6:EE:DA:33:05 -# Fingerprint (SHA1): 26:F9:93:B4:ED:3D:28:27:B0:B9:4B:A7:E9:15:1D:A3:8D:92:E5:32 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "certSIGN Root CA G2" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\046\371\223\264\355\075\050\047\260\271\113\247\351\025\035\243 -\215\222\345\062 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\214\361\165\212\306\031\317\224\267\367\145\040\207\303\227\307 -END -CKA_ISSUER MULTILINE_OCTAL -\060\101\061\013\060\011\006\003\125\004\006\023\002\122\117\061 -\024\060\022\006\003\125\004\012\023\013\103\105\122\124\123\111 -\107\116\040\123\101\061\034\060\032\006\003\125\004\013\023\023 -\143\145\162\164\123\111\107\116\040\122\117\117\124\040\103\101 -\040\107\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\011\021\000\064\266\116\306\066\055\066 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "NAVER Global Root Certification Authority" -# -# Issuer: CN=NAVER Global Root Certification Authority,O=NAVER BUSINESS PLATFORM Corp.,C=KR -# Serial Number:01:94:30:1e:a2:0b:dd:f5:c5:33:2a:b1:43:44:71:f8:d6:50:4d:0d -# Subject: CN=NAVER Global Root Certification Authority,O=NAVER BUSINESS PLATFORM Corp.,C=KR -# Not Valid Before: Fri Aug 18 08:58:42 2017 -# Not Valid After : Tue Aug 18 23:59:59 2037 -# Fingerprint (SHA-256): 88:F4:38:DC:F8:FF:D1:FA:8F:42:91:15:FF:E5:F8:2A:E1:E0:6E:0C:70:C3:75:FA:AD:71:7B:34:A4:9E:72:65 -# Fingerprint (SHA1): 8F:6B:F2:A9:27:4A:DA:14:A0:C4:F4:8E:61:27:F9:C0:1E:78:5D:D1 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "NAVER Global Root Certification Authority" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\151\061\013\060\011\006\003\125\004\006\023\002\113\122\061 -\046\060\044\006\003\125\004\012\014\035\116\101\126\105\122\040 -\102\125\123\111\116\105\123\123\040\120\114\101\124\106\117\122 -\115\040\103\157\162\160\056\061\062\060\060\006\003\125\004\003 -\014\051\116\101\126\105\122\040\107\154\157\142\141\154\040\122 -\157\157\164\040\103\145\162\164\151\146\151\143\141\164\151\157 -\156\040\101\165\164\150\157\162\151\164\171 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\151\061\013\060\011\006\003\125\004\006\023\002\113\122\061 -\046\060\044\006\003\125\004\012\014\035\116\101\126\105\122\040 -\102\125\123\111\116\105\123\123\040\120\114\101\124\106\117\122 -\115\040\103\157\162\160\056\061\062\060\060\006\003\125\004\003 -\014\051\116\101\126\105\122\040\107\154\157\142\141\154\040\122 -\157\157\164\040\103\145\162\164\151\146\151\143\141\164\151\157 -\156\040\101\165\164\150\157\162\151\164\171 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\001\224\060\036\242\013\335\365\305\063\052\261\103\104 -\161\370\326\120\115\015 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\242\060\202\003\212\240\003\002\001\002\002\024\001 -\224\060\036\242\013\335\365\305\063\052\261\103\104\161\370\326 -\120\115\015\060\015\006\011\052\206\110\206\367\015\001\001\014 -\005\000\060\151\061\013\060\011\006\003\125\004\006\023\002\113 -\122\061\046\060\044\006\003\125\004\012\014\035\116\101\126\105 -\122\040\102\125\123\111\116\105\123\123\040\120\114\101\124\106 -\117\122\115\040\103\157\162\160\056\061\062\060\060\006\003\125 -\004\003\014\051\116\101\126\105\122\040\107\154\157\142\141\154 -\040\122\157\157\164\040\103\145\162\164\151\146\151\143\141\164 -\151\157\156\040\101\165\164\150\157\162\151\164\171\060\036\027 -\015\061\067\060\070\061\070\060\070\065\070\064\062\132\027\015 -\063\067\060\070\061\070\062\063\065\071\065\071\132\060\151\061 -\013\060\011\006\003\125\004\006\023\002\113\122\061\046\060\044 -\006\003\125\004\012\014\035\116\101\126\105\122\040\102\125\123 -\111\116\105\123\123\040\120\114\101\124\106\117\122\115\040\103 -\157\162\160\056\061\062\060\060\006\003\125\004\003\014\051\116 -\101\126\105\122\040\107\154\157\142\141\154\040\122\157\157\164 -\040\103\145\162\164\151\146\151\143\141\164\151\157\156\040\101 -\165\164\150\157\162\151\164\171\060\202\002\042\060\015\006\011 -\052\206\110\206\367\015\001\001\001\005\000\003\202\002\017\000 -\060\202\002\012\002\202\002\001\000\266\324\361\223\134\265\100 -\211\012\253\015\220\133\120\143\256\220\224\164\027\105\162\326 -\173\145\132\051\113\247\126\240\113\270\057\102\165\351\331\173 -\044\132\061\145\253\027\027\321\063\072\331\021\334\100\066\207 -\337\307\152\351\046\136\131\212\167\343\350\110\234\061\026\372 -\076\221\261\312\311\243\342\237\316\041\123\243\002\066\060\313 -\122\002\345\332\062\135\303\305\346\371\356\021\307\213\311\104 -\036\204\223\030\112\264\237\345\022\144\151\320\046\205\142\001 -\266\311\002\035\276\203\121\273\134\332\370\255\025\152\231\367 -\222\124\367\064\133\351\277\352\051\201\022\324\123\221\226\263 -\221\132\335\376\220\163\050\373\060\106\265\312\010\007\307\161 -\162\311\146\323\064\227\366\214\364\030\112\341\320\075\132\105 -\266\151\247\051\373\043\316\210\330\022\234\000\110\250\246\017 -\263\073\222\215\161\016\164\305\213\310\114\371\364\233\216\270 -\074\151\355\157\073\120\057\130\355\304\260\320\034\033\152\014 -\342\274\104\252\330\315\024\135\224\170\141\277\016\156\332\052 -\274\057\014\013\161\246\263\026\077\234\346\371\314\237\123\065 -\342\003\240\240\030\277\273\361\276\364\326\214\207\015\102\367 -\006\271\361\155\355\004\224\250\376\266\323\006\306\100\141\337 -\235\235\363\124\166\316\123\072\001\246\222\101\354\004\243\217 -\015\242\325\011\312\326\313\232\361\357\103\135\300\253\245\101 -\317\134\123\160\160\311\210\246\055\324\153\141\163\120\046\206 -\141\016\137\033\302\053\342\214\325\273\235\301\003\102\272\224 -\332\137\251\260\312\314\115\012\357\107\151\003\057\042\373\361 -\050\316\277\135\120\145\250\220\155\263\164\260\010\307\254\250 -\321\353\076\234\374\135\032\203\056\053\313\265\363\104\235\072 -\247\027\141\226\242\161\323\160\226\025\115\267\114\163\356\031 -\134\305\133\076\101\376\254\165\140\073\033\143\316\000\335\332 -\010\220\142\264\345\055\356\110\247\153\027\231\124\276\207\112 -\343\251\136\004\114\353\020\155\124\326\357\361\350\362\142\026 -\313\200\153\355\075\355\365\037\060\245\256\113\311\023\355\212 -\001\001\311\270\121\130\300\146\072\261\146\113\304\325\061\002 -\142\351\164\204\014\333\115\106\055\002\003\001\000\001\243\102 -\060\100\060\035\006\003\125\035\016\004\026\004\024\322\237\210 -\337\241\315\054\275\354\365\073\001\001\223\063\047\262\353\140 -\113\060\016\006\003\125\035\017\001\001\377\004\004\003\002\001 -\006\060\017\006\003\125\035\023\001\001\377\004\005\060\003\001 -\001\377\060\015\006\011\052\206\110\206\367\015\001\001\014\005 -\000\003\202\002\001\000\062\312\200\263\235\075\124\006\335\322 -\322\056\360\244\001\041\013\147\110\312\155\216\340\310\252\015 -\252\215\041\127\217\306\076\172\312\333\121\324\122\263\324\226 -\204\245\130\140\177\345\013\216\037\365\334\012\025\201\345\073 -\266\267\042\057\011\234\023\026\261\154\014\065\010\155\253\143 -\162\355\334\276\354\307\127\346\060\040\161\326\327\020\301\023 -\125\001\214\052\103\344\101\361\317\072\172\123\222\316\242\003 -\005\015\070\337\002\273\020\056\331\073\322\233\172\300\241\246 -\370\265\061\346\364\165\311\271\123\231\165\107\042\132\024\025 -\307\170\033\266\235\351\014\370\033\166\361\205\204\336\241\332 -\022\357\244\342\020\227\172\170\336\014\121\227\250\041\100\213 -\206\275\015\360\136\116\113\066\273\073\040\037\212\102\126\341 -\013\032\277\173\320\042\103\054\104\214\373\345\052\264\154\034 -\034\272\224\340\023\176\041\346\232\302\313\305\102\144\264\036 -\224\173\010\045\310\161\314\207\105\127\205\323\237\051\142\042 -\203\121\227\000\030\227\167\152\230\222\311\174\140\154\337\154 -\175\112\344\160\114\302\236\270\035\367\320\064\307\017\314\373 -\247\377\003\276\255\160\220\332\013\335\310\155\227\137\232\177 -\011\062\101\375\315\242\314\132\155\114\362\252\111\376\146\370 -\351\330\065\353\016\050\036\356\110\057\072\320\171\011\070\174 -\246\042\202\223\225\320\003\276\276\002\240\005\335\040\042\343 -\157\035\210\064\140\306\346\012\271\011\165\013\360\007\350\151 -\226\065\307\373\043\201\216\070\071\270\105\053\103\170\242\321 -\054\024\377\015\050\162\162\225\233\136\011\333\211\104\230\252 -\241\111\273\161\122\362\277\366\377\047\241\066\257\270\266\167 -\210\335\072\244\155\233\064\220\334\024\135\060\277\267\353\027 -\344\207\267\161\320\241\327\167\025\324\102\327\362\363\061\231 -\135\233\335\026\155\077\352\006\043\370\106\242\042\355\223\366 -\335\232\346\052\207\261\230\124\361\042\367\153\105\343\342\216 -\166\035\232\215\304\006\215\066\267\024\363\235\124\151\267\216 -\074\325\244\155\223\201\267\255\366\275\144\173\302\311\150\071 -\240\222\234\315\064\206\221\220\372\144\121\235\376\376\353\245 -\365\165\336\211\367\162 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "NAVER Global Root Certification Authority" -# Issuer: CN=NAVER Global Root Certification Authority,O=NAVER BUSINESS PLATFORM Corp.,C=KR -# Serial Number:01:94:30:1e:a2:0b:dd:f5:c5:33:2a:b1:43:44:71:f8:d6:50:4d:0d -# Subject: CN=NAVER Global Root Certification Authority,O=NAVER BUSINESS PLATFORM Corp.,C=KR -# Not Valid Before: Fri Aug 18 08:58:42 2017 -# Not Valid After : Tue Aug 18 23:59:59 2037 -# Fingerprint (SHA-256): 88:F4:38:DC:F8:FF:D1:FA:8F:42:91:15:FF:E5:F8:2A:E1:E0:6E:0C:70:C3:75:FA:AD:71:7B:34:A4:9E:72:65 -# Fingerprint (SHA1): 8F:6B:F2:A9:27:4A:DA:14:A0:C4:F4:8E:61:27:F9:C0:1E:78:5D:D1 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "NAVER Global Root Certification Authority" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\217\153\362\251\047\112\332\024\240\304\364\216\141\047\371\300 -\036\170\135\321 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\310\176\101\366\045\073\365\011\263\027\350\106\075\277\320\233 -END -CKA_ISSUER MULTILINE_OCTAL -\060\151\061\013\060\011\006\003\125\004\006\023\002\113\122\061 -\046\060\044\006\003\125\004\012\014\035\116\101\126\105\122\040 -\102\125\123\111\116\105\123\123\040\120\114\101\124\106\117\122 -\115\040\103\157\162\160\056\061\062\060\060\006\003\125\004\003 -\014\051\116\101\126\105\122\040\107\154\157\142\141\154\040\122 -\157\157\164\040\103\145\162\164\151\146\151\143\141\164\151\157 -\156\040\101\165\164\150\157\162\151\164\171 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\001\224\060\036\242\013\335\365\305\063\052\261\103\104 -\161\370\326\120\115\015 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "AC RAIZ FNMT-RCM SERVIDORES SEGUROS" -# -# Issuer: CN=AC RAIZ FNMT-RCM SERVIDORES SEGUROS,OID.2.5.4.97=VATES-Q2826004J,OU=Ceres,O=FNMT-RCM,C=ES -# Serial Number:62:f6:32:6c:e5:c4:e3:68:5c:1b:62:dd:9c:2e:9d:95 -# Subject: CN=AC RAIZ FNMT-RCM SERVIDORES SEGUROS,OID.2.5.4.97=VATES-Q2826004J,OU=Ceres,O=FNMT-RCM,C=ES -# Not Valid Before: Thu Dec 20 09:37:33 2018 -# Not Valid After : Sun Dec 20 09:37:33 2043 -# Fingerprint (SHA-256): 55:41:53:B1:3D:2C:F9:DD:B7:53:BF:BE:1A:4E:0A:E0:8D:0A:A4:18:70:58:FE:60:A2:B8:62:B2:E4:B8:7B:CB -# Fingerprint (SHA1): 62:FF:D9:9E:C0:65:0D:03:CE:75:93:D2:ED:3F:2D:32:C9:E3:E5:4A -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "AC RAIZ FNMT-RCM SERVIDORES SEGUROS" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\170\061\013\060\011\006\003\125\004\006\023\002\105\123\061 -\021\060\017\006\003\125\004\012\014\010\106\116\115\124\055\122 -\103\115\061\016\060\014\006\003\125\004\013\014\005\103\145\162 -\145\163\061\030\060\026\006\003\125\004\141\014\017\126\101\124 -\105\123\055\121\062\070\062\066\060\060\064\112\061\054\060\052 -\006\003\125\004\003\014\043\101\103\040\122\101\111\132\040\106 -\116\115\124\055\122\103\115\040\123\105\122\126\111\104\117\122 -\105\123\040\123\105\107\125\122\117\123 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\170\061\013\060\011\006\003\125\004\006\023\002\105\123\061 -\021\060\017\006\003\125\004\012\014\010\106\116\115\124\055\122 -\103\115\061\016\060\014\006\003\125\004\013\014\005\103\145\162 -\145\163\061\030\060\026\006\003\125\004\141\014\017\126\101\124 -\105\123\055\121\062\070\062\066\060\060\064\112\061\054\060\052 -\006\003\125\004\003\014\043\101\103\040\122\101\111\132\040\106 -\116\115\124\055\122\103\115\040\123\105\122\126\111\104\117\122 -\105\123\040\123\105\107\125\122\117\123 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\142\366\062\154\345\304\343\150\134\033\142\335\234\056 -\235\225 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\156\060\202\001\363\240\003\002\001\002\002\020\142 -\366\062\154\345\304\343\150\134\033\142\335\234\056\235\225\060 -\012\006\010\052\206\110\316\075\004\003\003\060\170\061\013\060 -\011\006\003\125\004\006\023\002\105\123\061\021\060\017\006\003 -\125\004\012\014\010\106\116\115\124\055\122\103\115\061\016\060 -\014\006\003\125\004\013\014\005\103\145\162\145\163\061\030\060 -\026\006\003\125\004\141\014\017\126\101\124\105\123\055\121\062 -\070\062\066\060\060\064\112\061\054\060\052\006\003\125\004\003 -\014\043\101\103\040\122\101\111\132\040\106\116\115\124\055\122 -\103\115\040\123\105\122\126\111\104\117\122\105\123\040\123\105 -\107\125\122\117\123\060\036\027\015\061\070\061\062\062\060\060 -\071\063\067\063\063\132\027\015\064\063\061\062\062\060\060\071 -\063\067\063\063\132\060\170\061\013\060\011\006\003\125\004\006 -\023\002\105\123\061\021\060\017\006\003\125\004\012\014\010\106 -\116\115\124\055\122\103\115\061\016\060\014\006\003\125\004\013 -\014\005\103\145\162\145\163\061\030\060\026\006\003\125\004\141 -\014\017\126\101\124\105\123\055\121\062\070\062\066\060\060\064 -\112\061\054\060\052\006\003\125\004\003\014\043\101\103\040\122 -\101\111\132\040\106\116\115\124\055\122\103\115\040\123\105\122 -\126\111\104\117\122\105\123\040\123\105\107\125\122\117\123\060 -\166\060\020\006\007\052\206\110\316\075\002\001\006\005\053\201 -\004\000\042\003\142\000\004\366\272\127\123\310\312\253\337\066 -\112\122\041\344\227\322\203\147\236\360\145\121\320\136\207\307 -\107\261\131\362\127\107\233\000\002\223\104\027\151\333\102\307 -\261\262\072\030\016\264\135\214\263\146\135\241\064\371\066\054 -\111\333\363\106\374\263\104\151\104\023\146\375\327\305\375\257 -\066\115\316\003\115\007\161\317\257\152\005\322\242\103\132\012 -\122\157\001\003\116\216\213\243\102\060\100\060\017\006\003\125 -\035\023\001\001\377\004\005\060\003\001\001\377\060\016\006\003 -\125\035\017\001\001\377\004\004\003\002\001\006\060\035\006\003 -\125\035\016\004\026\004\024\001\271\057\357\277\021\206\140\362 -\117\320\101\156\253\163\037\347\322\156\111\060\012\006\010\052 -\206\110\316\075\004\003\003\003\151\000\060\146\002\061\000\256 -\112\343\053\100\303\164\021\362\225\255\026\043\336\116\014\032 -\346\135\245\044\136\153\104\173\374\070\342\117\313\234\105\027 -\021\114\024\047\046\125\071\165\112\003\314\023\220\237\222\002 -\061\000\372\112\154\140\210\163\363\356\270\230\142\251\316\053 -\302\331\212\246\160\061\035\257\260\224\114\353\117\306\343\321 -\363\142\247\074\377\223\056\007\134\111\001\147\151\022\002\162 -\277\347 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "AC RAIZ FNMT-RCM SERVIDORES SEGUROS" -# Issuer: CN=AC RAIZ FNMT-RCM SERVIDORES SEGUROS,OID.2.5.4.97=VATES-Q2826004J,OU=Ceres,O=FNMT-RCM,C=ES -# Serial Number:62:f6:32:6c:e5:c4:e3:68:5c:1b:62:dd:9c:2e:9d:95 -# Subject: CN=AC RAIZ FNMT-RCM SERVIDORES SEGUROS,OID.2.5.4.97=VATES-Q2826004J,OU=Ceres,O=FNMT-RCM,C=ES -# Not Valid Before: Thu Dec 20 09:37:33 2018 -# Not Valid After : Sun Dec 20 09:37:33 2043 -# Fingerprint (SHA-256): 55:41:53:B1:3D:2C:F9:DD:B7:53:BF:BE:1A:4E:0A:E0:8D:0A:A4:18:70:58:FE:60:A2:B8:62:B2:E4:B8:7B:CB -# Fingerprint (SHA1): 62:FF:D9:9E:C0:65:0D:03:CE:75:93:D2:ED:3F:2D:32:C9:E3:E5:4A -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "AC RAIZ FNMT-RCM SERVIDORES SEGUROS" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\142\377\331\236\300\145\015\003\316\165\223\322\355\077\055\062 -\311\343\345\112 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\031\066\234\122\003\057\322\321\273\043\314\335\036\022\125\273 -END -CKA_ISSUER MULTILINE_OCTAL -\060\170\061\013\060\011\006\003\125\004\006\023\002\105\123\061 -\021\060\017\006\003\125\004\012\014\010\106\116\115\124\055\122 -\103\115\061\016\060\014\006\003\125\004\013\014\005\103\145\162 -\145\163\061\030\060\026\006\003\125\004\141\014\017\126\101\124 -\105\123\055\121\062\070\062\066\060\060\064\112\061\054\060\052 -\006\003\125\004\003\014\043\101\103\040\122\101\111\132\040\106 -\116\115\124\055\122\103\115\040\123\105\122\126\111\104\117\122 -\105\123\040\123\105\107\125\122\117\123 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\142\366\062\154\345\304\343\150\134\033\142\335\234\056 -\235\225 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "GlobalSign Secure Mail Root R45" -# -# Issuer: CN=GlobalSign Secure Mail Root R45,O=GlobalSign nv-sa,C=BE -# Serial Number:76:53:fe:a8:4c:50:ab:9f:8d:32:b5:1d:03:8f:57:dc -# Subject: CN=GlobalSign Secure Mail Root R45,O=GlobalSign nv-sa,C=BE -# Not Valid Before: Wed Mar 18 00:00:00 2020 -# Not Valid After : Sat Mar 18 00:00:00 2045 -# Fingerprint (SHA-256): 31:9A:F0:A7:72:9E:6F:89:26:9C:13:1E:A6:A3:A1:6F:CD:86:38:9F:DC:AB:3C:47:A4:A6:75:C1:61:A3:F9:74 -# Fingerprint (SHA1): 76:18:D1:F3:80:24:3D:52:40:C6:11:6A:AD:57:77:09:7D:81:30:A0 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "GlobalSign Secure Mail Root R45" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\122\061\013\060\011\006\003\125\004\006\023\002\102\105\061 -\031\060\027\006\003\125\004\012\023\020\107\154\157\142\141\154 -\123\151\147\156\040\156\166\055\163\141\061\050\060\046\006\003 -\125\004\003\023\037\107\154\157\142\141\154\123\151\147\156\040 -\123\145\143\165\162\145\040\115\141\151\154\040\122\157\157\164 -\040\122\064\065 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\122\061\013\060\011\006\003\125\004\006\023\002\102\105\061 -\031\060\027\006\003\125\004\012\023\020\107\154\157\142\141\154 -\123\151\147\156\040\156\166\055\163\141\061\050\060\046\006\003 -\125\004\003\023\037\107\154\157\142\141\154\123\151\147\156\040 -\123\145\143\165\162\145\040\115\141\151\154\040\122\157\157\164 -\040\122\064\065 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\166\123\376\250\114\120\253\237\215\062\265\035\003\217 -\127\334 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\160\060\202\003\130\240\003\002\001\002\002\020\166 -\123\376\250\114\120\253\237\215\062\265\035\003\217\127\334\060 -\015\006\011\052\206\110\206\367\015\001\001\014\005\000\060\122 -\061\013\060\011\006\003\125\004\006\023\002\102\105\061\031\060 -\027\006\003\125\004\012\023\020\107\154\157\142\141\154\123\151 -\147\156\040\156\166\055\163\141\061\050\060\046\006\003\125\004 -\003\023\037\107\154\157\142\141\154\123\151\147\156\040\123\145 -\143\165\162\145\040\115\141\151\154\040\122\157\157\164\040\122 -\064\065\060\036\027\015\062\060\060\063\061\070\060\060\060\060 -\060\060\132\027\015\064\065\060\063\061\070\060\060\060\060\060 -\060\132\060\122\061\013\060\011\006\003\125\004\006\023\002\102 -\105\061\031\060\027\006\003\125\004\012\023\020\107\154\157\142 -\141\154\123\151\147\156\040\156\166\055\163\141\061\050\060\046 -\006\003\125\004\003\023\037\107\154\157\142\141\154\123\151\147 -\156\040\123\145\143\165\162\145\040\115\141\151\154\040\122\157 -\157\164\040\122\064\065\060\202\002\042\060\015\006\011\052\206 -\110\206\367\015\001\001\001\005\000\003\202\002\017\000\060\202 -\002\012\002\202\002\001\000\334\171\314\155\006\371\155\273\340 -\126\004\154\177\340\165\314\055\005\111\350\113\334\124\354\133 -\167\225\162\277\177\142\235\205\251\212\044\120\137\123\345\333 -\164\157\244\051\133\023\052\011\255\232\305\057\302\367\166\073 -\241\105\106\252\103\346\044\376\053\260\157\062\160\031\106\132 -\171\046\057\374\075\175\137\144\313\127\314\141\141\250\331\225 -\156\343\225\240\156\177\107\022\030\326\357\003\311\373\212\372 -\232\275\202\025\251\125\167\113\021\117\131\340\153\303\161\363 -\014\330\124\325\201\150\076\023\271\025\056\207\212\074\104\047 -\066\142\044\156\370\054\005\162\060\141\275\102\221\043\304\235 -\045\247\331\124\232\024\243\061\255\200\171\014\247\143\154\230 -\243\254\127\107\063\037\145\226\341\320\322\065\332\371\161\367 -\241\246\045\265\101\135\337\076\140\330\321\366\237\245\362\270 -\314\023\252\217\371\262\156\341\203\055\223\335\076\205\032\335 -\350\261\134\046\001\313\111\205\374\374\322\324\177\205\142\206 -\164\371\313\354\065\042\242\014\060\217\073\253\171\353\126\362 -\372\102\363\355\371\037\105\211\100\051\255\352\222\164\352\122 -\375\126\264\053\332\242\355\165\302\156\253\316\122\220\113\366 -\336\360\111\217\232\110\324\210\031\155\105\346\314\214\271\335 -\144\140\140\002\100\370\271\317\274\130\353\075\205\271\306\012 -\323\234\007\146\217\307\030\071\043\106\341\074\036\243\057\120 -\141\222\013\075\053\154\361\243\107\070\127\221\253\015\217\306 -\235\115\004\322\046\122\134\345\245\375\052\055\026\052\001\151 -\347\251\175\341\066\267\261\052\305\331\261\215\275\271\213\316 -\314\213\241\076\013\110\315\120\225\064\304\330\010\131\330\153 -\046\364\276\365\324\042\027\000\127\311\256\233\004\060\063\237 -\013\373\337\126\242\311\156\124\166\332\261\227\142\047\131\017 -\021\212\042\033\144\226\077\250\361\267\044\112\215\074\123\174 -\155\203\166\075\262\046\110\163\365\104\026\001\055\011\052\216 -\026\226\120\320\163\006\135\273\042\110\202\114\012\106\132\077 -\200\377\134\362\362\232\254\054\010\340\326\352\360\022\070\201 -\117\246\020\355\106\253\314\026\234\013\317\144\246\231\002\205 -\104\147\106\255\375\115\347\002\003\001\000\001\243\102\060\100 -\060\016\006\003\125\035\017\001\001\377\004\004\003\002\001\206 -\060\017\006\003\125\035\023\001\001\377\004\005\060\003\001\001 -\377\060\035\006\003\125\035\016\004\026\004\024\240\223\025\050 -\156\356\217\010\262\065\306\236\142\171\164\247\261\016\053\173 -\060\015\006\011\052\206\110\206\367\015\001\001\014\005\000\003 -\202\002\001\000\105\012\370\321\134\254\142\201\320\004\327\266 -\377\127\121\211\013\014\313\336\044\145\067\373\253\236\355\146 -\364\352\014\031\151\211\270\031\261\060\126\264\331\366\367\276 -\306\256\227\313\105\366\021\214\072\060\144\114\301\237\131\300 -\106\102\010\006\107\144\027\170\340\225\007\006\326\214\242\254 -\251\331\077\323\173\126\117\374\304\207\050\337\266\053\026\043 -\300\237\037\133\343\326\104\136\042\117\043\004\214\065\026\265 -\171\007\206\134\057\227\342\366\010\144\246\334\333\250\212\343 -\244\173\167\015\321\051\223\050\040\264\123\243\113\116\137\336 -\301\366\165\043\374\037\074\170\117\160\061\170\057\242\065\124 -\161\004\254\310\304\155\303\366\221\261\376\315\356\104\156\201 -\366\100\305\076\052\001\277\253\114\261\003\077\015\021\344\017 -\322\044\343\042\210\233\237\137\107\075\121\111\340\011\067\176 -\027\041\061\166\267\147\161\110\050\113\045\327\020\350\237\141 -\131\026\305\076\062\116\037\014\316\243\314\017\344\307\021\007 -\042\057\070\010\335\133\227\353\102\154\131\232\232\356\172\320 -\235\337\305\333\011\103\056\012\252\031\075\153\350\152\060\172 -\127\346\277\263\152\071\251\217\343\361\117\145\150\266\275\237 -\050\217\241\026\132\011\120\072\062\056\035\057\104\021\102\246 -\000\346\061\230\377\055\241\017\346\244\140\126\317\171\327\262 -\116\327\260\372\156\014\127\043\307\316\037\245\261\114\155\031 -\111\236\016\177\160\217\161\077\130\050\237\165\335\141\340\072 -\267\071\266\356\227\324\065\121\373\213\111\140\310\074\146\256 -\227\356\215\046\131\127\273\170\360\172\120\060\011\260\140\252 -\237\116\334\311\076\036\072\334\142\223\063\260\072\124\164\157 -\054\061\105\321\153\021\062\152\150\166\366\075\366\152\023\136 -\044\230\347\352\035\232\317\170\202\007\140\367\115\020\323\201 -\232\105\215\236\257\233\334\200\307\103\262\225\150\244\303\016 -\350\012\107\025\277\124\063\334\001\347\325\246\036\163\330\172 -\262\277\057\255\343\125\060\236\337\016\101\274\340\021\365\241 -\014\250\042\341\343\000\243\116\160\174\222\343\004\321\172\102 -\212\165\220\131\343\233\321\114\242\144\275\163\171\233\157\362 -\263\301\366\074 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "GlobalSign Secure Mail Root R45" -# Issuer: CN=GlobalSign Secure Mail Root R45,O=GlobalSign nv-sa,C=BE -# Serial Number:76:53:fe:a8:4c:50:ab:9f:8d:32:b5:1d:03:8f:57:dc -# Subject: CN=GlobalSign Secure Mail Root R45,O=GlobalSign nv-sa,C=BE -# Not Valid Before: Wed Mar 18 00:00:00 2020 -# Not Valid After : Sat Mar 18 00:00:00 2045 -# Fingerprint (SHA-256): 31:9A:F0:A7:72:9E:6F:89:26:9C:13:1E:A6:A3:A1:6F:CD:86:38:9F:DC:AB:3C:47:A4:A6:75:C1:61:A3:F9:74 -# Fingerprint (SHA1): 76:18:D1:F3:80:24:3D:52:40:C6:11:6A:AD:57:77:09:7D:81:30:A0 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "GlobalSign Secure Mail Root R45" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\166\030\321\363\200\044\075\122\100\306\021\152\255\127\167\011 -\175\201\060\240 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\223\304\173\263\016\124\107\034\103\054\213\276\160\205\142\051 -END -CKA_ISSUER MULTILINE_OCTAL -\060\122\061\013\060\011\006\003\125\004\006\023\002\102\105\061 -\031\060\027\006\003\125\004\012\023\020\107\154\157\142\141\154 -\123\151\147\156\040\156\166\055\163\141\061\050\060\046\006\003 -\125\004\003\023\037\107\154\157\142\141\154\123\151\147\156\040 -\123\145\143\165\162\145\040\115\141\151\154\040\122\157\157\164 -\040\122\064\065 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\166\123\376\250\114\120\253\237\215\062\265\035\003\217 -\127\334 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "GlobalSign Secure Mail Root E45" -# -# Issuer: CN=GlobalSign Secure Mail Root E45,O=GlobalSign nv-sa,C=BE -# Serial Number:76:53:fe:aa:27:1d:95:46:5d:d6:f1:9e:e5:b8:90:0a -# Subject: CN=GlobalSign Secure Mail Root E45,O=GlobalSign nv-sa,C=BE -# Not Valid Before: Wed Mar 18 00:00:00 2020 -# Not Valid After : Sat Mar 18 00:00:00 2045 -# Fingerprint (SHA-256): 5C:BF:6F:B8:1F:D4:17:EA:41:28:CD:6F:81:72:A3:C9:40:20:94:F7:4A:B2:ED:3A:06:B4:40:5D:04:F3:0B:19 -# Fingerprint (SHA1): 18:2E:1F:32:4F:89:DF:BE:FE:88:89:F0:93:C2:C4:A0:2B:67:75:21 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "GlobalSign Secure Mail Root E45" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\122\061\013\060\011\006\003\125\004\006\023\002\102\105\061 -\031\060\027\006\003\125\004\012\023\020\107\154\157\142\141\154 -\123\151\147\156\040\156\166\055\163\141\061\050\060\046\006\003 -\125\004\003\023\037\107\154\157\142\141\154\123\151\147\156\040 -\123\145\143\165\162\145\040\115\141\151\154\040\122\157\157\164 -\040\105\064\065 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\122\061\013\060\011\006\003\125\004\006\023\002\102\105\061 -\031\060\027\006\003\125\004\012\023\020\107\154\157\142\141\154 -\123\151\147\156\040\156\166\055\163\141\061\050\060\046\006\003 -\125\004\003\023\037\107\154\157\142\141\154\123\151\147\156\040 -\123\145\143\165\162\145\040\115\141\151\154\040\122\157\157\164 -\040\105\064\065 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\166\123\376\252\047\035\225\106\135\326\361\236\345\270 -\220\012 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\041\060\202\001\247\240\003\002\001\002\002\020\166 -\123\376\252\047\035\225\106\135\326\361\236\345\270\220\012\060 -\012\006\010\052\206\110\316\075\004\003\003\060\122\061\013\060 -\011\006\003\125\004\006\023\002\102\105\061\031\060\027\006\003 -\125\004\012\023\020\107\154\157\142\141\154\123\151\147\156\040 -\156\166\055\163\141\061\050\060\046\006\003\125\004\003\023\037 -\107\154\157\142\141\154\123\151\147\156\040\123\145\143\165\162 -\145\040\115\141\151\154\040\122\157\157\164\040\105\064\065\060 -\036\027\015\062\060\060\063\061\070\060\060\060\060\060\060\132 -\027\015\064\065\060\063\061\070\060\060\060\060\060\060\132\060 -\122\061\013\060\011\006\003\125\004\006\023\002\102\105\061\031 -\060\027\006\003\125\004\012\023\020\107\154\157\142\141\154\123 -\151\147\156\040\156\166\055\163\141\061\050\060\046\006\003\125 -\004\003\023\037\107\154\157\142\141\154\123\151\147\156\040\123 -\145\143\165\162\145\040\115\141\151\154\040\122\157\157\164\040 -\105\064\065\060\166\060\020\006\007\052\206\110\316\075\002\001 -\006\005\053\201\004\000\042\003\142\000\004\371\171\213\201\107 -\067\211\226\077\105\111\120\177\032\046\013\223\062\176\056\300 -\300\247\010\232\303\156\217\233\076\013\042\354\067\123\267\157 -\212\260\274\047\067\113\155\251\106\073\331\037\377\245\241\104 -\273\055\163\277\236\101\007\134\123\233\121\010\072\132\273\157 -\070\307\026\221\170\302\112\023\151\035\202\337\132\057\000\210 -\226\242\056\034\164\371\235\176\146\067\212\243\102\060\100\060 -\016\006\003\125\035\017\001\001\377\004\004\003\002\001\206\060 -\017\006\003\125\035\023\001\001\377\004\005\060\003\001\001\377 -\060\035\006\003\125\035\016\004\026\004\024\337\023\136\213\137 -\302\100\002\375\126\267\224\114\266\036\325\246\261\024\226\060 -\012\006\010\052\206\110\316\075\004\003\003\003\150\000\060\145 -\002\060\023\260\276\327\161\040\076\344\253\234\316\066\022\175 -\137\114\037\052\265\151\105\063\137\323\055\132\262\344\210\307 -\336\012\066\102\062\171\235\246\153\272\341\371\104\052\173\212 -\303\022\002\061\000\240\146\034\116\207\235\207\311\355\231\114 -\033\012\356\055\140\303\067\307\035\315\265\162\260\331\306\357 -\274\362\377\077\360\122\335\010\347\252\144\171\303\344\151\127 -\221\057\244\313\174 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "GlobalSign Secure Mail Root E45" -# Issuer: CN=GlobalSign Secure Mail Root E45,O=GlobalSign nv-sa,C=BE -# Serial Number:76:53:fe:aa:27:1d:95:46:5d:d6:f1:9e:e5:b8:90:0a -# Subject: CN=GlobalSign Secure Mail Root E45,O=GlobalSign nv-sa,C=BE -# Not Valid Before: Wed Mar 18 00:00:00 2020 -# Not Valid After : Sat Mar 18 00:00:00 2045 -# Fingerprint (SHA-256): 5C:BF:6F:B8:1F:D4:17:EA:41:28:CD:6F:81:72:A3:C9:40:20:94:F7:4A:B2:ED:3A:06:B4:40:5D:04:F3:0B:19 -# Fingerprint (SHA1): 18:2E:1F:32:4F:89:DF:BE:FE:88:89:F0:93:C2:C4:A0:2B:67:75:21 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "GlobalSign Secure Mail Root E45" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\030\056\037\062\117\211\337\276\376\210\211\360\223\302\304\240 -\053\147\165\041 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\305\374\306\056\237\364\122\055\052\250\244\272\373\147\062\377 -END -CKA_ISSUER MULTILINE_OCTAL -\060\122\061\013\060\011\006\003\125\004\006\023\002\102\105\061 -\031\060\027\006\003\125\004\012\023\020\107\154\157\142\141\154 -\123\151\147\156\040\156\166\055\163\141\061\050\060\046\006\003 -\125\004\003\023\037\107\154\157\142\141\154\123\151\147\156\040 -\123\145\143\165\162\145\040\115\141\151\154\040\122\157\157\164 -\040\105\064\065 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\166\123\376\252\047\035\225\106\135\326\361\236\345\270 -\220\012 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "GlobalSign Root R46" -# -# Issuer: CN=GlobalSign Root R46,O=GlobalSign nv-sa,C=BE -# Serial Number:11:d2:bb:b9:d7:23:18:9e:40:5f:0a:9d:2d:d0:df:25:67:d1 -# Subject: CN=GlobalSign Root R46,O=GlobalSign nv-sa,C=BE -# Not Valid Before: Wed Mar 20 00:00:00 2019 -# Not Valid After : Tue Mar 20 00:00:00 2046 -# Fingerprint (SHA-256): 4F:A3:12:6D:8D:3A:11:D1:C4:85:5A:4F:80:7C:BA:D6:CF:91:9D:3A:5A:88:B0:3B:EA:2C:63:72:D9:3C:40:C9 -# Fingerprint (SHA1): 53:A2:B0:4B:CA:6B:D6:45:E6:39:8A:8E:C4:0D:D2:BF:77:C3:A2:90 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "GlobalSign Root R46" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\106\061\013\060\011\006\003\125\004\006\023\002\102\105\061 -\031\060\027\006\003\125\004\012\023\020\107\154\157\142\141\154 -\123\151\147\156\040\156\166\055\163\141\061\034\060\032\006\003 -\125\004\003\023\023\107\154\157\142\141\154\123\151\147\156\040 -\122\157\157\164\040\122\064\066 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\106\061\013\060\011\006\003\125\004\006\023\002\102\105\061 -\031\060\027\006\003\125\004\012\023\020\107\154\157\142\141\154 -\123\151\147\156\040\156\166\055\163\141\061\034\060\032\006\003 -\125\004\003\023\023\107\154\157\142\141\154\123\151\147\156\040 -\122\157\157\164\040\122\064\066 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\022\021\322\273\271\327\043\030\236\100\137\012\235\055\320 -\337\045\147\321 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\132\060\202\003\102\240\003\002\001\002\002\022\021 -\322\273\271\327\043\030\236\100\137\012\235\055\320\337\045\147 -\321\060\015\006\011\052\206\110\206\367\015\001\001\014\005\000 -\060\106\061\013\060\011\006\003\125\004\006\023\002\102\105\061 -\031\060\027\006\003\125\004\012\023\020\107\154\157\142\141\154 -\123\151\147\156\040\156\166\055\163\141\061\034\060\032\006\003 -\125\004\003\023\023\107\154\157\142\141\154\123\151\147\156\040 -\122\157\157\164\040\122\064\066\060\036\027\015\061\071\060\063 -\062\060\060\060\060\060\060\060\132\027\015\064\066\060\063\062 -\060\060\060\060\060\060\060\132\060\106\061\013\060\011\006\003 -\125\004\006\023\002\102\105\061\031\060\027\006\003\125\004\012 -\023\020\107\154\157\142\141\154\123\151\147\156\040\156\166\055 -\163\141\061\034\060\032\006\003\125\004\003\023\023\107\154\157 -\142\141\154\123\151\147\156\040\122\157\157\164\040\122\064\066 -\060\202\002\042\060\015\006\011\052\206\110\206\367\015\001\001 -\001\005\000\003\202\002\017\000\060\202\002\012\002\202\002\001 -\000\254\254\164\062\350\263\145\345\272\355\103\046\035\246\211 -\015\105\272\051\210\262\244\035\143\335\323\301\054\011\127\211 -\071\241\125\351\147\064\167\014\156\344\125\035\122\045\322\023 -\153\136\341\035\251\267\175\211\062\137\015\236\237\054\172\143 -\140\100\037\246\260\266\170\217\231\124\226\010\130\256\344\006 -\274\142\005\002\026\277\257\250\043\003\266\224\017\274\156\154 -\302\313\325\246\273\014\351\366\301\002\373\041\336\146\335\027 -\253\164\102\357\360\164\057\045\364\352\153\125\133\220\333\235 -\337\136\207\012\100\373\255\031\153\373\367\312\140\210\336\332 -\301\217\326\256\325\177\324\074\203\356\327\026\114\203\105\063 -\153\047\320\206\320\034\055\153\363\253\175\361\205\251\365\050 -\322\255\357\363\204\113\034\207\374\023\243\072\162\242\132\021 -\053\326\047\161\047\355\201\055\155\146\201\222\207\264\033\130 -\172\314\077\012\372\106\117\115\170\134\370\053\110\343\004\204 -\313\135\366\264\152\263\145\374\102\236\121\046\043\040\313\075 -\024\371\201\355\145\026\000\117\032\144\227\146\010\317\214\173 -\343\053\300\235\371\024\362\033\361\126\152\026\277\054\205\205 -\315\170\070\232\353\102\152\002\064\030\203\027\116\224\126\370 -\266\202\265\363\226\335\075\363\276\177\040\167\076\173\031\043 -\153\054\324\162\163\103\127\175\340\370\327\151\117\027\066\004 -\371\300\220\140\067\105\336\346\014\330\164\215\256\234\242\155 -\164\135\102\276\006\365\331\144\156\002\020\254\211\260\114\073 -\007\115\100\176\044\305\212\230\202\171\216\244\247\202\040\215 -\043\372\047\161\311\337\306\101\164\240\115\366\221\026\334\106 -\214\137\051\143\061\131\161\014\330\157\302\266\062\175\373\346 -\135\123\246\176\025\374\273\165\174\135\354\370\366\027\034\354 -\307\153\031\313\363\173\360\053\007\245\331\154\171\124\166\154 -\235\034\246\156\016\351\171\014\250\043\152\243\337\033\060\061 -\237\261\124\173\376\152\313\146\252\334\145\320\242\236\112\232 -\007\041\153\201\217\333\304\131\372\336\042\300\004\234\343\252 -\133\066\223\350\075\275\172\241\235\013\166\261\013\307\235\375 -\317\230\250\006\302\370\052\243\241\203\240\267\045\162\245\002 -\343\002\003\001\000\001\243\102\060\100\060\016\006\003\125\035 -\017\001\001\377\004\004\003\002\001\206\060\017\006\003\125\035 -\023\001\001\377\004\005\060\003\001\001\377\060\035\006\003\125 -\035\016\004\026\004\024\003\134\253\163\201\207\250\314\260\246 -\325\224\342\066\226\111\377\005\231\054\060\015\006\011\052\206 -\110\206\367\015\001\001\014\005\000\003\202\002\001\000\174\170 -\354\366\002\054\273\133\176\222\053\135\071\334\276\330\035\242 -\102\063\115\371\357\244\052\073\104\151\036\254\331\105\243\116 -\074\247\330\044\121\262\124\034\223\116\304\357\173\223\205\140 -\046\352\011\110\340\365\273\307\351\150\322\273\152\061\161\314 -\171\256\021\250\360\231\375\345\037\274\057\250\314\127\353\166 -\304\041\246\107\123\125\115\150\277\005\244\356\327\046\253\142 -\332\103\067\113\342\306\265\345\262\203\031\072\307\323\333\115 -\236\010\172\363\356\317\076\142\373\254\350\140\314\321\307\241 -\134\203\105\304\105\314\363\027\153\024\311\004\002\076\322\044 -\246\171\351\036\316\242\347\301\131\025\237\035\342\113\232\076 -\237\166\010\055\153\330\272\127\024\332\203\352\376\214\125\351 -\320\116\251\314\167\061\261\104\021\172\134\261\076\323\024\105 -\025\030\142\044\023\322\313\115\316\134\203\301\066\362\020\265 -\016\210\155\270\341\126\237\211\336\226\146\071\107\144\054\156 -\115\256\142\173\277\140\164\031\270\126\254\222\254\026\062\355 -\255\150\125\376\230\272\323\064\336\364\311\141\303\016\206\366 -\113\204\140\356\015\173\265\062\130\171\221\125\054\201\103\263 -\164\037\172\252\045\236\035\327\241\213\271\315\102\056\004\244 -\146\203\115\211\065\266\154\250\066\112\171\041\170\042\320\102 -\274\321\100\061\220\241\276\004\317\312\147\355\365\360\200\323 -\140\311\203\052\042\005\320\007\073\122\277\014\236\252\053\371 -\273\346\037\217\045\272\205\215\027\036\002\376\135\120\004\127 -\317\376\055\274\357\134\300\032\253\266\237\044\306\337\163\150 -\110\220\054\024\364\077\122\032\344\322\313\024\303\141\151\317 -\342\371\030\305\272\063\237\024\243\004\135\271\161\367\265\224 -\330\366\063\301\132\301\064\213\174\233\335\223\072\347\023\242 -\160\141\237\257\217\353\330\305\165\370\063\146\324\164\147\072 -\067\167\234\347\335\244\017\166\103\146\212\103\362\237\373\014 -\102\170\143\321\342\017\157\173\324\241\075\164\227\205\267\110 -\071\101\326\040\374\320\072\263\372\350\157\304\212\272\161\067 -\276\213\227\261\170\061\117\263\347\266\003\023\316\124\235\256 -\045\131\314\177\065\137\010\367\100\105\061\170\052\172 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "GlobalSign Root R46" -# Issuer: CN=GlobalSign Root R46,O=GlobalSign nv-sa,C=BE -# Serial Number:11:d2:bb:b9:d7:23:18:9e:40:5f:0a:9d:2d:d0:df:25:67:d1 -# Subject: CN=GlobalSign Root R46,O=GlobalSign nv-sa,C=BE -# Not Valid Before: Wed Mar 20 00:00:00 2019 -# Not Valid After : Tue Mar 20 00:00:00 2046 -# Fingerprint (SHA-256): 4F:A3:12:6D:8D:3A:11:D1:C4:85:5A:4F:80:7C:BA:D6:CF:91:9D:3A:5A:88:B0:3B:EA:2C:63:72:D9:3C:40:C9 -# Fingerprint (SHA1): 53:A2:B0:4B:CA:6B:D6:45:E6:39:8A:8E:C4:0D:D2:BF:77:C3:A2:90 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "GlobalSign Root R46" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\123\242\260\113\312\153\326\105\346\071\212\216\304\015\322\277 -\167\303\242\220 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\304\024\060\344\372\146\103\224\052\152\033\044\137\031\320\357 -END -CKA_ISSUER MULTILINE_OCTAL -\060\106\061\013\060\011\006\003\125\004\006\023\002\102\105\061 -\031\060\027\006\003\125\004\012\023\020\107\154\157\142\141\154 -\123\151\147\156\040\156\166\055\163\141\061\034\060\032\006\003 -\125\004\003\023\023\107\154\157\142\141\154\123\151\147\156\040 -\122\157\157\164\040\122\064\066 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\022\021\322\273\271\327\043\030\236\100\137\012\235\055\320 -\337\045\147\321 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "GlobalSign Root E46" -# -# Issuer: CN=GlobalSign Root E46,O=GlobalSign nv-sa,C=BE -# Serial Number:11:d2:bb:ba:33:6e:d4:bc:e6:24:68:c5:0d:84:1d:98:e8:43 -# Subject: CN=GlobalSign Root E46,O=GlobalSign nv-sa,C=BE -# Not Valid Before: Wed Mar 20 00:00:00 2019 -# Not Valid After : Tue Mar 20 00:00:00 2046 -# Fingerprint (SHA-256): CB:B9:C4:4D:84:B8:04:3E:10:50:EA:31:A6:9F:51:49:55:D7:BF:D2:E2:C6:B4:93:01:01:9A:D6:1D:9F:50:58 -# Fingerprint (SHA1): 39:B4:6C:D5:FE:80:06:EB:E2:2F:4A:BB:08:33:A0:AF:DB:B9:DD:84 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "GlobalSign Root E46" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\106\061\013\060\011\006\003\125\004\006\023\002\102\105\061 -\031\060\027\006\003\125\004\012\023\020\107\154\157\142\141\154 -\123\151\147\156\040\156\166\055\163\141\061\034\060\032\006\003 -\125\004\003\023\023\107\154\157\142\141\154\123\151\147\156\040 -\122\157\157\164\040\105\064\066 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\106\061\013\060\011\006\003\125\004\006\023\002\102\105\061 -\031\060\027\006\003\125\004\012\023\020\107\154\157\142\141\154 -\123\151\147\156\040\156\166\055\163\141\061\034\060\032\006\003 -\125\004\003\023\023\107\154\157\142\141\154\123\151\147\156\040 -\122\157\157\164\040\105\064\066 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\022\021\322\273\272\063\156\324\274\346\044\150\305\015\204 -\035\230\350\103 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\013\060\202\001\221\240\003\002\001\002\002\022\021 -\322\273\272\063\156\324\274\346\044\150\305\015\204\035\230\350 -\103\060\012\006\010\052\206\110\316\075\004\003\003\060\106\061 -\013\060\011\006\003\125\004\006\023\002\102\105\061\031\060\027 -\006\003\125\004\012\023\020\107\154\157\142\141\154\123\151\147 -\156\040\156\166\055\163\141\061\034\060\032\006\003\125\004\003 -\023\023\107\154\157\142\141\154\123\151\147\156\040\122\157\157 -\164\040\105\064\066\060\036\027\015\061\071\060\063\062\060\060 -\060\060\060\060\060\132\027\015\064\066\060\063\062\060\060\060 -\060\060\060\060\132\060\106\061\013\060\011\006\003\125\004\006 -\023\002\102\105\061\031\060\027\006\003\125\004\012\023\020\107 -\154\157\142\141\154\123\151\147\156\040\156\166\055\163\141\061 -\034\060\032\006\003\125\004\003\023\023\107\154\157\142\141\154 -\123\151\147\156\040\122\157\157\164\040\105\064\066\060\166\060 -\020\006\007\052\206\110\316\075\002\001\006\005\053\201\004\000 -\042\003\142\000\004\234\016\261\317\267\350\236\122\167\165\064 -\372\245\106\247\255\062\031\062\264\007\251\047\312\224\273\014 -\322\012\020\307\332\211\260\227\014\160\023\011\001\216\330\352 -\107\352\276\262\200\053\315\374\050\015\333\254\274\244\206\067 -\355\160\010\000\165\352\223\013\173\056\122\234\043\150\043\006 -\103\354\222\057\123\204\333\373\107\024\007\350\137\224\147\135 -\311\172\201\074\040\243\102\060\100\060\016\006\003\125\035\017 -\001\001\377\004\004\003\002\001\206\060\017\006\003\125\035\023 -\001\001\377\004\005\060\003\001\001\377\060\035\006\003\125\035 -\016\004\026\004\024\061\012\220\217\266\306\235\322\104\113\200 -\265\242\346\037\261\022\117\033\225\060\012\006\010\052\206\110 -\316\075\004\003\003\003\150\000\060\145\002\061\000\337\124\220 -\355\233\357\213\224\002\223\027\202\231\276\263\236\054\366\013 -\221\214\237\112\024\261\366\144\274\273\150\121\023\014\003\367 -\025\213\204\140\271\213\377\122\216\347\214\274\034\002\060\074 -\371\021\324\214\116\300\301\141\302\025\114\252\253\035\013\061 -\137\073\034\342\000\227\104\061\346\376\163\226\057\332\226\323 -\376\010\007\263\064\211\274\005\237\367\036\206\356\213\160 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "GlobalSign Root E46" -# Issuer: CN=GlobalSign Root E46,O=GlobalSign nv-sa,C=BE -# Serial Number:11:d2:bb:ba:33:6e:d4:bc:e6:24:68:c5:0d:84:1d:98:e8:43 -# Subject: CN=GlobalSign Root E46,O=GlobalSign nv-sa,C=BE -# Not Valid Before: Wed Mar 20 00:00:00 2019 -# Not Valid After : Tue Mar 20 00:00:00 2046 -# Fingerprint (SHA-256): CB:B9:C4:4D:84:B8:04:3E:10:50:EA:31:A6:9F:51:49:55:D7:BF:D2:E2:C6:B4:93:01:01:9A:D6:1D:9F:50:58 -# Fingerprint (SHA1): 39:B4:6C:D5:FE:80:06:EB:E2:2F:4A:BB:08:33:A0:AF:DB:B9:DD:84 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "GlobalSign Root E46" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\071\264\154\325\376\200\006\353\342\057\112\273\010\063\240\257 -\333\271\335\204 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\265\270\146\355\336\010\203\343\311\342\001\064\006\254\121\157 -END -CKA_ISSUER MULTILINE_OCTAL -\060\106\061\013\060\011\006\003\125\004\006\023\002\102\105\061 -\031\060\027\006\003\125\004\012\023\020\107\154\157\142\141\154 -\123\151\147\156\040\156\166\055\163\141\061\034\060\032\006\003 -\125\004\003\023\023\107\154\157\142\141\154\123\151\147\156\040 -\122\157\157\164\040\105\064\066 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\022\021\322\273\272\063\156\324\274\346\044\150\305\015\204 -\035\230\350\103 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "ANF Secure Server Root CA" -# -# Issuer: CN=ANF Secure Server Root CA,OU=ANF CA Raiz,O=ANF Autoridad de Certificacion,C=ES,serialNumber=G63287510 -# Serial Number:0d:d3:e3:bc:6c:f9:6b:b1 -# Subject: CN=ANF Secure Server Root CA,OU=ANF CA Raiz,O=ANF Autoridad de Certificacion,C=ES,serialNumber=G63287510 -# Not Valid Before: Wed Sep 04 10:00:38 2019 -# Not Valid After : Tue Aug 30 10:00:38 2039 -# Fingerprint (SHA-256): FB:8F:EC:75:91:69:B9:10:6B:1E:51:16:44:C6:18:C5:13:04:37:3F:6C:06:43:08:8D:8B:EF:FD:1B:99:75:99 -# Fingerprint (SHA1): 5B:6E:68:D0:CC:15:B6:A0:5F:1E:C1:5F:AE:02:FC:6B:2F:5D:6F:74 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "ANF Secure Server Root CA" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\201\204\061\022\060\020\006\003\125\004\005\023\011\107\066 -\063\062\070\067\065\061\060\061\013\060\011\006\003\125\004\006 -\023\002\105\123\061\047\060\045\006\003\125\004\012\023\036\101 -\116\106\040\101\165\164\157\162\151\144\141\144\040\144\145\040 -\103\145\162\164\151\146\151\143\141\143\151\157\156\061\024\060 -\022\006\003\125\004\013\023\013\101\116\106\040\103\101\040\122 -\141\151\172\061\042\060\040\006\003\125\004\003\023\031\101\116 -\106\040\123\145\143\165\162\145\040\123\145\162\166\145\162\040 -\122\157\157\164\040\103\101 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\201\204\061\022\060\020\006\003\125\004\005\023\011\107\066 -\063\062\070\067\065\061\060\061\013\060\011\006\003\125\004\006 -\023\002\105\123\061\047\060\045\006\003\125\004\012\023\036\101 -\116\106\040\101\165\164\157\162\151\144\141\144\040\144\145\040 -\103\145\162\164\151\146\151\143\141\143\151\157\156\061\024\060 -\022\006\003\125\004\013\023\013\101\116\106\040\103\101\040\122 -\141\151\172\061\042\060\040\006\003\125\004\003\023\031\101\116 -\106\040\123\145\143\165\162\145\040\123\145\162\166\145\162\040 -\122\157\157\164\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\010\015\323\343\274\154\371\153\261 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\357\060\202\003\327\240\003\002\001\002\002\010\015 -\323\343\274\154\371\153\261\060\015\006\011\052\206\110\206\367 -\015\001\001\013\005\000\060\201\204\061\022\060\020\006\003\125 -\004\005\023\011\107\066\063\062\070\067\065\061\060\061\013\060 -\011\006\003\125\004\006\023\002\105\123\061\047\060\045\006\003 -\125\004\012\023\036\101\116\106\040\101\165\164\157\162\151\144 -\141\144\040\144\145\040\103\145\162\164\151\146\151\143\141\143 -\151\157\156\061\024\060\022\006\003\125\004\013\023\013\101\116 -\106\040\103\101\040\122\141\151\172\061\042\060\040\006\003\125 -\004\003\023\031\101\116\106\040\123\145\143\165\162\145\040\123 -\145\162\166\145\162\040\122\157\157\164\040\103\101\060\036\027 -\015\061\071\060\071\060\064\061\060\060\060\063\070\132\027\015 -\063\071\060\070\063\060\061\060\060\060\063\070\132\060\201\204 -\061\022\060\020\006\003\125\004\005\023\011\107\066\063\062\070 -\067\065\061\060\061\013\060\011\006\003\125\004\006\023\002\105 -\123\061\047\060\045\006\003\125\004\012\023\036\101\116\106\040 -\101\165\164\157\162\151\144\141\144\040\144\145\040\103\145\162 -\164\151\146\151\143\141\143\151\157\156\061\024\060\022\006\003 -\125\004\013\023\013\101\116\106\040\103\101\040\122\141\151\172 -\061\042\060\040\006\003\125\004\003\023\031\101\116\106\040\123 -\145\143\165\162\145\040\123\145\162\166\145\162\040\122\157\157 -\164\040\103\101\060\202\002\042\060\015\006\011\052\206\110\206 -\367\015\001\001\001\005\000\003\202\002\017\000\060\202\002\012 -\002\202\002\001\000\333\353\153\053\346\144\124\225\202\220\243 -\162\244\031\001\235\234\013\201\137\163\111\272\247\254\363\004 -\116\173\226\013\354\021\340\133\246\034\316\033\322\015\203\034 -\053\270\236\035\176\105\062\140\017\007\351\167\130\176\237\152 -\310\141\116\266\046\301\114\215\377\114\357\064\262\037\145\330 -\271\170\365\255\251\161\271\357\117\130\035\245\336\164\040\227 -\241\355\150\114\336\222\027\113\274\253\377\145\232\236\373\107 -\331\127\162\363\011\241\256\166\104\023\156\234\055\104\071\274 -\371\307\073\244\130\075\101\275\264\302\111\243\310\015\322\227 -\057\007\145\122\000\247\156\310\257\150\354\364\024\226\266\127 -\037\126\303\071\237\053\155\344\363\076\366\065\144\332\014\034 -\241\204\113\057\113\113\342\054\044\235\155\223\100\353\265\043 -\216\062\312\157\105\323\250\211\173\036\317\036\372\133\103\213 -\315\315\250\017\152\312\014\136\271\236\107\217\360\331\266\012 -\013\130\145\027\063\271\043\344\167\031\175\313\112\056\222\173 -\117\057\020\167\261\215\057\150\234\142\314\340\120\370\354\221 -\247\124\114\127\011\325\166\143\305\350\145\036\356\155\152\317 -\011\235\372\174\117\255\140\010\375\126\231\017\025\054\173\251 -\200\253\214\141\217\112\007\166\102\336\075\364\335\262\044\063 -\133\270\265\243\104\311\254\177\167\074\035\043\354\202\251\246 -\342\310\006\114\002\376\254\134\231\231\013\057\020\212\246\364 -\177\325\207\164\015\131\111\105\366\360\161\134\071\051\326\277 -\112\043\213\365\137\001\143\322\207\163\050\265\113\012\365\370 -\253\202\054\176\163\045\062\035\013\143\012\027\201\000\377\266 -\166\136\347\264\261\100\312\041\273\325\200\121\345\110\122\147 -\054\322\141\211\007\015\017\316\102\167\300\104\163\234\104\120 -\240\333\020\012\055\225\034\201\257\344\034\345\024\036\361\066 -\101\001\002\057\175\163\247\336\102\314\114\351\211\015\126\367 -\237\221\324\003\306\154\311\217\333\330\034\340\100\230\135\146 -\231\230\200\156\055\377\001\305\316\313\106\037\254\002\306\103 -\346\256\242\204\074\305\116\036\075\155\311\024\114\343\056\101 -\273\312\071\277\066\074\052\031\252\101\207\116\245\316\113\062 -\171\335\220\111\177\002\003\001\000\001\243\143\060\141\060\037 -\006\003\125\035\043\004\030\060\026\200\024\234\137\320\154\143 -\243\137\223\312\223\230\010\255\214\207\245\054\134\301\067\060 -\035\006\003\125\035\016\004\026\004\024\234\137\320\154\143\243 -\137\223\312\223\230\010\255\214\207\245\054\134\301\067\060\016 -\006\003\125\035\017\001\001\377\004\004\003\002\001\206\060\017 -\006\003\125\035\023\001\001\377\004\005\060\003\001\001\377\060 -\015\006\011\052\206\110\206\367\015\001\001\013\005\000\003\202 -\002\001\000\116\036\271\212\306\240\230\077\156\303\151\300\152 -\134\111\122\254\313\053\135\170\070\301\325\124\204\237\223\360 -\207\031\075\054\146\211\353\015\102\374\314\360\165\205\077\213 -\364\200\135\171\345\027\147\275\065\202\342\362\074\216\175\133 -\066\313\132\200\000\051\362\316\053\054\361\217\252\155\005\223 -\154\162\307\126\353\337\120\043\050\345\105\020\075\350\147\243 -\257\016\125\017\220\011\142\357\113\131\242\366\123\361\300\065 -\344\057\301\044\275\171\057\116\040\042\073\375\032\040\260\244 -\016\054\160\355\164\077\270\023\225\006\121\310\350\207\046\312 -\244\133\152\026\041\222\335\163\140\236\020\030\336\074\201\352 -\350\030\303\174\211\362\213\120\076\275\021\342\025\003\250\066 -\175\063\001\154\110\025\327\210\220\231\004\305\314\346\007\364 -\274\364\220\355\023\342\352\213\303\217\243\063\017\301\051\114 -\023\116\332\025\126\161\163\162\202\120\366\232\063\174\242\261 -\250\032\064\164\145\134\316\321\353\253\123\340\032\200\330\352 -\072\111\344\046\060\233\345\034\212\250\251\025\062\206\231\222 -\012\020\043\126\022\340\366\316\114\342\273\276\333\215\222\163 -\001\146\057\142\076\262\162\047\105\066\355\115\126\343\227\231 -\377\072\065\076\245\124\112\122\131\113\140\333\356\376\170\021 -\177\112\334\024\171\140\266\153\144\003\333\025\203\341\242\276 -\366\043\227\120\360\011\063\066\247\161\226\045\363\271\102\175 -\333\070\077\054\130\254\350\102\341\016\330\323\073\114\056\202 -\351\203\056\153\061\331\335\107\206\117\155\227\221\056\117\342 -\050\161\065\026\321\362\163\376\045\053\007\107\044\143\047\310 -\370\366\331\153\374\022\061\126\010\300\123\102\257\234\320\063 -\176\374\006\360\061\104\003\024\361\130\352\362\152\015\251\021 -\262\203\276\305\032\277\007\352\131\334\243\210\065\357\234\166 -\062\074\115\006\042\316\025\345\335\236\330\217\332\336\322\304 -\071\345\027\201\317\070\107\353\177\210\155\131\033\337\237\102 -\024\256\176\317\250\260\146\145\332\067\257\237\252\075\352\050 -\266\336\325\061\130\026\202\133\352\273\031\165\002\163\032\312 -\110\032\041\223\220\012\216\223\204\247\175\073\043\030\222\211 -\240\215\254 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "ANF Secure Server Root CA" -# Issuer: CN=ANF Secure Server Root CA,OU=ANF CA Raiz,O=ANF Autoridad de Certificacion,C=ES,serialNumber=G63287510 -# Serial Number:0d:d3:e3:bc:6c:f9:6b:b1 -# Subject: CN=ANF Secure Server Root CA,OU=ANF CA Raiz,O=ANF Autoridad de Certificacion,C=ES,serialNumber=G63287510 -# Not Valid Before: Wed Sep 04 10:00:38 2019 -# Not Valid After : Tue Aug 30 10:00:38 2039 -# Fingerprint (SHA-256): FB:8F:EC:75:91:69:B9:10:6B:1E:51:16:44:C6:18:C5:13:04:37:3F:6C:06:43:08:8D:8B:EF:FD:1B:99:75:99 -# Fingerprint (SHA1): 5B:6E:68:D0:CC:15:B6:A0:5F:1E:C1:5F:AE:02:FC:6B:2F:5D:6F:74 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "ANF Secure Server Root CA" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\133\156\150\320\314\025\266\240\137\036\301\137\256\002\374\153 -\057\135\157\164 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\046\246\104\132\331\257\116\057\262\035\266\145\260\116\350\226 -END -CKA_ISSUER MULTILINE_OCTAL -\060\201\204\061\022\060\020\006\003\125\004\005\023\011\107\066 -\063\062\070\067\065\061\060\061\013\060\011\006\003\125\004\006 -\023\002\105\123\061\047\060\045\006\003\125\004\012\023\036\101 -\116\106\040\101\165\164\157\162\151\144\141\144\040\144\145\040 -\103\145\162\164\151\146\151\143\141\143\151\157\156\061\024\060 -\022\006\003\125\004\013\023\013\101\116\106\040\103\101\040\122 -\141\151\172\061\042\060\040\006\003\125\004\003\023\031\101\116 -\106\040\123\145\143\165\162\145\040\123\145\162\166\145\162\040 -\122\157\157\164\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\010\015\323\343\274\154\371\153\261 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Certum EC-384 CA" -# -# Issuer: CN=Certum EC-384 CA,OU=Certum Certification Authority,O=Asseco Data Systems S.A.,C=PL -# Serial Number:78:8f:27:5c:81:12:52:20:a5:04:d0:2d:dd:ba:73:f4 -# Subject: CN=Certum EC-384 CA,OU=Certum Certification Authority,O=Asseco Data Systems S.A.,C=PL -# Not Valid Before: Mon Mar 26 07:24:54 2018 -# Not Valid After : Thu Mar 26 07:24:54 2043 -# Fingerprint (SHA-256): 6B:32:80:85:62:53:18:AA:50:D1:73:C9:8D:8B:DA:09:D5:7E:27:41:3D:11:4C:F7:87:A0:F5:D0:6C:03:0C:F6 -# Fingerprint (SHA1): F3:3E:78:3C:AC:DF:F4:A2:CC:AC:67:55:69:56:D7:E5:16:3C:E1:ED -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Certum EC-384 CA" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\164\061\013\060\011\006\003\125\004\006\023\002\120\114\061 -\041\060\037\006\003\125\004\012\023\030\101\163\163\145\143\157 -\040\104\141\164\141\040\123\171\163\164\145\155\163\040\123\056 -\101\056\061\047\060\045\006\003\125\004\013\023\036\103\145\162 -\164\165\155\040\103\145\162\164\151\146\151\143\141\164\151\157 -\156\040\101\165\164\150\157\162\151\164\171\061\031\060\027\006 -\003\125\004\003\023\020\103\145\162\164\165\155\040\105\103\055 -\063\070\064\040\103\101 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\164\061\013\060\011\006\003\125\004\006\023\002\120\114\061 -\041\060\037\006\003\125\004\012\023\030\101\163\163\145\143\157 -\040\104\141\164\141\040\123\171\163\164\145\155\163\040\123\056 -\101\056\061\047\060\045\006\003\125\004\013\023\036\103\145\162 -\164\165\155\040\103\145\162\164\151\146\151\143\141\164\151\157 -\156\040\101\165\164\150\157\162\151\164\171\061\031\060\027\006 -\003\125\004\003\023\020\103\145\162\164\165\155\040\105\103\055 -\063\070\064\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\170\217\047\134\201\022\122\040\245\004\320\055\335\272 -\163\364 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\145\060\202\001\353\240\003\002\001\002\002\020\170 -\217\047\134\201\022\122\040\245\004\320\055\335\272\163\364\060 -\012\006\010\052\206\110\316\075\004\003\003\060\164\061\013\060 -\011\006\003\125\004\006\023\002\120\114\061\041\060\037\006\003 -\125\004\012\023\030\101\163\163\145\143\157\040\104\141\164\141 -\040\123\171\163\164\145\155\163\040\123\056\101\056\061\047\060 -\045\006\003\125\004\013\023\036\103\145\162\164\165\155\040\103 -\145\162\164\151\146\151\143\141\164\151\157\156\040\101\165\164 -\150\157\162\151\164\171\061\031\060\027\006\003\125\004\003\023 -\020\103\145\162\164\165\155\040\105\103\055\063\070\064\040\103 -\101\060\036\027\015\061\070\060\063\062\066\060\067\062\064\065 -\064\132\027\015\064\063\060\063\062\066\060\067\062\064\065\064 -\132\060\164\061\013\060\011\006\003\125\004\006\023\002\120\114 -\061\041\060\037\006\003\125\004\012\023\030\101\163\163\145\143 -\157\040\104\141\164\141\040\123\171\163\164\145\155\163\040\123 -\056\101\056\061\047\060\045\006\003\125\004\013\023\036\103\145 -\162\164\165\155\040\103\145\162\164\151\146\151\143\141\164\151 -\157\156\040\101\165\164\150\157\162\151\164\171\061\031\060\027 -\006\003\125\004\003\023\020\103\145\162\164\165\155\040\105\103 -\055\063\070\064\040\103\101\060\166\060\020\006\007\052\206\110 -\316\075\002\001\006\005\053\201\004\000\042\003\142\000\004\304 -\050\216\253\030\133\152\276\156\144\067\143\344\315\354\253\072 -\367\314\241\270\016\202\111\327\206\051\237\241\224\362\343\140 -\170\230\201\170\006\115\362\354\232\016\127\140\203\237\264\346 -\027\057\032\263\135\002\133\211\043\074\302\021\005\052\247\210 -\023\030\363\120\204\327\275\064\054\047\211\125\377\316\114\347 -\337\246\037\050\304\360\124\303\271\174\267\123\255\353\302\243 -\102\060\100\060\017\006\003\125\035\023\001\001\377\004\005\060 -\003\001\001\377\060\035\006\003\125\035\016\004\026\004\024\215 -\006\146\164\044\166\072\363\211\367\274\326\275\107\175\057\274 -\020\137\113\060\016\006\003\125\035\017\001\001\377\004\004\003 -\002\001\006\060\012\006\010\052\206\110\316\075\004\003\003\003 -\150\000\060\145\002\060\003\125\055\246\346\030\304\174\357\311 -\120\156\301\047\017\234\207\257\156\325\033\010\030\275\222\051 -\301\357\224\221\170\322\072\034\125\211\142\345\033\011\036\272 -\144\153\361\166\264\324\002\061\000\264\102\204\231\377\253\347 -\236\373\221\227\047\135\334\260\133\060\161\316\136\070\032\152 -\331\045\347\352\367\141\222\126\370\352\332\066\302\207\145\226 -\056\162\045\057\177\337\303\023\311 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Certum EC-384 CA" -# Issuer: CN=Certum EC-384 CA,OU=Certum Certification Authority,O=Asseco Data Systems S.A.,C=PL -# Serial Number:78:8f:27:5c:81:12:52:20:a5:04:d0:2d:dd:ba:73:f4 -# Subject: CN=Certum EC-384 CA,OU=Certum Certification Authority,O=Asseco Data Systems S.A.,C=PL -# Not Valid Before: Mon Mar 26 07:24:54 2018 -# Not Valid After : Thu Mar 26 07:24:54 2043 -# Fingerprint (SHA-256): 6B:32:80:85:62:53:18:AA:50:D1:73:C9:8D:8B:DA:09:D5:7E:27:41:3D:11:4C:F7:87:A0:F5:D0:6C:03:0C:F6 -# Fingerprint (SHA1): F3:3E:78:3C:AC:DF:F4:A2:CC:AC:67:55:69:56:D7:E5:16:3C:E1:ED -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Certum EC-384 CA" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\363\076\170\074\254\337\364\242\314\254\147\125\151\126\327\345 -\026\074\341\355 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\266\145\263\226\140\227\022\241\354\116\341\075\243\306\311\361 -END -CKA_ISSUER MULTILINE_OCTAL -\060\164\061\013\060\011\006\003\125\004\006\023\002\120\114\061 -\041\060\037\006\003\125\004\012\023\030\101\163\163\145\143\157 -\040\104\141\164\141\040\123\171\163\164\145\155\163\040\123\056 -\101\056\061\047\060\045\006\003\125\004\013\023\036\103\145\162 -\164\165\155\040\103\145\162\164\151\146\151\143\141\164\151\157 -\156\040\101\165\164\150\157\162\151\164\171\061\031\060\027\006 -\003\125\004\003\023\020\103\145\162\164\165\155\040\105\103\055 -\063\070\064\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\170\217\047\134\201\022\122\040\245\004\320\055\335\272 -\163\364 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Certum Trusted Root CA" -# -# Issuer: CN=Certum Trusted Root CA,OU=Certum Certification Authority,O=Asseco Data Systems S.A.,C=PL -# Serial Number:1e:bf:59:50:b8:c9:80:37:4c:06:f7:eb:55:4f:b5:ed -# Subject: CN=Certum Trusted Root CA,OU=Certum Certification Authority,O=Asseco Data Systems S.A.,C=PL -# Not Valid Before: Fri Mar 16 12:10:13 2018 -# Not Valid After : Mon Mar 16 12:10:13 2043 -# Fingerprint (SHA-256): FE:76:96:57:38:55:77:3E:37:A9:5E:7A:D4:D9:CC:96:C3:01:57:C1:5D:31:76:5B:A9:B1:57:04:E1:AE:78:FD -# Fingerprint (SHA1): C8:83:44:C0:18:AE:9F:CC:F1:87:B7:8F:22:D1:C5:D7:45:84:BA:E5 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Certum Trusted Root CA" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\172\061\013\060\011\006\003\125\004\006\023\002\120\114\061 -\041\060\037\006\003\125\004\012\023\030\101\163\163\145\143\157 -\040\104\141\164\141\040\123\171\163\164\145\155\163\040\123\056 -\101\056\061\047\060\045\006\003\125\004\013\023\036\103\145\162 -\164\165\155\040\103\145\162\164\151\146\151\143\141\164\151\157 -\156\040\101\165\164\150\157\162\151\164\171\061\037\060\035\006 -\003\125\004\003\023\026\103\145\162\164\165\155\040\124\162\165 -\163\164\145\144\040\122\157\157\164\040\103\101 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\172\061\013\060\011\006\003\125\004\006\023\002\120\114\061 -\041\060\037\006\003\125\004\012\023\030\101\163\163\145\143\157 -\040\104\141\164\141\040\123\171\163\164\145\155\163\040\123\056 -\101\056\061\047\060\045\006\003\125\004\013\023\036\103\145\162 -\164\165\155\040\103\145\162\164\151\146\151\143\141\164\151\157 -\156\040\101\165\164\150\157\162\151\164\171\061\037\060\035\006 -\003\125\004\003\023\026\103\145\162\164\165\155\040\124\162\165 -\163\164\145\144\040\122\157\157\164\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\036\277\131\120\270\311\200\067\114\006\367\353\125\117 -\265\355 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\300\060\202\003\250\240\003\002\001\002\002\020\036 -\277\131\120\270\311\200\067\114\006\367\353\125\117\265\355\060 -\015\006\011\052\206\110\206\367\015\001\001\015\005\000\060\172 -\061\013\060\011\006\003\125\004\006\023\002\120\114\061\041\060 -\037\006\003\125\004\012\023\030\101\163\163\145\143\157\040\104 -\141\164\141\040\123\171\163\164\145\155\163\040\123\056\101\056 -\061\047\060\045\006\003\125\004\013\023\036\103\145\162\164\165 -\155\040\103\145\162\164\151\146\151\143\141\164\151\157\156\040 -\101\165\164\150\157\162\151\164\171\061\037\060\035\006\003\125 -\004\003\023\026\103\145\162\164\165\155\040\124\162\165\163\164 -\145\144\040\122\157\157\164\040\103\101\060\036\027\015\061\070 -\060\063\061\066\061\062\061\060\061\063\132\027\015\064\063\060 -\063\061\066\061\062\061\060\061\063\132\060\172\061\013\060\011 -\006\003\125\004\006\023\002\120\114\061\041\060\037\006\003\125 -\004\012\023\030\101\163\163\145\143\157\040\104\141\164\141\040 -\123\171\163\164\145\155\163\040\123\056\101\056\061\047\060\045 -\006\003\125\004\013\023\036\103\145\162\164\165\155\040\103\145 -\162\164\151\146\151\143\141\164\151\157\156\040\101\165\164\150 -\157\162\151\164\171\061\037\060\035\006\003\125\004\003\023\026 -\103\145\162\164\165\155\040\124\162\165\163\164\145\144\040\122 -\157\157\164\040\103\101\060\202\002\042\060\015\006\011\052\206 -\110\206\367\015\001\001\001\005\000\003\202\002\017\000\060\202 -\002\012\002\202\002\001\000\321\055\216\273\267\066\352\155\067 -\221\237\116\223\247\005\344\051\003\045\316\034\202\367\174\231 -\237\101\006\315\355\243\272\300\333\011\054\301\174\337\051\176 -\113\145\057\223\247\324\001\153\003\050\030\243\330\235\005\301 -\052\330\105\361\221\336\337\073\320\200\002\214\317\070\017\352 -\247\134\170\021\244\301\310\205\134\045\323\323\262\347\045\317 -\021\124\227\253\065\300\036\166\034\357\000\123\237\071\334\024 -\245\054\042\045\263\162\162\374\215\263\345\076\010\036\024\052 -\067\013\210\074\312\260\364\310\302\241\256\274\301\276\051\147 -\125\342\374\255\131\134\376\275\127\054\260\220\215\302\355\067 -\266\174\231\210\265\325\003\232\075\025\015\075\072\250\250\105 -\360\225\116\045\131\035\315\230\151\273\323\314\062\311\215\357 -\201\376\255\175\211\273\272\140\023\312\145\225\147\240\363\031 -\366\003\126\324\152\323\047\342\241\255\203\360\112\022\042\167 -\034\005\163\342\031\161\102\300\354\165\106\232\220\130\340\152 -\216\053\245\106\060\004\216\031\262\027\343\276\251\272\177\126 -\361\044\003\327\262\041\050\166\016\066\060\114\171\325\101\232 -\232\250\270\065\272\014\072\362\104\033\040\210\367\305\045\327 -\075\306\343\076\103\335\207\376\304\352\365\123\076\114\145\377 -\073\112\313\170\132\153\027\137\015\307\303\117\116\232\052\242 -\355\127\115\042\342\106\232\077\017\221\064\044\175\125\343\214 -\225\067\323\032\360\011\053\054\322\311\215\264\015\000\253\147 -\051\050\330\001\365\031\004\266\035\276\166\376\162\134\304\205 -\312\322\200\101\337\005\250\243\325\204\220\117\013\363\340\077 -\233\031\322\067\211\077\362\173\122\034\214\366\341\367\074\007 -\227\214\016\242\131\201\014\262\220\075\323\343\131\106\355\017 -\251\247\336\200\153\132\252\007\266\031\313\274\127\363\227\041 -\172\014\261\053\164\076\353\332\247\147\055\114\304\230\236\066 -\011\166\146\146\374\032\077\352\110\124\034\276\060\275\200\120 -\277\174\265\316\000\366\014\141\331\347\044\003\340\343\001\201 -\016\275\330\205\064\210\275\262\066\250\173\134\010\345\104\200 -\214\157\370\057\325\041\312\035\034\320\373\304\265\207\321\072 -\116\307\166\265\065\110\265\002\003\001\000\001\243\102\060\100 -\060\017\006\003\125\035\023\001\001\377\004\005\060\003\001\001 -\377\060\035\006\003\125\035\016\004\026\004\024\214\373\034\165 -\274\002\323\237\116\056\110\331\371\140\124\252\304\263\117\372 -\060\016\006\003\125\035\017\001\001\377\004\004\003\002\001\006 -\060\015\006\011\052\206\110\206\367\015\001\001\015\005\000\003 -\202\002\001\000\110\242\325\000\013\056\320\077\274\034\325\265 -\124\111\036\132\153\364\344\362\340\100\067\340\314\024\173\271 -\311\372\065\265\165\027\223\152\005\151\205\234\315\117\031\170 -\133\031\201\363\143\076\303\316\133\217\365\057\136\001\166\023 -\077\054\000\271\315\226\122\071\111\155\004\116\305\351\017\206 -\015\341\372\263\137\202\022\361\072\316\146\006\044\064\053\350 -\314\312\347\151\334\207\235\302\064\327\171\321\323\167\270\252 -\131\130\376\235\046\372\070\206\076\235\212\207\144\127\345\027 -\072\342\371\215\271\343\063\170\301\220\330\270\335\267\203\121 -\344\304\314\043\325\006\174\346\121\323\315\064\061\300\366\106 -\273\013\255\374\075\020\005\052\073\112\221\045\356\214\324\204 -\207\200\052\274\011\214\252\072\023\137\350\064\171\120\301\020 -\031\371\323\050\036\324\321\121\060\051\263\256\220\147\326\037 -\012\143\261\305\251\306\102\061\143\027\224\357\151\313\057\372 -\214\024\175\304\103\030\211\331\360\062\100\346\200\342\106\137 -\345\343\301\000\131\250\371\350\040\274\211\054\016\107\064\013 -\352\127\302\123\066\374\247\324\257\061\315\376\002\345\165\372 -\271\047\011\371\363\365\073\312\175\237\251\042\313\210\311\252 -\321\107\075\066\167\250\131\144\153\047\317\357\047\301\343\044 -\265\206\367\256\176\062\115\260\171\150\321\071\350\220\130\303 -\203\274\017\054\326\227\353\316\014\341\040\307\332\267\076\303 -\077\277\057\334\064\244\373\053\041\315\147\217\113\364\343\352 -\324\077\347\117\272\271\245\223\105\034\146\037\041\372\144\136 -\157\340\166\224\062\313\165\365\156\345\366\217\307\270\244\314 -\250\226\175\144\373\044\132\112\003\154\153\070\306\350\003\103 -\232\367\127\271\263\051\151\223\070\364\003\362\273\373\202\153 -\007\040\321\122\037\232\144\002\173\230\146\333\134\115\132\017 -\320\204\225\240\074\024\103\006\312\312\333\270\101\066\332\152 -\104\147\207\257\257\343\105\021\025\151\010\262\276\026\071\227 -\044\157\022\105\321\147\135\011\250\311\025\332\372\322\246\137 -\023\141\037\277\205\254\264\255\255\005\224\010\203\036\165\027 -\323\161\073\223\120\043\131\240\355\074\221\124\235\166\000\305 -\303\270\070\333 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Certum Trusted Root CA" -# Issuer: CN=Certum Trusted Root CA,OU=Certum Certification Authority,O=Asseco Data Systems S.A.,C=PL -# Serial Number:1e:bf:59:50:b8:c9:80:37:4c:06:f7:eb:55:4f:b5:ed -# Subject: CN=Certum Trusted Root CA,OU=Certum Certification Authority,O=Asseco Data Systems S.A.,C=PL -# Not Valid Before: Fri Mar 16 12:10:13 2018 -# Not Valid After : Mon Mar 16 12:10:13 2043 -# Fingerprint (SHA-256): FE:76:96:57:38:55:77:3E:37:A9:5E:7A:D4:D9:CC:96:C3:01:57:C1:5D:31:76:5B:A9:B1:57:04:E1:AE:78:FD -# Fingerprint (SHA1): C8:83:44:C0:18:AE:9F:CC:F1:87:B7:8F:22:D1:C5:D7:45:84:BA:E5 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Certum Trusted Root CA" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\310\203\104\300\030\256\237\314\361\207\267\217\042\321\305\327 -\105\204\272\345 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\121\341\302\347\376\114\204\257\131\016\057\364\124\157\352\051 -END -CKA_ISSUER MULTILINE_OCTAL -\060\172\061\013\060\011\006\003\125\004\006\023\002\120\114\061 -\041\060\037\006\003\125\004\012\023\030\101\163\163\145\143\157 -\040\104\141\164\141\040\123\171\163\164\145\155\163\040\123\056 -\101\056\061\047\060\045\006\003\125\004\013\023\036\103\145\162 -\164\165\155\040\103\145\162\164\151\146\151\143\141\164\151\157 -\156\040\101\165\164\150\157\162\151\164\171\061\037\060\035\006 -\003\125\004\003\023\026\103\145\162\164\165\155\040\124\162\165 -\163\164\145\144\040\122\157\157\164\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\036\277\131\120\270\311\200\067\114\006\367\353\125\117 -\265\355 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "TunTrust Root CA" -# -# Issuer: CN=TunTrust Root CA,O=Agence Nationale de Certification Electronique,C=TN -# Serial Number:13:02:d5:e2:40:4c:92:46:86:16:67:5d:b4:bb:bb:b2:6b:3e:fc:13 -# Subject: CN=TunTrust Root CA,O=Agence Nationale de Certification Electronique,C=TN -# Not Valid Before: Fri Apr 26 08:57:56 2019 -# Not Valid After : Tue Apr 26 08:57:56 2044 -# Fingerprint (SHA-256): 2E:44:10:2A:B5:8C:B8:54:19:45:1C:8E:19:D9:AC:F3:66:2C:AF:BC:61:4B:6A:53:96:0A:30:F7:D0:E2:EB:41 -# Fingerprint (SHA1): CF:E9:70:84:0F:E0:73:0F:9D:F6:0C:7F:2C:4B:EE:20:46:34:9C:BB -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "TunTrust Root CA" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\141\061\013\060\011\006\003\125\004\006\023\002\124\116\061 -\067\060\065\006\003\125\004\012\014\056\101\147\145\156\143\145 -\040\116\141\164\151\157\156\141\154\145\040\144\145\040\103\145 -\162\164\151\146\151\143\141\164\151\157\156\040\105\154\145\143 -\164\162\157\156\151\161\165\145\061\031\060\027\006\003\125\004 -\003\014\020\124\165\156\124\162\165\163\164\040\122\157\157\164 -\040\103\101 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\141\061\013\060\011\006\003\125\004\006\023\002\124\116\061 -\067\060\065\006\003\125\004\012\014\056\101\147\145\156\143\145 -\040\116\141\164\151\157\156\141\154\145\040\144\145\040\103\145 -\162\164\151\146\151\143\141\164\151\157\156\040\105\154\145\143 -\164\162\157\156\151\161\165\145\061\031\060\027\006\003\125\004 -\003\014\020\124\165\156\124\162\165\163\164\040\122\157\157\164 -\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\023\002\325\342\100\114\222\106\206\026\147\135\264\273 -\273\262\153\076\374\023 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\263\060\202\003\233\240\003\002\001\002\002\024\023 -\002\325\342\100\114\222\106\206\026\147\135\264\273\273\262\153 -\076\374\023\060\015\006\011\052\206\110\206\367\015\001\001\013 -\005\000\060\141\061\013\060\011\006\003\125\004\006\023\002\124 -\116\061\067\060\065\006\003\125\004\012\014\056\101\147\145\156 -\143\145\040\116\141\164\151\157\156\141\154\145\040\144\145\040 -\103\145\162\164\151\146\151\143\141\164\151\157\156\040\105\154 -\145\143\164\162\157\156\151\161\165\145\061\031\060\027\006\003 -\125\004\003\014\020\124\165\156\124\162\165\163\164\040\122\157 -\157\164\040\103\101\060\036\027\015\061\071\060\064\062\066\060 -\070\065\067\065\066\132\027\015\064\064\060\064\062\066\060\070 -\065\067\065\066\132\060\141\061\013\060\011\006\003\125\004\006 -\023\002\124\116\061\067\060\065\006\003\125\004\012\014\056\101 -\147\145\156\143\145\040\116\141\164\151\157\156\141\154\145\040 -\144\145\040\103\145\162\164\151\146\151\143\141\164\151\157\156 -\040\105\154\145\143\164\162\157\156\151\161\165\145\061\031\060 -\027\006\003\125\004\003\014\020\124\165\156\124\162\165\163\164 -\040\122\157\157\164\040\103\101\060\202\002\042\060\015\006\011 -\052\206\110\206\367\015\001\001\001\005\000\003\202\002\017\000 -\060\202\002\012\002\202\002\001\000\303\315\323\374\275\004\123 -\335\014\040\072\325\210\056\005\113\101\365\203\202\176\367\131 -\237\236\236\143\350\163\332\366\006\251\117\037\264\371\013\037 -\071\214\232\040\320\176\006\324\354\064\331\206\274\165\133\207 -\210\360\322\331\324\243\012\262\154\033\353\111\054\076\254\135 -\330\224\003\240\354\064\345\060\304\065\175\373\046\115\033\156 -\060\124\330\365\200\105\234\071\255\234\311\045\004\115\232\220 -\076\116\100\156\212\153\315\051\147\306\314\055\340\164\350\005 -\127\012\110\120\372\172\103\332\176\354\133\232\016\142\166\376 -\352\235\035\205\162\354\021\273\065\350\037\047\277\301\241\307 -\273\110\026\335\126\327\314\116\240\341\271\254\333\325\203\031 -\032\205\321\224\227\327\312\243\145\013\363\070\371\002\256\335 -\366\147\317\311\077\365\212\054\107\032\231\157\005\015\375\320 -\035\202\061\374\051\314\000\130\227\221\114\200\000\034\063\205 -\226\057\313\101\302\213\020\204\303\011\044\211\037\265\017\331 -\331\167\107\030\222\224\140\134\307\231\003\074\376\367\225\247 -\175\120\241\200\302\251\203\255\130\226\125\041\333\206\131\324 -\257\306\274\335\201\156\007\333\140\142\376\354\020\156\332\150 -\001\364\203\033\251\076\242\133\043\327\144\306\337\334\242\175 -\330\113\272\202\322\121\370\146\277\006\106\344\171\052\046\066 -\171\217\037\116\231\035\262\217\014\016\034\377\311\135\300\375 -\220\020\246\261\067\363\315\072\044\156\264\205\220\277\200\271 -\014\214\325\233\326\310\361\126\077\032\200\211\172\251\342\033 -\062\121\054\076\362\337\173\366\135\172\051\031\216\345\310\275 -\066\161\213\135\114\302\035\077\255\130\242\317\075\160\115\246 -\120\230\045\334\043\371\270\130\101\010\161\277\117\270\204\240 -\217\000\124\025\374\221\155\130\247\226\073\353\113\226\047\315 -\153\242\241\206\254\015\174\124\346\146\114\146\137\220\276\041 -\232\002\106\055\344\203\302\200\271\317\113\076\350\177\074\001 -\354\217\136\315\177\322\050\102\001\225\212\342\227\075\020\041 -\175\366\235\034\305\064\241\354\054\016\012\122\054\022\125\160 -\044\075\313\302\024\065\103\135\047\116\276\300\275\252\174\226 -\347\374\236\141\255\104\323\000\227\002\003\001\000\001\243\143 -\060\141\060\035\006\003\125\035\016\004\026\004\024\006\232\233 -\037\123\175\361\365\244\310\323\206\076\241\163\131\264\367\104 -\041\060\017\006\003\125\035\023\001\001\377\004\005\060\003\001 -\001\377\060\037\006\003\125\035\043\004\030\060\026\200\024\006 -\232\233\037\123\175\361\365\244\310\323\206\076\241\163\131\264 -\367\104\041\060\016\006\003\125\035\017\001\001\377\004\004\003 -\002\001\006\060\015\006\011\052\206\110\206\367\015\001\001\013 -\005\000\003\202\002\001\000\252\005\156\266\335\025\311\277\263 -\306\040\366\006\107\260\206\223\045\323\215\271\310\000\077\227 -\365\122\047\210\161\311\164\375\353\312\144\333\133\357\036\135 -\272\277\321\353\356\134\151\272\026\310\363\271\217\323\066\056 -\100\111\007\015\131\336\213\020\260\111\005\342\377\221\077\113 -\267\335\002\216\370\201\050\134\314\334\155\257\137\024\234\175 -\130\170\015\366\200\011\271\351\016\227\051\031\270\267\353\370 -\026\313\125\022\344\306\175\273\304\354\370\265\034\116\076\147 -\277\305\137\033\155\155\107\050\252\004\130\141\326\166\277\042 -\177\320\007\152\247\144\123\360\227\215\235\200\077\273\301\007 -\333\145\257\346\233\062\232\303\124\223\304\034\010\303\104\373 -\173\143\021\103\321\152\032\141\152\171\155\220\117\051\216\107 -\005\301\022\151\151\326\306\066\061\341\374\372\200\272\134\117 -\304\353\267\062\254\370\165\141\027\327\020\031\271\361\322\011 -\357\172\102\235\133\132\013\324\306\225\116\052\316\377\007\327 -\117\176\030\006\210\361\031\265\331\230\273\256\161\304\034\347 -\164\131\130\357\014\211\317\213\037\165\223\032\004\024\222\110 -\120\251\353\127\051\000\026\343\066\034\310\370\277\360\063\325 -\101\017\304\314\074\335\351\063\103\001\221\020\053\036\321\271 -\135\315\062\031\213\217\214\040\167\327\042\304\102\334\204\026 -\233\045\155\350\264\125\161\177\260\174\263\323\161\111\271\317 -\122\244\004\077\334\075\240\273\257\063\236\012\060\140\216\333 -\235\135\224\250\275\140\347\142\200\166\201\203\014\214\314\060 -\106\111\342\014\322\250\257\353\141\161\357\347\042\142\251\367 -\134\144\154\237\026\214\147\066\047\105\365\011\173\277\366\020 -\012\361\260\215\124\103\214\004\272\243\077\357\342\065\307\371 -\164\340\157\064\101\320\277\163\145\127\040\371\233\147\172\146 -\150\044\116\200\145\275\020\231\006\131\362\145\257\270\306\107 -\273\375\220\170\213\101\163\056\257\125\037\334\073\222\162\156 -\204\323\320\141\114\015\314\166\127\342\055\205\042\025\066\015 -\353\001\235\353\330\353\304\204\231\373\300\014\314\062\350\343 -\167\332\203\104\213\236\125\050\300\213\130\323\220\076\116\033 -\000\361\025\255\203\053\232 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "TunTrust Root CA" -# Issuer: CN=TunTrust Root CA,O=Agence Nationale de Certification Electronique,C=TN -# Serial Number:13:02:d5:e2:40:4c:92:46:86:16:67:5d:b4:bb:bb:b2:6b:3e:fc:13 -# Subject: CN=TunTrust Root CA,O=Agence Nationale de Certification Electronique,C=TN -# Not Valid Before: Fri Apr 26 08:57:56 2019 -# Not Valid After : Tue Apr 26 08:57:56 2044 -# Fingerprint (SHA-256): 2E:44:10:2A:B5:8C:B8:54:19:45:1C:8E:19:D9:AC:F3:66:2C:AF:BC:61:4B:6A:53:96:0A:30:F7:D0:E2:EB:41 -# Fingerprint (SHA1): CF:E9:70:84:0F:E0:73:0F:9D:F6:0C:7F:2C:4B:EE:20:46:34:9C:BB -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "TunTrust Root CA" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\317\351\160\204\017\340\163\017\235\366\014\177\054\113\356\040 -\106\064\234\273 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\205\023\271\220\133\066\134\266\136\270\132\370\340\061\127\264 -END -CKA_ISSUER MULTILINE_OCTAL -\060\141\061\013\060\011\006\003\125\004\006\023\002\124\116\061 -\067\060\065\006\003\125\004\012\014\056\101\147\145\156\143\145 -\040\116\141\164\151\157\156\141\154\145\040\144\145\040\103\145 -\162\164\151\146\151\143\141\164\151\157\156\040\105\154\145\143 -\164\162\157\156\151\161\165\145\061\031\060\027\006\003\125\004 -\003\014\020\124\165\156\124\162\165\163\164\040\122\157\157\164 -\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\023\002\325\342\100\114\222\106\206\026\147\135\264\273 -\273\262\153\076\374\023 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "HARICA TLS RSA Root CA 2021" -# -# Issuer: CN=HARICA TLS RSA Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR -# Serial Number:39:ca:93:1c:ef:43:f3:c6:8e:93:c7:f4:64:89:38:7e -# Subject: CN=HARICA TLS RSA Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR -# Not Valid Before: Fri Feb 19 10:55:38 2021 -# Not Valid After : Mon Feb 13 10:55:37 2045 -# Fingerprint (SHA-256): D9:5D:0E:8E:DA:79:52:5B:F9:BE:B1:1B:14:D2:10:0D:32:94:98:5F:0C:62:D9:FA:BD:9C:D9:99:EC:CB:7B:1D -# Fingerprint (SHA1): 02:2D:05:82:FA:88:CE:14:0C:06:79:DE:7F:14:10:E9:45:D7:A5:6D -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "HARICA TLS RSA Root CA 2021" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\154\061\013\060\011\006\003\125\004\006\023\002\107\122\061 -\067\060\065\006\003\125\004\012\014\056\110\145\154\154\145\156 -\151\143\040\101\143\141\144\145\155\151\143\040\141\156\144\040 -\122\145\163\145\141\162\143\150\040\111\156\163\164\151\164\165 -\164\151\157\156\163\040\103\101\061\044\060\042\006\003\125\004 -\003\014\033\110\101\122\111\103\101\040\124\114\123\040\122\123 -\101\040\122\157\157\164\040\103\101\040\062\060\062\061 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\154\061\013\060\011\006\003\125\004\006\023\002\107\122\061 -\067\060\065\006\003\125\004\012\014\056\110\145\154\154\145\156 -\151\143\040\101\143\141\144\145\155\151\143\040\141\156\144\040 -\122\145\163\145\141\162\143\150\040\111\156\163\164\151\164\165 -\164\151\157\156\163\040\103\101\061\044\060\042\006\003\125\004 -\003\014\033\110\101\122\111\103\101\040\124\114\123\040\122\123 -\101\040\122\157\157\164\040\103\101\040\062\060\062\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\071\312\223\034\357\103\363\306\216\223\307\364\144\211 -\070\176 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\244\060\202\003\214\240\003\002\001\002\002\020\071 -\312\223\034\357\103\363\306\216\223\307\364\144\211\070\176\060 -\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060\154 -\061\013\060\011\006\003\125\004\006\023\002\107\122\061\067\060 -\065\006\003\125\004\012\014\056\110\145\154\154\145\156\151\143 -\040\101\143\141\144\145\155\151\143\040\141\156\144\040\122\145 -\163\145\141\162\143\150\040\111\156\163\164\151\164\165\164\151 -\157\156\163\040\103\101\061\044\060\042\006\003\125\004\003\014 -\033\110\101\122\111\103\101\040\124\114\123\040\122\123\101\040 -\122\157\157\164\040\103\101\040\062\060\062\061\060\036\027\015 -\062\061\060\062\061\071\061\060\065\065\063\070\132\027\015\064 -\065\060\062\061\063\061\060\065\065\063\067\132\060\154\061\013 -\060\011\006\003\125\004\006\023\002\107\122\061\067\060\065\006 -\003\125\004\012\014\056\110\145\154\154\145\156\151\143\040\101 -\143\141\144\145\155\151\143\040\141\156\144\040\122\145\163\145 -\141\162\143\150\040\111\156\163\164\151\164\165\164\151\157\156 -\163\040\103\101\061\044\060\042\006\003\125\004\003\014\033\110 -\101\122\111\103\101\040\124\114\123\040\122\123\101\040\122\157 -\157\164\040\103\101\040\062\060\062\061\060\202\002\042\060\015 -\006\011\052\206\110\206\367\015\001\001\001\005\000\003\202\002 -\017\000\060\202\002\012\002\202\002\001\000\213\302\347\257\145 -\233\005\147\226\311\015\044\271\320\016\144\374\316\342\044\030 -\054\204\177\167\121\313\004\021\066\270\136\355\151\161\247\236 -\344\045\011\227\147\301\107\302\317\221\026\066\142\075\070\004 -\341\121\202\377\254\322\264\151\335\056\354\021\243\105\356\153 -\153\073\114\277\214\215\244\036\235\021\271\351\070\371\172\016 -\014\230\342\043\035\321\116\143\324\347\270\101\104\373\153\257 -\153\332\037\323\305\221\210\133\244\211\222\321\201\346\214\071 -\130\240\326\151\103\251\255\230\122\130\156\333\012\373\153\317 -\150\372\343\244\136\072\105\163\230\007\352\137\002\162\336\014 -\245\263\237\256\251\035\267\035\263\374\212\131\347\156\162\145 -\255\365\060\224\043\007\363\202\026\113\065\230\234\123\273\057 -\312\344\132\331\307\215\035\374\230\231\373\054\244\202\153\360 -\052\037\216\013\137\161\134\134\256\102\173\051\211\201\313\003 -\243\231\312\210\236\013\100\011\101\063\333\346\130\172\375\256 -\231\160\300\132\017\326\023\206\161\057\166\151\374\220\335\333 -\055\156\321\362\233\365\032\153\236\157\025\214\172\360\113\050 -\240\042\070\200\044\154\066\244\073\362\060\221\363\170\023\317 -\301\077\065\253\361\035\021\043\265\103\042\236\001\222\267\030 -\002\345\021\321\202\333\025\000\314\141\067\301\052\174\232\341 -\320\272\263\120\106\356\202\254\235\061\370\373\043\342\003\000 -\110\160\243\011\046\171\025\123\140\363\070\134\255\070\352\201 -\000\143\024\271\063\136\335\013\333\240\105\007\032\063\011\370 -\115\264\247\002\246\151\364\302\131\005\210\145\205\126\256\113 -\313\340\336\074\175\055\032\310\351\373\037\243\141\112\326\052 -\023\255\167\114\032\030\233\221\017\130\330\006\124\305\227\370 -\252\077\040\212\246\205\246\167\366\246\374\034\342\356\156\224 -\063\052\203\120\204\012\345\117\206\370\120\105\170\000\201\353 -\133\150\343\046\215\314\173\134\121\364\024\054\100\276\032\140 -\035\172\162\141\035\037\143\055\210\252\316\242\105\220\010\374 -\153\276\263\120\052\132\375\250\110\030\106\326\220\100\222\220 -\012\204\136\150\061\370\353\355\015\323\035\306\175\231\030\125 -\126\047\145\056\215\105\305\044\354\316\343\002\003\001\000\001 -\243\102\060\100\060\017\006\003\125\035\023\001\001\377\004\005 -\060\003\001\001\377\060\035\006\003\125\035\016\004\026\004\024 -\012\110\043\246\140\244\222\012\063\352\223\133\305\127\352\045 -\115\275\022\356\060\016\006\003\125\035\017\001\001\377\004\004 -\003\002\001\206\060\015\006\011\052\206\110\206\367\015\001\001 -\013\005\000\003\202\002\001\000\076\220\110\252\156\142\025\045 -\146\173\014\325\214\213\211\235\327\355\116\007\357\234\320\024 -\137\136\120\275\150\226\220\244\024\021\252\150\155\011\065\071 -\100\011\332\364\011\054\064\245\173\131\204\111\051\227\164\310 -\007\036\107\155\362\316\034\120\046\343\236\075\100\123\077\367 -\177\226\166\020\305\106\245\320\040\113\120\364\065\073\030\364 -\125\152\101\033\107\006\150\074\273\011\010\142\331\137\125\102 -\252\254\123\205\254\225\126\066\126\253\344\005\214\305\250\332 -\037\243\151\275\123\017\304\377\334\312\343\176\362\114\210\206 -\107\106\032\363\000\365\200\221\242\334\103\102\224\233\040\360 -\321\315\262\353\054\123\302\123\170\112\117\004\224\101\232\217 -\047\062\301\345\111\031\277\361\362\302\213\250\012\071\061\050 -\264\175\142\066\054\115\354\037\063\266\176\167\155\176\120\360 -\237\016\327\021\217\317\030\305\343\047\376\046\357\005\235\317 -\317\067\305\320\173\332\073\260\026\204\014\072\223\326\276\027 -\333\017\076\016\031\170\011\307\251\002\162\042\113\367\067\166 -\272\165\304\205\003\132\143\325\261\165\005\302\271\275\224\255 -\214\025\231\247\223\175\366\305\363\252\164\317\004\205\224\230 -\000\364\342\371\312\044\145\277\340\142\257\310\305\372\262\311 -\236\126\110\332\171\375\226\166\025\276\243\216\126\304\263\064 -\374\276\107\364\301\264\250\374\325\060\210\150\356\313\256\311 -\143\304\166\276\254\070\030\341\136\134\317\256\072\042\121\353 -\321\213\263\363\053\063\007\124\207\372\264\262\023\173\272\123 -\004\142\001\235\361\300\117\356\341\072\324\213\040\020\372\002 -\127\346\357\301\013\267\220\106\234\031\051\214\334\157\240\112 -\151\151\224\267\044\145\240\377\254\077\316\001\373\041\056\375 -\150\370\233\362\245\317\061\070\134\025\252\346\227\000\301\337 -\132\245\247\071\252\351\204\177\074\121\250\072\331\224\133\214 -\277\117\010\161\345\333\250\134\324\322\246\376\000\243\306\026 -\307\017\350\200\316\034\050\144\164\031\010\323\102\343\316\000 -\135\177\261\334\023\260\341\005\313\321\040\252\206\164\236\071 -\347\221\375\377\133\326\367\255\246\057\003\013\155\343\127\124 -\353\166\123\030\215\021\230\272 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "HARICA TLS RSA Root CA 2021" -# Issuer: CN=HARICA TLS RSA Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR -# Serial Number:39:ca:93:1c:ef:43:f3:c6:8e:93:c7:f4:64:89:38:7e -# Subject: CN=HARICA TLS RSA Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR -# Not Valid Before: Fri Feb 19 10:55:38 2021 -# Not Valid After : Mon Feb 13 10:55:37 2045 -# Fingerprint (SHA-256): D9:5D:0E:8E:DA:79:52:5B:F9:BE:B1:1B:14:D2:10:0D:32:94:98:5F:0C:62:D9:FA:BD:9C:D9:99:EC:CB:7B:1D -# Fingerprint (SHA1): 02:2D:05:82:FA:88:CE:14:0C:06:79:DE:7F:14:10:E9:45:D7:A5:6D -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "HARICA TLS RSA Root CA 2021" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\002\055\005\202\372\210\316\024\014\006\171\336\177\024\020\351 -\105\327\245\155 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\145\107\233\130\206\335\054\360\374\242\204\037\036\226\304\221 -END -CKA_ISSUER MULTILINE_OCTAL -\060\154\061\013\060\011\006\003\125\004\006\023\002\107\122\061 -\067\060\065\006\003\125\004\012\014\056\110\145\154\154\145\156 -\151\143\040\101\143\141\144\145\155\151\143\040\141\156\144\040 -\122\145\163\145\141\162\143\150\040\111\156\163\164\151\164\165 -\164\151\157\156\163\040\103\101\061\044\060\042\006\003\125\004 -\003\014\033\110\101\122\111\103\101\040\124\114\123\040\122\123 -\101\040\122\157\157\164\040\103\101\040\062\060\062\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\071\312\223\034\357\103\363\306\216\223\307\364\144\211 -\070\176 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "HARICA TLS ECC Root CA 2021" -# -# Issuer: CN=HARICA TLS ECC Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR -# Serial Number:67:74:9d:8d:77:d8:3b:6a:db:22:f4:ff:59:e2:bf:ce -# Subject: CN=HARICA TLS ECC Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR -# Not Valid Before: Fri Feb 19 11:01:10 2021 -# Not Valid After : Mon Feb 13 11:01:09 2045 -# Fingerprint (SHA-256): 3F:99:CC:47:4A:CF:CE:4D:FE:D5:87:94:66:5E:47:8D:15:47:73:9F:2E:78:0F:1B:B4:CA:9B:13:30:97:D4:01 -# Fingerprint (SHA1): BC:B0:C1:9D:E9:98:92:70:19:38:57:E9:8D:A7:B4:5D:6E:EE:01:48 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "HARICA TLS ECC Root CA 2021" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\154\061\013\060\011\006\003\125\004\006\023\002\107\122\061 -\067\060\065\006\003\125\004\012\014\056\110\145\154\154\145\156 -\151\143\040\101\143\141\144\145\155\151\143\040\141\156\144\040 -\122\145\163\145\141\162\143\150\040\111\156\163\164\151\164\165 -\164\151\157\156\163\040\103\101\061\044\060\042\006\003\125\004 -\003\014\033\110\101\122\111\103\101\040\124\114\123\040\105\103 -\103\040\122\157\157\164\040\103\101\040\062\060\062\061 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\154\061\013\060\011\006\003\125\004\006\023\002\107\122\061 -\067\060\065\006\003\125\004\012\014\056\110\145\154\154\145\156 -\151\143\040\101\143\141\144\145\155\151\143\040\141\156\144\040 -\122\145\163\145\141\162\143\150\040\111\156\163\164\151\164\165 -\164\151\157\156\163\040\103\101\061\044\060\042\006\003\125\004 -\003\014\033\110\101\122\111\103\101\040\124\114\123\040\105\103 -\103\040\122\157\157\164\040\103\101\040\062\060\062\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\147\164\235\215\167\330\073\152\333\042\364\377\131\342 -\277\316 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\124\060\202\001\333\240\003\002\001\002\002\020\147 -\164\235\215\167\330\073\152\333\042\364\377\131\342\277\316\060 -\012\006\010\052\206\110\316\075\004\003\003\060\154\061\013\060 -\011\006\003\125\004\006\023\002\107\122\061\067\060\065\006\003 -\125\004\012\014\056\110\145\154\154\145\156\151\143\040\101\143 -\141\144\145\155\151\143\040\141\156\144\040\122\145\163\145\141 -\162\143\150\040\111\156\163\164\151\164\165\164\151\157\156\163 -\040\103\101\061\044\060\042\006\003\125\004\003\014\033\110\101 -\122\111\103\101\040\124\114\123\040\105\103\103\040\122\157\157 -\164\040\103\101\040\062\060\062\061\060\036\027\015\062\061\060 -\062\061\071\061\061\060\061\061\060\132\027\015\064\065\060\062 -\061\063\061\061\060\061\060\071\132\060\154\061\013\060\011\006 -\003\125\004\006\023\002\107\122\061\067\060\065\006\003\125\004 -\012\014\056\110\145\154\154\145\156\151\143\040\101\143\141\144 -\145\155\151\143\040\141\156\144\040\122\145\163\145\141\162\143 -\150\040\111\156\163\164\151\164\165\164\151\157\156\163\040\103 -\101\061\044\060\042\006\003\125\004\003\014\033\110\101\122\111 -\103\101\040\124\114\123\040\105\103\103\040\122\157\157\164\040 -\103\101\040\062\060\062\061\060\166\060\020\006\007\052\206\110 -\316\075\002\001\006\005\053\201\004\000\042\003\142\000\004\070 -\010\376\261\240\226\322\172\254\257\111\072\320\300\340\303\073 -\050\252\361\162\155\145\000\107\210\204\374\232\046\153\252\113 -\272\154\004\012\210\136\027\362\125\207\374\060\260\064\342\064 -\130\127\032\204\123\351\060\331\251\362\226\164\303\121\037\130 -\111\061\314\230\116\140\021\207\165\323\162\224\220\117\233\020 -\045\052\250\170\055\276\220\101\130\220\025\162\247\241\267\243 -\102\060\100\060\017\006\003\125\035\023\001\001\377\004\005\060 -\003\001\001\377\060\035\006\003\125\035\016\004\026\004\024\311 -\033\123\201\022\376\004\325\026\321\252\274\232\157\267\240\225 -\031\156\312\060\016\006\003\125\035\017\001\001\377\004\004\003 -\002\001\206\060\012\006\010\052\206\110\316\075\004\003\003\003 -\147\000\060\144\002\060\021\336\256\370\334\116\210\260\251\360 -\042\255\302\121\100\357\140\161\055\356\217\002\304\135\003\160 -\111\244\222\352\305\024\210\160\246\323\015\260\252\312\054\100 -\234\373\351\202\156\232\002\060\053\107\232\007\306\321\302\201 -\174\312\013\226\030\101\033\243\364\060\011\236\265\043\050\015 -\237\024\266\074\123\242\114\006\151\175\372\154\221\306\052\111 -\105\346\354\267\023\341\072\154 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "HARICA TLS ECC Root CA 2021" -# Issuer: CN=HARICA TLS ECC Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR -# Serial Number:67:74:9d:8d:77:d8:3b:6a:db:22:f4:ff:59:e2:bf:ce -# Subject: CN=HARICA TLS ECC Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR -# Not Valid Before: Fri Feb 19 11:01:10 2021 -# Not Valid After : Mon Feb 13 11:01:09 2045 -# Fingerprint (SHA-256): 3F:99:CC:47:4A:CF:CE:4D:FE:D5:87:94:66:5E:47:8D:15:47:73:9F:2E:78:0F:1B:B4:CA:9B:13:30:97:D4:01 -# Fingerprint (SHA1): BC:B0:C1:9D:E9:98:92:70:19:38:57:E9:8D:A7:B4:5D:6E:EE:01:48 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "HARICA TLS ECC Root CA 2021" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\274\260\301\235\351\230\222\160\031\070\127\351\215\247\264\135 -\156\356\001\110 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\256\367\114\345\146\065\321\267\233\214\042\223\164\323\113\260 -END -CKA_ISSUER MULTILINE_OCTAL -\060\154\061\013\060\011\006\003\125\004\006\023\002\107\122\061 -\067\060\065\006\003\125\004\012\014\056\110\145\154\154\145\156 -\151\143\040\101\143\141\144\145\155\151\143\040\141\156\144\040 -\122\145\163\145\141\162\143\150\040\111\156\163\164\151\164\165 -\164\151\157\156\163\040\103\101\061\044\060\042\006\003\125\004 -\003\014\033\110\101\122\111\103\101\040\124\114\123\040\105\103 -\103\040\122\157\157\164\040\103\101\040\062\060\062\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\147\164\235\215\167\330\073\152\333\042\364\377\131\342 -\277\316 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "HARICA Client RSA Root CA 2021" -# -# Issuer: CN=HARICA Client RSA Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR -# Serial Number:55:52:f8:1e:db:1b:24:2c:9e:bb:96:18:cd:02:28:3e -# Subject: CN=HARICA Client RSA Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR -# Not Valid Before: Fri Feb 19 10:58:46 2021 -# Not Valid After : Mon Feb 13 10:58:45 2045 -# Fingerprint (SHA-256): 1B:E7:AB:E3:06:86:B1:63:48:AF:D1:C6:1B:68:66:A0:EA:7F:48:21:E6:7D:5E:8A:F9:37:CF:80:11:BC:75:0D -# Fingerprint (SHA1): 46:C6:90:0A:77:3A:B6:BC:F4:65:AD:AC:FC:E3:F7:07:00:6E:DE:6E -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "HARICA Client RSA Root CA 2021" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\157\061\013\060\011\006\003\125\004\006\023\002\107\122\061 -\067\060\065\006\003\125\004\012\014\056\110\145\154\154\145\156 -\151\143\040\101\143\141\144\145\155\151\143\040\141\156\144\040 -\122\145\163\145\141\162\143\150\040\111\156\163\164\151\164\165 -\164\151\157\156\163\040\103\101\061\047\060\045\006\003\125\004 -\003\014\036\110\101\122\111\103\101\040\103\154\151\145\156\164 -\040\122\123\101\040\122\157\157\164\040\103\101\040\062\060\062 -\061 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\157\061\013\060\011\006\003\125\004\006\023\002\107\122\061 -\067\060\065\006\003\125\004\012\014\056\110\145\154\154\145\156 -\151\143\040\101\143\141\144\145\155\151\143\040\141\156\144\040 -\122\145\163\145\141\162\143\150\040\111\156\163\164\151\164\165 -\164\151\157\156\163\040\103\101\061\047\060\045\006\003\125\004 -\003\014\036\110\101\122\111\103\101\040\103\154\151\145\156\164 -\040\122\123\101\040\122\157\157\164\040\103\101\040\062\060\062 -\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\125\122\370\036\333\033\044\054\236\273\226\030\315\002 -\050\076 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\252\060\202\003\222\240\003\002\001\002\002\020\125 -\122\370\036\333\033\044\054\236\273\226\030\315\002\050\076\060 -\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060\157 -\061\013\060\011\006\003\125\004\006\023\002\107\122\061\067\060 -\065\006\003\125\004\012\014\056\110\145\154\154\145\156\151\143 -\040\101\143\141\144\145\155\151\143\040\141\156\144\040\122\145 -\163\145\141\162\143\150\040\111\156\163\164\151\164\165\164\151 -\157\156\163\040\103\101\061\047\060\045\006\003\125\004\003\014 -\036\110\101\122\111\103\101\040\103\154\151\145\156\164\040\122 -\123\101\040\122\157\157\164\040\103\101\040\062\060\062\061\060 -\036\027\015\062\061\060\062\061\071\061\060\065\070\064\066\132 -\027\015\064\065\060\062\061\063\061\060\065\070\064\065\132\060 -\157\061\013\060\011\006\003\125\004\006\023\002\107\122\061\067 -\060\065\006\003\125\004\012\014\056\110\145\154\154\145\156\151 -\143\040\101\143\141\144\145\155\151\143\040\141\156\144\040\122 -\145\163\145\141\162\143\150\040\111\156\163\164\151\164\165\164 -\151\157\156\163\040\103\101\061\047\060\045\006\003\125\004\003 -\014\036\110\101\122\111\103\101\040\103\154\151\145\156\164\040 -\122\123\101\040\122\157\157\164\040\103\101\040\062\060\062\061 -\060\202\002\042\060\015\006\011\052\206\110\206\367\015\001\001 -\001\005\000\003\202\002\017\000\060\202\002\012\002\202\002\001 -\000\201\333\127\102\220\054\164\065\364\370\270\164\031\115\253 -\011\132\167\105\201\163\142\260\065\237\370\320\267\063\000\207 -\023\266\226\253\016\124\022\060\007\274\233\267\110\327\321\031 -\203\256\216\330\251\361\251\000\204\260\214\136\236\350\014\217 -\124\151\277\366\324\010\117\046\160\376\030\101\143\032\263\062 -\213\100\370\007\253\127\061\360\306\026\166\147\232\264\335\057 -\362\321\153\305\320\222\204\221\161\156\017\056\143\351\037\123 -\244\335\122\023\314\011\203\051\201\014\305\123\165\104\261\016 -\147\123\030\320\303\037\210\113\237\224\044\264\051\274\273\350 -\116\375\157\322\025\035\111\334\215\160\362\021\032\040\121\125 -\021\272\210\157\304\367\120\171\326\252\061\342\204\075\136\062 -\310\167\052\120\161\345\013\057\351\266\352\357\253\012\063\071 -\016\375\217\245\147\103\202\216\230\151\011\011\033\100\315\070 -\147\107\352\311\354\227\161\022\336\044\365\162\074\321\367\103 -\114\046\367\220\262\211\351\105\113\125\075\061\005\172\101\342 -\225\272\103\300\027\305\266\205\075\031\215\144\160\363\133\254 -\315\237\323\051\165\207\113\225\147\152\246\370\321\335\274\220 -\206\211\103\051\251\067\133\365\135\260\046\132\123\102\166\220 -\053\317\236\126\154\053\124\317\134\232\145\337\133\213\110\140 -\070\174\373\305\013\317\166\004\143\002\063\052\175\365\203\147 -\347\372\306\103\375\053\017\324\046\057\167\244\062\301\044\352 -\144\235\277\263\070\161\061\104\362\107\270\242\146\101\241\373 -\233\173\274\307\106\152\165\277\132\242\214\350\152\104\301\270 -\226\265\300\062\010\055\173\164\065\163\262\312\306\376\257\021 -\162\030\366\347\310\302\317\245\052\352\173\326\131\350\174\240 -\262\152\100\011\151\016\245\226\333\321\000\271\361\210\156\066 -\360\210\262\235\361\122\362\303\174\277\060\211\074\012\151\371 -\042\244\145\341\233\340\164\306\261\205\227\226\054\256\224\217 -\120\246\071\022\037\276\107\362\201\170\323\165\066\236\175\132 -\040\227\342\122\256\231\237\306\174\233\146\363\376\330\317\356 -\275\227\006\035\055\205\334\076\066\123\226\173\040\272\350\310 -\341\255\226\142\076\021\174\263\000\204\236\247\114\161\253\112 -\067\002\003\001\000\001\243\102\060\100\060\017\006\003\125\035 -\023\001\001\377\004\005\060\003\001\001\377\060\035\006\003\125 -\035\016\004\026\004\024\240\326\007\075\136\044\367\173\240\104 -\056\044\122\015\031\252\053\004\221\247\060\016\006\003\125\035 -\017\001\001\377\004\004\003\002\001\206\060\015\006\011\052\206 -\110\206\367\015\001\001\013\005\000\003\202\002\001\000\015\107 -\371\011\146\061\122\354\171\356\302\250\362\150\076\355\226\105 -\313\072\246\230\143\077\352\053\115\116\003\320\034\202\341\313 -\323\345\326\253\133\147\050\274\235\376\014\231\012\200\125\247 -\316\033\043\141\015\260\127\360\376\340\312\276\346\220\333\203 -\054\276\203\216\364\171\266\376\320\015\102\247\130\037\151\352 -\201\365\005\245\376\106\150\353\154\170\311\340\352\347\346\336 -\061\305\322\325\054\202\143\050\235\135\250\032\176\210\346\347 -\053\361\054\325\320\005\236\334\055\275\067\146\324\004\242\247 -\255\277\072\302\250\073\255\377\215\235\063\340\271\232\204\241 -\207\037\166\364\202\164\327\016\371\060\110\076\133\210\076\252 -\134\153\326\057\014\350\216\163\302\030\221\203\071\266\146\132 -\320\037\140\047\135\115\343\366\072\015\146\120\234\170\173\253 -\363\023\020\256\017\057\253\350\144\263\030\040\235\106\065\144 -\045\163\352\233\020\134\130\065\211\261\106\110\247\364\254\324 -\035\236\133\314\251\245\032\023\117\044\120\252\331\033\155\261 -\100\373\235\335\130\164\304\302\157\024\162\354\333\065\237\270 -\124\165\105\303\246\310\032\050\065\072\256\145\362\251\230\316 -\257\133\311\070\214\061\073\177\314\334\226\375\342\133\326\320 -\131\364\166\272\013\313\117\203\020\307\100\320\035\140\351\052 -\345\110\130\167\014\105\151\276\031\161\004\044\342\343\044\037 -\112\310\301\076\231\365\226\230\070\110\045\241\025\260\033\327 -\342\204\030\133\366\161\065\232\150\173\100\314\030\134\014\044 -\235\324\225\365\231\252\106\352\256\254\277\364\024\031\044\350 -\214\354\343\365\274\006\150\212\052\014\005\137\012\227\165\247 -\334\176\300\375\327\172\030\337\060\321\070\113\037\260\230\160 -\277\314\174\163\360\156\304\061\245\244\227\035\254\277\316\154 -\041\112\276\047\043\147\363\006\126\201\012\221\216\266\341\003 -\005\063\054\332\064\010\115\116\120\043\255\037\245\305\324\172 -\376\352\011\354\247\050\140\213\106\174\265\352\233\335\117\371 -\347\153\025\306\210\317\103\333\345\047\334\004\126\156\157\106 -\025\361\126\055\350\134\014\163\303\043\201\070\040\313\311\014 -\151\317\054\253\073\204\140\063\031\122\375\151\024\063 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "HARICA Client RSA Root CA 2021" -# Issuer: CN=HARICA Client RSA Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR -# Serial Number:55:52:f8:1e:db:1b:24:2c:9e:bb:96:18:cd:02:28:3e -# Subject: CN=HARICA Client RSA Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR -# Not Valid Before: Fri Feb 19 10:58:46 2021 -# Not Valid After : Mon Feb 13 10:58:45 2045 -# Fingerprint (SHA-256): 1B:E7:AB:E3:06:86:B1:63:48:AF:D1:C6:1B:68:66:A0:EA:7F:48:21:E6:7D:5E:8A:F9:37:CF:80:11:BC:75:0D -# Fingerprint (SHA1): 46:C6:90:0A:77:3A:B6:BC:F4:65:AD:AC:FC:E3:F7:07:00:6E:DE:6E -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "HARICA Client RSA Root CA 2021" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\106\306\220\012\167\072\266\274\364\145\255\254\374\343\367\007 -\000\156\336\156 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\157\355\134\327\210\314\070\251\334\351\335\331\135\333\330\355 -END -CKA_ISSUER MULTILINE_OCTAL -\060\157\061\013\060\011\006\003\125\004\006\023\002\107\122\061 -\067\060\065\006\003\125\004\012\014\056\110\145\154\154\145\156 -\151\143\040\101\143\141\144\145\155\151\143\040\141\156\144\040 -\122\145\163\145\141\162\143\150\040\111\156\163\164\151\164\165 -\164\151\157\156\163\040\103\101\061\047\060\045\006\003\125\004 -\003\014\036\110\101\122\111\103\101\040\103\154\151\145\156\164 -\040\122\123\101\040\122\157\157\164\040\103\101\040\062\060\062 -\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\125\122\370\036\333\033\044\054\236\273\226\030\315\002 -\050\076 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "HARICA Client ECC Root CA 2021" -# -# Issuer: CN=HARICA Client ECC Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR -# Serial Number:31:68:d9:d8:e1:62:57:1e:d2:19:44:88:e6:10:7d:f0 -# Subject: CN=HARICA Client ECC Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR -# Not Valid Before: Fri Feb 19 11:03:34 2021 -# Not Valid After : Mon Feb 13 11:03:33 2045 -# Fingerprint (SHA-256): 8D:D4:B5:37:3C:B0:DE:36:76:9C:12:33:92:80:D8:27:46:B3:AA:6C:D4:26:E7:97:A3:1B:AB:E4:27:9C:F0:0B -# Fingerprint (SHA1): BE:64:D3:DA:14:4B:D2:6B:CD:AF:8F:DB:A6:A6:72:F8:DE:26:F9:00 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "HARICA Client ECC Root CA 2021" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\157\061\013\060\011\006\003\125\004\006\023\002\107\122\061 -\067\060\065\006\003\125\004\012\014\056\110\145\154\154\145\156 -\151\143\040\101\143\141\144\145\155\151\143\040\141\156\144\040 -\122\145\163\145\141\162\143\150\040\111\156\163\164\151\164\165 -\164\151\157\156\163\040\103\101\061\047\060\045\006\003\125\004 -\003\014\036\110\101\122\111\103\101\040\103\154\151\145\156\164 -\040\105\103\103\040\122\157\157\164\040\103\101\040\062\060\062 -\061 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\157\061\013\060\011\006\003\125\004\006\023\002\107\122\061 -\067\060\065\006\003\125\004\012\014\056\110\145\154\154\145\156 -\151\143\040\101\143\141\144\145\155\151\143\040\141\156\144\040 -\122\145\163\145\141\162\143\150\040\111\156\163\164\151\164\165 -\164\151\157\156\163\040\103\101\061\047\060\045\006\003\125\004 -\003\014\036\110\101\122\111\103\101\040\103\154\151\145\156\164 -\040\105\103\103\040\122\157\157\164\040\103\101\040\062\060\062 -\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\061\150\331\330\341\142\127\036\322\031\104\210\346\020 -\175\360 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\132\060\202\001\341\240\003\002\001\002\002\020\061 -\150\331\330\341\142\127\036\322\031\104\210\346\020\175\360\060 -\012\006\010\052\206\110\316\075\004\003\003\060\157\061\013\060 -\011\006\003\125\004\006\023\002\107\122\061\067\060\065\006\003 -\125\004\012\014\056\110\145\154\154\145\156\151\143\040\101\143 -\141\144\145\155\151\143\040\141\156\144\040\122\145\163\145\141 -\162\143\150\040\111\156\163\164\151\164\165\164\151\157\156\163 -\040\103\101\061\047\060\045\006\003\125\004\003\014\036\110\101 -\122\111\103\101\040\103\154\151\145\156\164\040\105\103\103\040 -\122\157\157\164\040\103\101\040\062\060\062\061\060\036\027\015 -\062\061\060\062\061\071\061\061\060\063\063\064\132\027\015\064 -\065\060\062\061\063\061\061\060\063\063\063\132\060\157\061\013 -\060\011\006\003\125\004\006\023\002\107\122\061\067\060\065\006 -\003\125\004\012\014\056\110\145\154\154\145\156\151\143\040\101 -\143\141\144\145\155\151\143\040\141\156\144\040\122\145\163\145 -\141\162\143\150\040\111\156\163\164\151\164\165\164\151\157\156 -\163\040\103\101\061\047\060\045\006\003\125\004\003\014\036\110 -\101\122\111\103\101\040\103\154\151\145\156\164\040\105\103\103 -\040\122\157\157\164\040\103\101\040\062\060\062\061\060\166\060 -\020\006\007\052\206\110\316\075\002\001\006\005\053\201\004\000 -\042\003\142\000\004\007\030\255\225\226\224\320\134\017\202\367 -\052\100\372\002\311\311\075\066\246\243\004\152\301\155\225\001 -\210\140\022\124\154\134\242\053\156\023\072\210\225\014\034\046 -\206\066\112\211\031\267\030\336\073\350\250\120\037\312\337\133 -\277\111\200\025\333\343\060\341\035\132\307\052\212\001\007\376 -\155\054\064\357\050\050\227\274\301\371\127\206\225\213\065\317 -\236\132\321\150\225\243\102\060\100\060\017\006\003\125\035\023 -\001\001\377\004\005\060\003\001\001\377\060\035\006\003\125\035 -\016\004\026\004\024\122\010\322\276\062\201\045\375\365\032\227 -\354\116\137\032\273\123\315\220\255\060\016\006\003\125\035\017 -\001\001\377\004\004\003\002\001\206\060\012\006\010\052\206\110 -\316\075\004\003\003\003\147\000\060\144\002\060\114\061\105\106 -\117\250\346\276\303\167\262\032\030\113\055\210\173\130\346\253 -\224\153\104\003\260\027\377\337\202\163\104\121\054\375\223\035 -\006\173\024\322\211\354\100\014\357\041\001\056\002\060\057\311 -\056\132\154\054\035\331\225\340\236\260\271\134\122\174\366\370 -\070\312\056\361\324\035\362\242\111\242\225\370\301\130\136\117 -\376\163\012\357\061\260\253\043\130\023\214\213\336\073 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "HARICA Client ECC Root CA 2021" -# Issuer: CN=HARICA Client ECC Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR -# Serial Number:31:68:d9:d8:e1:62:57:1e:d2:19:44:88:e6:10:7d:f0 -# Subject: CN=HARICA Client ECC Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR -# Not Valid Before: Fri Feb 19 11:03:34 2021 -# Not Valid After : Mon Feb 13 11:03:33 2045 -# Fingerprint (SHA-256): 8D:D4:B5:37:3C:B0:DE:36:76:9C:12:33:92:80:D8:27:46:B3:AA:6C:D4:26:E7:97:A3:1B:AB:E4:27:9C:F0:0B -# Fingerprint (SHA1): BE:64:D3:DA:14:4B:D2:6B:CD:AF:8F:DB:A6:A6:72:F8:DE:26:F9:00 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "HARICA Client ECC Root CA 2021" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\276\144\323\332\024\113\322\153\315\257\217\333\246\246\162\370 -\336\046\371\000 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\255\270\120\246\251\202\172\154\075\032\252\244\322\143\244\104 -END -CKA_ISSUER MULTILINE_OCTAL -\060\157\061\013\060\011\006\003\125\004\006\023\002\107\122\061 -\067\060\065\006\003\125\004\012\014\056\110\145\154\154\145\156 -\151\143\040\101\143\141\144\145\155\151\143\040\141\156\144\040 -\122\145\163\145\141\162\143\150\040\111\156\163\164\151\164\165 -\164\151\157\156\163\040\103\101\061\047\060\045\006\003\125\004 -\003\014\036\110\101\122\111\103\101\040\103\154\151\145\156\164 -\040\105\103\103\040\122\157\157\164\040\103\101\040\062\060\062 -\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\061\150\331\330\341\142\127\036\322\031\104\210\346\020 -\175\360 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Autoridad de Certificacion Firmaprofesional CIF A62634068" -# -# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068,C=ES -# Serial Number:1b:70:e9:d2:ff:ae:6c:71 -# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068,C=ES -# Not Valid Before: Tue Sep 23 15:22:07 2014 -# Not Valid After : Mon May 05 15:22:07 2036 -# Fingerprint (SHA-256): 57:DE:05:83:EF:D2:B2:6E:03:61:DA:99:DA:9D:F4:64:8D:EF:7E:E8:44:1C:3B:72:8A:FA:9B:CD:E0:F9:B2:6A -# Fingerprint (SHA1): 0B:BE:C2:27:22:49:CB:39:AA:DB:35:5C:53:E3:8C:AE:78:FF:B6:FE -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Autoridad de Certificacion Firmaprofesional CIF A62634068" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\121\061\013\060\011\006\003\125\004\006\023\002\105\123\061 -\102\060\100\006\003\125\004\003\014\071\101\165\164\157\162\151 -\144\141\144\040\144\145\040\103\145\162\164\151\146\151\143\141 -\143\151\157\156\040\106\151\162\155\141\160\162\157\146\145\163 -\151\157\156\141\154\040\103\111\106\040\101\066\062\066\063\064 -\060\066\070 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\121\061\013\060\011\006\003\125\004\006\023\002\105\123\061 -\102\060\100\006\003\125\004\003\014\071\101\165\164\157\162\151 -\144\141\144\040\144\145\040\103\145\162\164\151\146\151\143\141 -\143\151\157\156\040\106\151\162\155\141\160\162\157\146\145\163 -\151\157\156\141\154\040\103\111\106\040\101\066\062\066\063\064 -\060\066\070 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\010\033\160\351\322\377\256\154\161 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\006\024\060\202\003\374\240\003\002\001\002\002\010\033 -\160\351\322\377\256\154\161\060\015\006\011\052\206\110\206\367 -\015\001\001\013\005\000\060\121\061\013\060\011\006\003\125\004 -\006\023\002\105\123\061\102\060\100\006\003\125\004\003\014\071 -\101\165\164\157\162\151\144\141\144\040\144\145\040\103\145\162 -\164\151\146\151\143\141\143\151\157\156\040\106\151\162\155\141 -\160\162\157\146\145\163\151\157\156\141\154\040\103\111\106\040 -\101\066\062\066\063\064\060\066\070\060\036\027\015\061\064\060 -\071\062\063\061\065\062\062\060\067\132\027\015\063\066\060\065 -\060\065\061\065\062\062\060\067\132\060\121\061\013\060\011\006 -\003\125\004\006\023\002\105\123\061\102\060\100\006\003\125\004 -\003\014\071\101\165\164\157\162\151\144\141\144\040\144\145\040 -\103\145\162\164\151\146\151\143\141\143\151\157\156\040\106\151 -\162\155\141\160\162\157\146\145\163\151\157\156\141\154\040\103 -\111\106\040\101\066\062\066\063\064\060\066\070\060\202\002\042 -\060\015\006\011\052\206\110\206\367\015\001\001\001\005\000\003 -\202\002\017\000\060\202\002\012\002\202\002\001\000\312\226\153 -\216\352\370\373\361\242\065\340\177\114\332\340\303\122\327\175 -\266\020\310\002\136\263\103\052\304\117\152\262\312\034\135\050 -\232\170\021\032\151\131\127\257\265\040\102\344\213\017\346\337 -\133\246\003\222\057\365\021\344\142\327\062\161\070\331\004\014 -\161\253\075\121\176\017\007\337\143\005\134\351\277\224\157\301 -\051\202\300\264\332\121\260\301\074\273\255\067\112\134\312\361 -\113\066\016\044\253\277\303\204\167\375\250\120\364\261\347\306 -\057\322\055\131\215\172\012\116\226\151\122\002\252\066\230\354 -\374\372\024\203\014\067\037\311\222\067\177\327\201\055\345\304 -\271\340\076\064\376\147\364\076\146\321\323\364\100\317\136\142 -\064\017\160\006\076\040\030\132\316\367\162\033\045\154\223\164 -\024\223\243\163\261\016\252\207\020\043\131\137\040\005\031\107 -\355\150\216\222\022\312\135\374\326\053\262\222\074\040\317\341 -\137\257\040\276\240\166\177\166\345\354\032\206\141\063\076\347 -\173\264\077\240\017\216\242\271\152\157\271\207\046\157\101\154 -\210\246\120\375\152\143\013\365\223\026\033\031\217\262\355\233 -\233\311\220\365\001\014\337\031\075\017\076\070\043\311\057\217 -\014\321\002\376\033\125\326\116\320\215\074\257\117\244\363\376 -\257\052\323\005\235\171\010\241\313\127\061\264\234\310\220\262 -\147\364\030\026\223\072\374\107\330\321\170\226\061\037\272\053 -\014\137\135\231\255\143\211\132\044\040\166\330\337\375\253\116 -\246\042\252\235\136\346\047\212\175\150\051\243\347\212\270\332 -\021\273\027\055\231\235\023\044\106\367\305\342\330\237\216\177 -\307\217\164\155\132\262\350\162\365\254\356\044\020\255\057\024 -\332\377\055\232\106\161\107\276\102\337\273\001\333\364\177\323 -\050\217\061\131\133\323\311\002\246\264\122\312\156\227\373\103 -\305\010\046\157\212\364\273\375\237\050\252\015\325\105\363\023 -\072\035\330\300\170\217\101\147\074\036\224\144\256\173\013\305 -\350\331\001\210\071\032\227\206\144\101\325\073\207\014\156\372 -\017\306\275\110\024\277\071\115\324\236\101\266\217\226\035\143 -\226\223\331\225\006\170\061\150\236\067\006\073\200\211\105\141 -\071\043\307\033\104\243\025\345\034\370\222\060\273\002\003\001 -\000\001\243\201\357\060\201\354\060\035\006\003\125\035\016\004 -\026\004\024\145\315\353\253\065\036\000\076\176\325\164\300\034 -\264\163\107\016\032\144\057\060\022\006\003\125\035\023\001\001 -\377\004\010\060\006\001\001\377\002\001\001\060\201\246\006\003 -\125\035\040\004\201\236\060\201\233\060\201\230\006\004\125\035 -\040\000\060\201\217\060\057\006\010\053\006\001\005\005\007\002 -\001\026\043\150\164\164\160\072\057\057\167\167\167\056\146\151 -\162\155\141\160\162\157\146\145\163\151\157\156\141\154\056\143 -\157\155\057\143\160\163\060\134\006\010\053\006\001\005\005\007 -\002\002\060\120\036\116\000\120\000\141\000\163\000\145\000\157 -\000\040\000\144\000\145\000\040\000\154\000\141\000\040\000\102 -\000\157\000\156\000\141\000\156\000\157\000\166\000\141\000\040 -\000\064\000\067\000\040\000\102\000\141\000\162\000\143\000\145 -\000\154\000\157\000\156\000\141\000\040\000\060\000\070\000\060 -\000\061\000\067\060\016\006\003\125\035\017\001\001\377\004\004 -\003\002\001\006\060\015\006\011\052\206\110\206\367\015\001\001 -\013\005\000\003\202\002\001\000\164\207\050\002\053\167\037\146 -\211\144\355\217\164\056\106\034\273\250\370\370\013\035\203\266 -\072\247\350\105\212\007\267\340\076\040\313\341\010\333\023\010 -\370\050\241\065\262\200\263\013\121\300\323\126\232\215\063\105 -\111\257\111\360\340\075\007\172\105\023\132\377\310\227\330\323 -\030\054\175\226\370\335\242\145\103\160\223\220\025\272\220\337 -\350\031\260\333\054\212\140\017\267\157\224\007\036\035\246\311 -\205\366\275\064\370\100\170\142\020\160\072\276\175\113\071\201 -\251\020\324\226\101\273\370\137\034\013\035\010\362\261\260\211 -\172\362\367\240\340\304\217\213\170\265\073\130\245\043\216\117 -\125\376\066\073\340\014\267\312\052\060\101\040\264\200\315\256 -\374\166\146\163\250\256\156\341\174\332\003\350\224\040\346\042 -\243\320\037\220\135\040\123\024\046\127\332\124\227\337\026\104 -\020\001\036\210\146\217\162\070\223\335\040\267\064\276\327\361 -\356\143\216\107\171\050\006\374\363\131\105\045\140\042\063\033 -\243\137\250\272\052\332\032\075\315\100\352\214\356\005\025\225 -\325\245\054\040\057\247\230\050\356\105\374\361\270\210\000\054 -\217\102\332\121\325\234\345\023\150\161\105\103\213\236\013\041 -\074\113\134\005\334\032\237\230\216\332\275\042\236\162\315\255 -\012\313\314\243\147\233\050\164\304\233\327\032\074\004\130\246 -\202\235\255\307\173\157\377\200\226\351\370\215\152\275\030\220 -\035\377\111\032\220\122\067\223\057\074\002\135\202\166\013\121 -\347\026\307\127\370\070\371\247\315\233\042\124\357\143\260\025 -\155\123\145\003\112\136\112\240\262\247\216\111\000\131\070\325 -\307\364\200\144\365\156\225\120\270\021\176\025\160\070\112\260 -\177\320\304\062\160\300\031\377\311\070\055\024\054\146\364\102 -\104\346\125\166\033\200\025\127\377\300\247\247\252\071\252\330 -\323\160\320\056\272\353\224\152\372\137\064\206\347\142\265\375 -\212\360\060\205\224\311\257\044\002\057\157\326\335\147\376\343 -\260\125\117\004\230\117\244\101\126\342\223\320\152\350\326\363 -\373\145\340\316\165\304\061\131\014\356\202\310\014\140\063\112 -\031\272\204\147\047\017\274\102\135\275\044\124\015\354\035\160 -\006\137\244\274\372\040\174\125 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Autoridad de Certificacion Firmaprofesional CIF A62634068" -# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068,C=ES -# Serial Number:1b:70:e9:d2:ff:ae:6c:71 -# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068,C=ES -# Not Valid Before: Tue Sep 23 15:22:07 2014 -# Not Valid After : Mon May 05 15:22:07 2036 -# Fingerprint (SHA-256): 57:DE:05:83:EF:D2:B2:6E:03:61:DA:99:DA:9D:F4:64:8D:EF:7E:E8:44:1C:3B:72:8A:FA:9B:CD:E0:F9:B2:6A -# Fingerprint (SHA1): 0B:BE:C2:27:22:49:CB:39:AA:DB:35:5C:53:E3:8C:AE:78:FF:B6:FE -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Autoridad de Certificacion Firmaprofesional CIF A62634068" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\013\276\302\047\042\111\313\071\252\333\065\134\123\343\214\256 -\170\377\266\376 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\116\156\233\124\114\312\267\372\110\344\220\261\025\113\034\243 -END -CKA_ISSUER MULTILINE_OCTAL -\060\121\061\013\060\011\006\003\125\004\006\023\002\105\123\061 -\102\060\100\006\003\125\004\003\014\071\101\165\164\157\162\151 -\144\141\144\040\144\145\040\103\145\162\164\151\146\151\143\141 -\143\151\157\156\040\106\151\162\155\141\160\162\157\146\145\163 -\151\157\156\141\154\040\103\111\106\040\101\066\062\066\063\064 -\060\066\070 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\010\033\160\351\322\377\256\154\161 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "vTrus ECC Root CA" -# -# Issuer: CN=vTrus ECC Root CA,O="iTrusChina Co.,Ltd.",C=CN -# Serial Number:6e:6a:bc:59:aa:53:be:98:39:67:a2:d2:6b:a4:3b:e6:6d:1c:d6:da -# Subject: CN=vTrus ECC Root CA,O="iTrusChina Co.,Ltd.",C=CN -# Not Valid Before: Tue Jul 31 07:26:44 2018 -# Not Valid After : Fri Jul 31 07:26:44 2043 -# Fingerprint (SHA-256): 30:FB:BA:2C:32:23:8E:2A:98:54:7A:F9:79:31:E5:50:42:8B:9B:3F:1C:8E:EB:66:33:DC:FA:86:C5:B2:7D:D3 -# Fingerprint (SHA1): F6:9C:DB:B0:FC:F6:02:13:B6:52:32:A6:A3:91:3F:16:70:DA:C3:E1 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "vTrus ECC Root CA" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\107\061\013\060\011\006\003\125\004\006\023\002\103\116\061 -\034\060\032\006\003\125\004\012\023\023\151\124\162\165\163\103 -\150\151\156\141\040\103\157\056\054\114\164\144\056\061\032\060 -\030\006\003\125\004\003\023\021\166\124\162\165\163\040\105\103 -\103\040\122\157\157\164\040\103\101 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\107\061\013\060\011\006\003\125\004\006\023\002\103\116\061 -\034\060\032\006\003\125\004\012\023\023\151\124\162\165\163\103 -\150\151\156\141\040\103\157\056\054\114\164\144\056\061\032\060 -\030\006\003\125\004\003\023\021\166\124\162\165\163\040\105\103 -\103\040\122\157\157\164\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\156\152\274\131\252\123\276\230\071\147\242\322\153\244 -\073\346\155\034\326\332 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\017\060\202\001\225\240\003\002\001\002\002\024\156 -\152\274\131\252\123\276\230\071\147\242\322\153\244\073\346\155 -\034\326\332\060\012\006\010\052\206\110\316\075\004\003\003\060 -\107\061\013\060\011\006\003\125\004\006\023\002\103\116\061\034 -\060\032\006\003\125\004\012\023\023\151\124\162\165\163\103\150 -\151\156\141\040\103\157\056\054\114\164\144\056\061\032\060\030 -\006\003\125\004\003\023\021\166\124\162\165\163\040\105\103\103 -\040\122\157\157\164\040\103\101\060\036\027\015\061\070\060\067 -\063\061\060\067\062\066\064\064\132\027\015\064\063\060\067\063 -\061\060\067\062\066\064\064\132\060\107\061\013\060\011\006\003 -\125\004\006\023\002\103\116\061\034\060\032\006\003\125\004\012 -\023\023\151\124\162\165\163\103\150\151\156\141\040\103\157\056 -\054\114\164\144\056\061\032\060\030\006\003\125\004\003\023\021 -\166\124\162\165\163\040\105\103\103\040\122\157\157\164\040\103 -\101\060\166\060\020\006\007\052\206\110\316\075\002\001\006\005 -\053\201\004\000\042\003\142\000\004\145\120\112\256\214\171\226 -\112\252\034\010\303\243\242\315\376\131\126\101\167\375\046\224 -\102\273\035\315\010\333\163\262\133\165\363\317\234\116\202\364 -\277\370\141\046\205\154\326\205\133\162\160\322\375\333\142\264 -\337\123\213\275\261\104\130\142\102\011\307\372\177\133\020\347 -\376\100\375\300\330\303\053\062\347\160\246\267\246\040\125\035 -\173\200\135\113\217\147\114\361\020\243\102\060\100\060\035\006 -\003\125\035\016\004\026\004\024\230\071\315\276\330\262\214\367 -\262\253\341\255\044\257\173\174\241\333\037\317\060\017\006\003 -\125\035\023\001\001\377\004\005\060\003\001\001\377\060\016\006 -\003\125\035\017\001\001\377\004\004\003\002\001\006\060\012\006 -\010\052\206\110\316\075\004\003\003\003\150\000\060\145\002\060 -\127\235\335\126\361\307\343\351\270\111\120\153\233\151\303\157 -\354\303\175\045\344\127\225\023\100\233\122\323\073\363\100\031 -\274\046\307\055\006\236\265\173\066\237\365\045\324\143\153\000 -\002\061\000\351\323\306\236\126\232\052\314\241\332\077\310\146 -\053\323\130\234\040\205\372\253\221\212\160\160\021\070\140\144 -\013\142\011\221\130\000\371\115\373\064\150\332\011\255\041\006 -\030\224\316 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "vTrus ECC Root CA" -# Issuer: CN=vTrus ECC Root CA,O="iTrusChina Co.,Ltd.",C=CN -# Serial Number:6e:6a:bc:59:aa:53:be:98:39:67:a2:d2:6b:a4:3b:e6:6d:1c:d6:da -# Subject: CN=vTrus ECC Root CA,O="iTrusChina Co.,Ltd.",C=CN -# Not Valid Before: Tue Jul 31 07:26:44 2018 -# Not Valid After : Fri Jul 31 07:26:44 2043 -# Fingerprint (SHA-256): 30:FB:BA:2C:32:23:8E:2A:98:54:7A:F9:79:31:E5:50:42:8B:9B:3F:1C:8E:EB:66:33:DC:FA:86:C5:B2:7D:D3 -# Fingerprint (SHA1): F6:9C:DB:B0:FC:F6:02:13:B6:52:32:A6:A3:91:3F:16:70:DA:C3:E1 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "vTrus ECC Root CA" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\366\234\333\260\374\366\002\023\266\122\062\246\243\221\077\026 -\160\332\303\341 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\336\113\301\365\122\214\233\103\341\076\217\125\124\027\215\205 -END -CKA_ISSUER MULTILINE_OCTAL -\060\107\061\013\060\011\006\003\125\004\006\023\002\103\116\061 -\034\060\032\006\003\125\004\012\023\023\151\124\162\165\163\103 -\150\151\156\141\040\103\157\056\054\114\164\144\056\061\032\060 -\030\006\003\125\004\003\023\021\166\124\162\165\163\040\105\103 -\103\040\122\157\157\164\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\156\152\274\131\252\123\276\230\071\147\242\322\153\244 -\073\346\155\034\326\332 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "vTrus Root CA" -# -# Issuer: CN=vTrus Root CA,O="iTrusChina Co.,Ltd.",C=CN -# Serial Number:43:e3:71:13:d8:b3:59:14:5d:b7:ce:8c:fd:35:fd:6f:bc:05:8d:45 -# Subject: CN=vTrus Root CA,O="iTrusChina Co.,Ltd.",C=CN -# Not Valid Before: Tue Jul 31 07:24:05 2018 -# Not Valid After : Fri Jul 31 07:24:05 2043 -# Fingerprint (SHA-256): 8A:71:DE:65:59:33:6F:42:6C:26:E5:38:80:D0:0D:88:A1:8D:A4:C6:A9:1F:0D:CB:61:94:E2:06:C5:C9:63:87 -# Fingerprint (SHA1): 84:1A:69:FB:F5:CD:1A:25:34:13:3D:E3:F8:FC:B8:99:D0:C9:14:B7 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "vTrus Root CA" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\103\061\013\060\011\006\003\125\004\006\023\002\103\116\061 -\034\060\032\006\003\125\004\012\023\023\151\124\162\165\163\103 -\150\151\156\141\040\103\157\056\054\114\164\144\056\061\026\060 -\024\006\003\125\004\003\023\015\166\124\162\165\163\040\122\157 -\157\164\040\103\101 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\103\061\013\060\011\006\003\125\004\006\023\002\103\116\061 -\034\060\032\006\003\125\004\012\023\023\151\124\162\165\163\103 -\150\151\156\141\040\103\157\056\054\114\164\144\056\061\026\060 -\024\006\003\125\004\003\023\015\166\124\162\165\163\040\122\157 -\157\164\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\103\343\161\023\330\263\131\024\135\267\316\214\375\065 -\375\157\274\005\215\105 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\126\060\202\003\076\240\003\002\001\002\002\024\103 -\343\161\023\330\263\131\024\135\267\316\214\375\065\375\157\274 -\005\215\105\060\015\006\011\052\206\110\206\367\015\001\001\013 -\005\000\060\103\061\013\060\011\006\003\125\004\006\023\002\103 -\116\061\034\060\032\006\003\125\004\012\023\023\151\124\162\165 -\163\103\150\151\156\141\040\103\157\056\054\114\164\144\056\061 -\026\060\024\006\003\125\004\003\023\015\166\124\162\165\163\040 -\122\157\157\164\040\103\101\060\036\027\015\061\070\060\067\063 -\061\060\067\062\064\060\065\132\027\015\064\063\060\067\063\061 -\060\067\062\064\060\065\132\060\103\061\013\060\011\006\003\125 -\004\006\023\002\103\116\061\034\060\032\006\003\125\004\012\023 -\023\151\124\162\165\163\103\150\151\156\141\040\103\157\056\054 -\114\164\144\056\061\026\060\024\006\003\125\004\003\023\015\166 -\124\162\165\163\040\122\157\157\164\040\103\101\060\202\002\042 -\060\015\006\011\052\206\110\206\367\015\001\001\001\005\000\003 -\202\002\017\000\060\202\002\012\002\202\002\001\000\275\125\174 -\141\323\270\035\004\142\005\240\256\154\267\160\264\101\352\113 -\003\136\020\077\220\132\034\213\073\260\146\213\154\110\246\034 -\042\272\325\100\222\356\063\262\043\131\311\216\274\130\332\213 -\236\320\031\362\057\131\306\214\143\132\272\237\243\013\260\263 -\232\134\272\021\270\022\351\014\273\317\156\154\200\207\051\024 -\003\054\215\044\232\310\144\203\265\152\254\023\054\063\361\237 -\334\054\141\074\032\077\160\125\233\255\000\122\177\317\004\271 -\376\066\372\234\300\026\256\142\376\226\114\103\176\125\024\276 -\032\263\322\155\302\257\166\146\225\153\052\260\224\167\205\136 -\004\017\142\035\143\165\367\153\347\313\133\232\160\354\076\147 -\005\360\376\007\010\200\317\050\333\005\306\024\047\057\206\175 -\360\047\336\377\346\176\063\110\347\013\036\130\321\047\053\123 -\016\127\112\145\327\373\242\200\140\374\114\274\065\123\001\152 -\227\162\202\257\361\035\160\350\234\365\357\136\302\154\307\107 -\176\132\224\205\046\115\073\272\353\114\350\260\011\302\145\302 -\235\235\011\233\116\265\227\005\254\365\006\240\367\066\005\176 -\364\220\262\153\304\264\371\144\352\351\032\012\310\015\250\355 -\047\311\324\347\263\271\253\202\042\220\047\075\052\350\174\220 -\357\274\117\375\342\012\044\247\336\145\044\244\135\352\300\166 -\060\323\167\120\370\015\004\233\224\066\001\163\312\006\130\246 -\323\073\334\372\004\106\023\125\212\311\104\107\270\121\071\032 -\056\350\064\342\171\313\131\112\012\177\274\246\357\037\003\147 -\152\131\053\045\142\223\331\123\031\146\074\047\142\051\206\115 -\244\153\356\377\324\116\272\325\264\342\216\110\132\000\031\011 -\361\005\331\316\221\261\367\353\351\071\117\366\157\004\103\232 -\125\365\076\005\024\275\277\263\131\264\330\216\063\204\243\220 -\122\252\263\002\225\140\371\014\114\150\371\356\325\027\015\370 -\161\127\265\045\344\051\356\145\135\257\321\356\074\027\013\132 -\103\305\245\206\352\044\236\342\005\007\334\064\102\022\221\326 -\071\164\256\114\101\202\333\362\246\110\321\263\233\363\063\252 -\363\246\300\305\116\365\364\235\166\143\346\002\306\042\113\301 -\225\077\120\144\054\124\345\266\360\074\051\317\127\002\003\001 -\000\001\243\102\060\100\060\035\006\003\125\035\016\004\026\004 -\024\124\142\160\143\361\165\204\103\130\216\321\026\040\261\306 -\254\032\274\366\211\060\017\006\003\125\035\023\001\001\377\004 -\005\060\003\001\001\377\060\016\006\003\125\035\017\001\001\377 -\004\004\003\002\001\006\060\015\006\011\052\206\110\206\367\015 -\001\001\013\005\000\003\202\002\001\000\051\272\222\111\247\255 -\360\361\160\303\344\227\360\237\251\045\325\153\236\064\376\346 -\032\144\366\072\153\122\262\020\170\032\237\114\332\212\332\354 -\034\067\122\340\102\113\373\154\166\312\044\013\071\022\025\235 -\237\021\055\374\171\144\334\340\340\365\335\340\127\311\245\262 -\166\160\120\244\376\267\012\160\325\240\064\361\165\327\115\111 -\272\021\321\263\330\354\202\377\353\016\304\277\144\055\175\143 -\156\027\170\354\135\174\210\310\353\216\127\166\331\131\004\372 -\274\122\037\105\254\360\172\200\354\354\157\166\256\221\333\020 -\216\004\334\222\337\240\366\346\256\111\323\301\154\022\033\314 -\051\252\371\010\245\342\067\024\312\261\270\146\357\032\202\344 -\360\370\361\247\026\151\267\333\251\141\074\237\365\061\313\344 -\000\106\302\057\164\261\261\327\201\356\250\046\225\274\210\257 -\114\065\007\052\002\312\170\024\155\107\053\100\126\351\313\052 -\140\241\147\003\240\316\214\274\260\162\147\304\061\316\333\064 -\345\045\003\140\045\173\161\230\344\300\033\053\137\164\102\322 -\113\305\131\010\007\207\276\305\303\177\347\226\331\341\334\050 -\227\326\217\005\343\365\233\116\312\035\120\107\005\123\260\312 -\071\347\205\240\211\301\005\073\001\067\323\077\111\342\167\353 -\043\310\210\146\073\075\071\166\041\106\361\354\137\043\270\353 -\242\146\165\164\301\100\367\330\150\232\223\342\055\251\056\275 -\034\243\036\310\164\306\244\055\172\040\253\073\270\260\106\375 -\157\335\137\122\125\165\142\360\227\240\174\327\070\375\045\337 -\315\240\233\020\317\213\270\070\136\136\305\264\246\002\066\241 -\036\137\034\317\342\226\235\051\252\375\230\256\122\341\363\101 -\122\373\251\056\162\226\237\047\343\252\163\175\370\032\043\146 -\173\073\253\145\260\062\001\113\025\076\075\242\117\014\053\065 -\242\306\331\147\022\065\060\315\166\056\026\263\231\236\115\117 -\116\055\073\064\103\341\232\016\015\244\146\227\272\322\034\112 -\114\054\052\213\213\201\117\161\032\251\335\134\173\173\010\305 -\000\015\067\100\343\174\173\124\137\057\205\137\166\366\367\247 -\260\034\127\126\301\162\350\255\242\257\215\063\111\272\037\212 -\334\346\164\174\140\206\157\207\227\173 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "vTrus Root CA" -# Issuer: CN=vTrus Root CA,O="iTrusChina Co.,Ltd.",C=CN -# Serial Number:43:e3:71:13:d8:b3:59:14:5d:b7:ce:8c:fd:35:fd:6f:bc:05:8d:45 -# Subject: CN=vTrus Root CA,O="iTrusChina Co.,Ltd.",C=CN -# Not Valid Before: Tue Jul 31 07:24:05 2018 -# Not Valid After : Fri Jul 31 07:24:05 2043 -# Fingerprint (SHA-256): 8A:71:DE:65:59:33:6F:42:6C:26:E5:38:80:D0:0D:88:A1:8D:A4:C6:A9:1F:0D:CB:61:94:E2:06:C5:C9:63:87 -# Fingerprint (SHA1): 84:1A:69:FB:F5:CD:1A:25:34:13:3D:E3:F8:FC:B8:99:D0:C9:14:B7 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "vTrus Root CA" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\204\032\151\373\365\315\032\045\064\023\075\343\370\374\270\231 -\320\311\024\267 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\270\311\067\337\372\153\061\204\144\305\352\021\152\033\165\374 -END -CKA_ISSUER MULTILINE_OCTAL -\060\103\061\013\060\011\006\003\125\004\006\023\002\103\116\061 -\034\060\032\006\003\125\004\012\023\023\151\124\162\165\163\103 -\150\151\156\141\040\103\157\056\054\114\164\144\056\061\026\060 -\024\006\003\125\004\003\023\015\166\124\162\165\163\040\122\157 -\157\164\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\103\343\161\023\330\263\131\024\135\267\316\214\375\065 -\375\157\274\005\215\105 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "ISRG Root X2" -# -# Issuer: CN=ISRG Root X2,O=Internet Security Research Group,C=US -# Serial Number:41:d2:9d:d1:72:ea:ee:a7:80:c1:2c:6c:e9:2f:87:52 -# Subject: CN=ISRG Root X2,O=Internet Security Research Group,C=US -# Not Valid Before: Fri Sep 04 00:00:00 2020 -# Not Valid After : Mon Sep 17 16:00:00 2040 -# Fingerprint (SHA-256): 69:72:9B:8E:15:A8:6E:FC:17:7A:57:AF:B7:17:1D:FC:64:AD:D2:8C:2F:CA:8C:F1:50:7E:34:45:3C:CB:14:70 -# Fingerprint (SHA1): BD:B1:B9:3C:D5:97:8D:45:C6:26:14:55:F8:DB:95:C7:5A:D1:53:AF -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "ISRG Root X2" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\117\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\051\060\047\006\003\125\004\012\023\040\111\156\164\145\162\156 -\145\164\040\123\145\143\165\162\151\164\171\040\122\145\163\145 -\141\162\143\150\040\107\162\157\165\160\061\025\060\023\006\003 -\125\004\003\023\014\111\123\122\107\040\122\157\157\164\040\130 -\062 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\117\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\051\060\047\006\003\125\004\012\023\040\111\156\164\145\162\156 -\145\164\040\123\145\143\165\162\151\164\171\040\122\145\163\145 -\141\162\143\150\040\107\162\157\165\160\061\025\060\023\006\003 -\125\004\003\023\014\111\123\122\107\040\122\157\157\164\040\130 -\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\101\322\235\321\162\352\356\247\200\301\054\154\351\057 -\207\122 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\033\060\202\001\241\240\003\002\001\002\002\020\101 -\322\235\321\162\352\356\247\200\301\054\154\351\057\207\122\060 -\012\006\010\052\206\110\316\075\004\003\003\060\117\061\013\060 -\011\006\003\125\004\006\023\002\125\123\061\051\060\047\006\003 -\125\004\012\023\040\111\156\164\145\162\156\145\164\040\123\145 -\143\165\162\151\164\171\040\122\145\163\145\141\162\143\150\040 -\107\162\157\165\160\061\025\060\023\006\003\125\004\003\023\014 -\111\123\122\107\040\122\157\157\164\040\130\062\060\036\027\015 -\062\060\060\071\060\064\060\060\060\060\060\060\132\027\015\064 -\060\060\071\061\067\061\066\060\060\060\060\132\060\117\061\013 -\060\011\006\003\125\004\006\023\002\125\123\061\051\060\047\006 -\003\125\004\012\023\040\111\156\164\145\162\156\145\164\040\123 -\145\143\165\162\151\164\171\040\122\145\163\145\141\162\143\150 -\040\107\162\157\165\160\061\025\060\023\006\003\125\004\003\023 -\014\111\123\122\107\040\122\157\157\164\040\130\062\060\166\060 -\020\006\007\052\206\110\316\075\002\001\006\005\053\201\004\000 -\042\003\142\000\004\315\233\325\237\200\203\012\354\011\112\363 -\026\112\076\134\317\167\254\336\147\005\015\035\007\266\334\026 -\373\132\213\024\333\342\161\140\304\272\105\225\021\211\216\352 -\006\337\367\052\026\034\244\271\305\305\062\340\003\340\036\202 -\030\070\213\327\105\330\012\152\156\346\000\167\373\002\121\175 -\042\330\012\156\232\133\167\337\360\372\101\354\071\334\165\312 -\150\007\014\037\352\243\102\060\100\060\016\006\003\125\035\017 -\001\001\377\004\004\003\002\001\006\060\017\006\003\125\035\023 -\001\001\377\004\005\060\003\001\001\377\060\035\006\003\125\035 -\016\004\026\004\024\174\102\226\256\336\113\110\073\372\222\370 -\236\214\317\155\213\251\162\067\225\060\012\006\010\052\206\110 -\316\075\004\003\003\003\150\000\060\145\002\060\173\171\116\106 -\120\204\302\104\207\106\033\105\160\377\130\231\336\364\375\244 -\322\125\246\040\055\164\326\064\274\101\243\120\137\001\047\126 -\264\276\047\165\006\257\022\056\165\230\215\374\002\061\000\213 -\365\167\154\324\310\145\252\340\013\054\356\024\235\047\067\244 -\371\123\245\121\344\051\203\327\370\220\061\133\102\237\012\365 -\376\256\000\150\347\214\111\017\266\157\133\133\025\362\347 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "ISRG Root X2" -# Issuer: CN=ISRG Root X2,O=Internet Security Research Group,C=US -# Serial Number:41:d2:9d:d1:72:ea:ee:a7:80:c1:2c:6c:e9:2f:87:52 -# Subject: CN=ISRG Root X2,O=Internet Security Research Group,C=US -# Not Valid Before: Fri Sep 04 00:00:00 2020 -# Not Valid After : Mon Sep 17 16:00:00 2040 -# Fingerprint (SHA-256): 69:72:9B:8E:15:A8:6E:FC:17:7A:57:AF:B7:17:1D:FC:64:AD:D2:8C:2F:CA:8C:F1:50:7E:34:45:3C:CB:14:70 -# Fingerprint (SHA1): BD:B1:B9:3C:D5:97:8D:45:C6:26:14:55:F8:DB:95:C7:5A:D1:53:AF -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "ISRG Root X2" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\275\261\271\074\325\227\215\105\306\046\024\125\370\333\225\307 -\132\321\123\257 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\323\236\304\036\043\074\246\337\317\243\176\155\340\024\346\345 -END -CKA_ISSUER MULTILINE_OCTAL -\060\117\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\051\060\047\006\003\125\004\012\023\040\111\156\164\145\162\156 -\145\164\040\123\145\143\165\162\151\164\171\040\122\145\163\145 -\141\162\143\150\040\107\162\157\165\160\061\025\060\023\006\003 -\125\004\003\023\014\111\123\122\107\040\122\157\157\164\040\130 -\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\101\322\235\321\162\352\356\247\200\301\054\154\351\057 -\207\122 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "HiPKI Root CA - G1" -# -# Issuer: CN=HiPKI Root CA - G1,O="Chunghwa Telecom Co., Ltd.",C=TW -# Serial Number:2d:dd:ac:ce:62:97:94:a1:43:e8:b0:cd:76:6a:5e:60 -# Subject: CN=HiPKI Root CA - G1,O="Chunghwa Telecom Co., Ltd.",C=TW -# Not Valid Before: Fri Feb 22 09:46:04 2019 -# Not Valid After : Thu Dec 31 15:59:59 2037 -# Fingerprint (SHA-256): F0:15:CE:3C:C2:39:BF:EF:06:4B:E9:F1:D2:C4:17:E1:A0:26:4A:0A:94:BE:1F:0C:8D:12:18:64:EB:69:49:CC -# Fingerprint (SHA1): 6A:92:E4:A8:EE:1B:EC:96:45:37:E3:29:57:49:CD:96:E3:E5:D2:60 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "HiPKI Root CA - G1" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\117\061\013\060\011\006\003\125\004\006\023\002\124\127\061 -\043\060\041\006\003\125\004\012\014\032\103\150\165\156\147\150 -\167\141\040\124\145\154\145\143\157\155\040\103\157\056\054\040 -\114\164\144\056\061\033\060\031\006\003\125\004\003\014\022\110 -\151\120\113\111\040\122\157\157\164\040\103\101\040\055\040\107 -\061 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\117\061\013\060\011\006\003\125\004\006\023\002\124\127\061 -\043\060\041\006\003\125\004\012\014\032\103\150\165\156\147\150 -\167\141\040\124\145\154\145\143\157\155\040\103\157\056\054\040 -\114\164\144\056\061\033\060\031\006\003\125\004\003\014\022\110 -\151\120\113\111\040\122\157\157\164\040\103\101\040\055\040\107 -\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\055\335\254\316\142\227\224\241\103\350\260\315\166\152 -\136\140 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\152\060\202\003\122\240\003\002\001\002\002\020\055 -\335\254\316\142\227\224\241\103\350\260\315\166\152\136\140\060 -\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060\117 -\061\013\060\011\006\003\125\004\006\023\002\124\127\061\043\060 -\041\006\003\125\004\012\014\032\103\150\165\156\147\150\167\141 -\040\124\145\154\145\143\157\155\040\103\157\056\054\040\114\164 -\144\056\061\033\060\031\006\003\125\004\003\014\022\110\151\120 -\113\111\040\122\157\157\164\040\103\101\040\055\040\107\061\060 -\036\027\015\061\071\060\062\062\062\060\071\064\066\060\064\132 -\027\015\063\067\061\062\063\061\061\065\065\071\065\071\132\060 -\117\061\013\060\011\006\003\125\004\006\023\002\124\127\061\043 -\060\041\006\003\125\004\012\014\032\103\150\165\156\147\150\167 -\141\040\124\145\154\145\143\157\155\040\103\157\056\054\040\114 -\164\144\056\061\033\060\031\006\003\125\004\003\014\022\110\151 -\120\113\111\040\122\157\157\164\040\103\101\040\055\040\107\061 -\060\202\002\042\060\015\006\011\052\206\110\206\367\015\001\001 -\001\005\000\003\202\002\017\000\060\202\002\012\002\202\002\001 -\000\364\036\177\122\163\062\014\163\344\275\023\164\243\324\060 -\250\320\256\113\330\266\337\165\107\146\364\174\347\071\004\036 -\152\160\040\322\132\107\162\147\125\364\245\350\235\325\036\041 -\241\360\147\272\314\041\150\276\104\123\277\215\371\342\334\057 -\125\310\067\077\037\244\300\234\263\344\167\134\240\106\376\167 -\372\032\240\070\352\355\232\162\336\053\275\224\127\072\272\354 -\171\347\137\175\102\144\071\172\046\066\367\044\360\325\057\272 -\225\230\021\146\255\227\065\326\165\001\200\340\257\364\204\141 -\214\015\036\137\174\207\226\136\101\257\353\207\352\370\135\361 -\056\210\005\076\114\042\273\332\037\052\335\122\106\144\071\363 -\102\316\331\236\014\263\260\167\227\144\234\300\364\243\056\037 -\225\007\260\027\337\060\333\000\030\226\114\241\201\113\335\004 -\155\123\243\075\374\007\254\324\305\067\202\353\344\225\010\031 -\050\202\322\102\072\243\330\123\354\171\211\140\110\140\310\162 -\222\120\334\003\217\203\077\262\102\127\132\333\152\351\021\227 -\335\205\050\274\060\114\253\343\302\261\105\104\107\037\340\212 -\026\007\226\322\041\017\123\300\355\251\176\324\116\354\233\011 -\354\257\102\254\060\326\277\321\020\105\340\246\026\262\245\305 -\323\117\163\224\063\161\002\241\152\243\326\063\227\117\041\143 -\036\133\217\331\301\136\105\161\167\017\201\135\137\041\232\255 -\203\314\372\136\326\215\043\137\033\075\101\257\040\165\146\132 -\112\366\237\373\253\030\367\161\300\266\035\061\354\073\040\353 -\313\342\270\365\256\222\262\367\341\204\113\362\242\362\223\232 -\042\236\323\024\157\066\124\275\037\136\131\025\271\163\250\301 -\174\157\173\142\351\026\154\107\132\145\363\016\021\233\106\331 -\375\155\334\326\234\300\264\175\245\260\335\077\126\157\241\371 -\366\344\022\110\375\006\177\022\127\266\251\043\117\133\003\303 -\340\161\052\043\267\367\260\261\073\274\230\275\326\230\250\014 -\153\366\216\022\147\246\362\262\130\344\002\011\023\074\251\273 -\020\264\322\060\105\361\354\367\000\021\337\145\370\334\053\103 -\125\277\026\227\304\017\325\054\141\204\252\162\206\376\346\072 -\176\302\077\175\356\374\057\024\076\346\205\335\120\157\267\111 -\355\002\003\001\000\001\243\102\060\100\060\017\006\003\125\035 -\023\001\001\377\004\005\060\003\001\001\377\060\035\006\003\125 -\035\016\004\026\004\024\362\167\027\372\136\250\376\366\075\161 -\325\150\272\311\106\014\070\330\257\260\060\016\006\003\125\035 -\017\001\001\377\004\004\003\002\001\206\060\015\006\011\052\206 -\110\206\367\015\001\001\013\005\000\003\202\002\001\000\120\121 -\360\165\334\160\004\343\377\252\165\324\161\242\313\236\217\250 -\251\323\257\165\307\124\317\072\034\004\231\042\254\304\021\342 -\357\063\112\246\043\035\016\015\107\330\067\307\157\257\064\177 -\117\201\153\065\117\351\162\245\061\342\170\347\367\116\224\030 -\133\100\175\317\153\041\124\206\346\225\172\373\306\312\352\234 -\110\116\127\011\135\057\254\364\245\264\227\063\130\325\254\171 -\251\314\137\371\205\372\122\305\215\370\221\024\353\072\015\027 -\320\122\302\173\343\302\163\216\106\170\006\070\054\350\134\332 -\146\304\364\244\360\126\031\063\051\132\145\222\005\107\106\112 -\253\204\303\036\047\241\037\021\222\231\047\165\223\017\274\066 -\073\227\127\217\046\133\014\273\234\017\324\156\060\007\324\334 -\137\066\150\146\071\203\226\047\046\212\310\304\071\376\232\041 -\157\325\162\206\351\177\142\345\227\116\320\044\320\100\260\320 -\165\010\216\275\150\356\010\327\156\174\020\160\106\033\174\340 -\210\262\236\162\206\231\001\343\277\237\111\031\264\045\276\126 -\145\256\027\143\345\036\337\350\377\107\245\277\341\046\005\204 -\344\260\300\257\347\010\231\250\014\136\046\200\105\324\370\150 -\057\226\217\256\342\112\034\234\026\014\023\157\070\207\366\273 -\310\064\137\222\003\121\171\160\246\337\313\365\231\115\171\315 -\116\274\127\237\103\116\153\056\053\030\370\152\163\214\272\305 -\065\357\071\152\101\036\317\161\250\242\262\206\007\133\072\311 -\341\357\077\145\004\200\107\062\104\160\225\116\061\147\152\164 -\133\020\105\165\352\260\237\320\346\065\376\116\237\213\314\053 -\222\105\133\156\045\140\205\106\315\321\252\260\166\146\223\167 -\226\276\203\276\070\266\044\116\046\013\314\355\172\126\032\340 -\351\132\306\144\255\114\172\000\110\104\057\271\100\273\023\076 -\276\025\170\235\205\201\112\052\127\336\325\031\103\332\333\312 -\133\107\206\203\013\077\266\015\166\170\163\171\042\136\261\200 -\037\317\276\321\077\126\020\230\053\225\207\241\037\235\144\024 -\140\071\054\263\000\125\056\344\365\263\016\127\304\221\101\000 -\234\077\350\245\337\352\366\377\310\360\255\155\122\250\027\253 -\233\141\374\022\121\065\344\045\375\257\252\152\206\071 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "HiPKI Root CA - G1" -# Issuer: CN=HiPKI Root CA - G1,O="Chunghwa Telecom Co., Ltd.",C=TW -# Serial Number:2d:dd:ac:ce:62:97:94:a1:43:e8:b0:cd:76:6a:5e:60 -# Subject: CN=HiPKI Root CA - G1,O="Chunghwa Telecom Co., Ltd.",C=TW -# Not Valid Before: Fri Feb 22 09:46:04 2019 -# Not Valid After : Thu Dec 31 15:59:59 2037 -# Fingerprint (SHA-256): F0:15:CE:3C:C2:39:BF:EF:06:4B:E9:F1:D2:C4:17:E1:A0:26:4A:0A:94:BE:1F:0C:8D:12:18:64:EB:69:49:CC -# Fingerprint (SHA1): 6A:92:E4:A8:EE:1B:EC:96:45:37:E3:29:57:49:CD:96:E3:E5:D2:60 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "HiPKI Root CA - G1" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\152\222\344\250\356\033\354\226\105\067\343\051\127\111\315\226 -\343\345\322\140 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\151\105\337\026\145\113\350\150\232\217\166\137\377\200\236\323 -END -CKA_ISSUER MULTILINE_OCTAL -\060\117\061\013\060\011\006\003\125\004\006\023\002\124\127\061 -\043\060\041\006\003\125\004\012\014\032\103\150\165\156\147\150 -\167\141\040\124\145\154\145\143\157\155\040\103\157\056\054\040 -\114\164\144\056\061\033\060\031\006\003\125\004\003\014\022\110 -\151\120\113\111\040\122\157\157\164\040\103\101\040\055\040\107 -\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\055\335\254\316\142\227\224\241\103\350\260\315\166\152 -\136\140 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "GlobalSign ECC Root CA - R4" -# -# Issuer: CN=GlobalSign,O=GlobalSign,OU=GlobalSign ECC Root CA - R4 -# Serial Number:02:03:e5:7e:f5:3f:93:fd:a5:09:21:b2:a6 -# Subject: CN=GlobalSign,O=GlobalSign,OU=GlobalSign ECC Root CA - R4 -# Not Valid Before: Tue Nov 13 00:00:00 2012 -# Not Valid After : Tue Jan 19 03:14:07 2038 -# Fingerprint (SHA-256): B0:85:D7:0B:96:4F:19:1A:73:E4:AF:0D:54:AE:7A:0E:07:AA:FD:AF:9B:71:DD:08:62:13:8A:B7:32:5A:24:A2 -# Fingerprint (SHA1): 6B:A0:B0:98:E1:71:EF:5A:AD:FE:48:15:80:77:10:F4:BD:6F:0B:28 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "GlobalSign ECC Root CA - R4" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\120\061\044\060\042\006\003\125\004\013\023\033\107\154\157 -\142\141\154\123\151\147\156\040\105\103\103\040\122\157\157\164 -\040\103\101\040\055\040\122\064\061\023\060\021\006\003\125\004 -\012\023\012\107\154\157\142\141\154\123\151\147\156\061\023\060 -\021\006\003\125\004\003\023\012\107\154\157\142\141\154\123\151 -\147\156 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\120\061\044\060\042\006\003\125\004\013\023\033\107\154\157 -\142\141\154\123\151\147\156\040\105\103\103\040\122\157\157\164 -\040\103\101\040\055\040\122\064\061\023\060\021\006\003\125\004 -\012\023\012\107\154\157\142\141\154\123\151\147\156\061\023\060 -\021\006\003\125\004\003\023\012\107\154\157\142\141\154\123\151 -\147\156 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\015\002\003\345\176\365\077\223\375\245\011\041\262\246 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\001\334\060\202\001\203\240\003\002\001\002\002\015\002 -\003\345\176\365\077\223\375\245\011\041\262\246\060\012\006\010 -\052\206\110\316\075\004\003\002\060\120\061\044\060\042\006\003 -\125\004\013\023\033\107\154\157\142\141\154\123\151\147\156\040 -\105\103\103\040\122\157\157\164\040\103\101\040\055\040\122\064 -\061\023\060\021\006\003\125\004\012\023\012\107\154\157\142\141 -\154\123\151\147\156\061\023\060\021\006\003\125\004\003\023\012 -\107\154\157\142\141\154\123\151\147\156\060\036\027\015\061\062 -\061\061\061\063\060\060\060\060\060\060\132\027\015\063\070\060 -\061\061\071\060\063\061\064\060\067\132\060\120\061\044\060\042 -\006\003\125\004\013\023\033\107\154\157\142\141\154\123\151\147 -\156\040\105\103\103\040\122\157\157\164\040\103\101\040\055\040 -\122\064\061\023\060\021\006\003\125\004\012\023\012\107\154\157 -\142\141\154\123\151\147\156\061\023\060\021\006\003\125\004\003 -\023\012\107\154\157\142\141\154\123\151\147\156\060\131\060\023 -\006\007\052\206\110\316\075\002\001\006\010\052\206\110\316\075 -\003\001\007\003\102\000\004\270\306\171\323\217\154\045\016\237 -\056\071\031\034\003\244\256\232\345\071\007\011\026\312\143\261 -\271\206\370\212\127\301\127\316\102\372\163\241\367\145\102\377 -\036\301\000\262\156\163\016\377\307\041\345\030\244\252\331\161 -\077\250\324\271\316\214\035\243\102\060\100\060\016\006\003\125 -\035\017\001\001\377\004\004\003\002\001\206\060\017\006\003\125 -\035\023\001\001\377\004\005\060\003\001\001\377\060\035\006\003 -\125\035\016\004\026\004\024\124\260\173\255\105\270\342\100\177 -\373\012\156\373\276\063\311\074\243\204\325\060\012\006\010\052 -\206\110\316\075\004\003\002\003\107\000\060\104\002\040\042\117 -\164\162\271\140\257\361\346\234\240\026\005\120\137\303\136\073 -\156\141\164\357\276\001\304\276\030\110\131\141\202\062\002\040 -\046\235\124\143\100\336\067\140\120\317\310\330\355\235\202\256 -\067\230\274\243\217\114\114\251\064\053\154\357\373\225\233\046 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "GlobalSign ECC Root CA - R4" -# Issuer: CN=GlobalSign,O=GlobalSign,OU=GlobalSign ECC Root CA - R4 -# Serial Number:02:03:e5:7e:f5:3f:93:fd:a5:09:21:b2:a6 -# Subject: CN=GlobalSign,O=GlobalSign,OU=GlobalSign ECC Root CA - R4 -# Not Valid Before: Tue Nov 13 00:00:00 2012 -# Not Valid After : Tue Jan 19 03:14:07 2038 -# Fingerprint (SHA-256): B0:85:D7:0B:96:4F:19:1A:73:E4:AF:0D:54:AE:7A:0E:07:AA:FD:AF:9B:71:DD:08:62:13:8A:B7:32:5A:24:A2 -# Fingerprint (SHA1): 6B:A0:B0:98:E1:71:EF:5A:AD:FE:48:15:80:77:10:F4:BD:6F:0B:28 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "GlobalSign ECC Root CA - R4" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\153\240\260\230\341\161\357\132\255\376\110\025\200\167\020\364 -\275\157\013\050 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\046\051\370\155\341\210\277\242\145\177\252\304\315\017\177\374 -END -CKA_ISSUER MULTILINE_OCTAL -\060\120\061\044\060\042\006\003\125\004\013\023\033\107\154\157 -\142\141\154\123\151\147\156\040\105\103\103\040\122\157\157\164 -\040\103\101\040\055\040\122\064\061\023\060\021\006\003\125\004 -\012\023\012\107\154\157\142\141\154\123\151\147\156\061\023\060 -\021\006\003\125\004\003\023\012\107\154\157\142\141\154\123\151 -\147\156 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\015\002\003\345\176\365\077\223\375\245\011\041\262\246 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "GTS Root R1" -# -# Issuer: CN=GTS Root R1,O=Google Trust Services LLC,C=US -# Serial Number:02:03:e5:93:6f:31:b0:13:49:88:6b:a2:17 -# Subject: CN=GTS Root R1,O=Google Trust Services LLC,C=US -# Not Valid Before: Wed Jun 22 00:00:00 2016 -# Not Valid After : Sun Jun 22 00:00:00 2036 -# Fingerprint (SHA-256): D9:47:43:2A:BD:E7:B7:FA:90:FC:2E:6B:59:10:1B:12:80:E0:E1:C7:E4:E4:0F:A3:C6:88:7F:FF:57:A7:F4:CF -# Fingerprint (SHA1): E5:8C:1C:C4:91:3B:38:63:4B:E9:10:6E:E3:AD:8E:6B:9D:D9:81:4A -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "GTS Root R1" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\107\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\042\060\040\006\003\125\004\012\023\031\107\157\157\147\154\145 -\040\124\162\165\163\164\040\123\145\162\166\151\143\145\163\040 -\114\114\103\061\024\060\022\006\003\125\004\003\023\013\107\124 -\123\040\122\157\157\164\040\122\061 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\107\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\042\060\040\006\003\125\004\012\023\031\107\157\157\147\154\145 -\040\124\162\165\163\164\040\123\145\162\166\151\143\145\163\040 -\114\114\103\061\024\060\022\006\003\125\004\003\023\013\107\124 -\123\040\122\157\157\164\040\122\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\015\002\003\345\223\157\061\260\023\111\210\153\242\027 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\127\060\202\003\077\240\003\002\001\002\002\015\002 -\003\345\223\157\061\260\023\111\210\153\242\027\060\015\006\011 -\052\206\110\206\367\015\001\001\014\005\000\060\107\061\013\060 -\011\006\003\125\004\006\023\002\125\123\061\042\060\040\006\003 -\125\004\012\023\031\107\157\157\147\154\145\040\124\162\165\163 -\164\040\123\145\162\166\151\143\145\163\040\114\114\103\061\024 -\060\022\006\003\125\004\003\023\013\107\124\123\040\122\157\157 -\164\040\122\061\060\036\027\015\061\066\060\066\062\062\060\060 -\060\060\060\060\132\027\015\063\066\060\066\062\062\060\060\060 -\060\060\060\132\060\107\061\013\060\011\006\003\125\004\006\023 -\002\125\123\061\042\060\040\006\003\125\004\012\023\031\107\157 -\157\147\154\145\040\124\162\165\163\164\040\123\145\162\166\151 -\143\145\163\040\114\114\103\061\024\060\022\006\003\125\004\003 -\023\013\107\124\123\040\122\157\157\164\040\122\061\060\202\002 -\042\060\015\006\011\052\206\110\206\367\015\001\001\001\005\000 -\003\202\002\017\000\060\202\002\012\002\202\002\001\000\266\021 -\002\213\036\343\241\167\233\073\334\277\224\076\267\225\247\100 -\074\241\375\202\371\175\062\006\202\161\366\366\214\177\373\350 -\333\274\152\056\227\227\243\214\113\371\053\366\261\371\316\204 -\035\261\371\305\227\336\357\271\362\243\351\274\022\211\136\247 -\252\122\253\370\043\047\313\244\261\234\143\333\327\231\176\360 -\012\136\353\150\246\364\306\132\107\015\115\020\063\343\116\261 -\023\243\310\030\154\113\354\374\011\220\337\235\144\051\045\043 -\007\241\264\322\075\056\140\340\317\322\011\207\273\315\110\360 -\115\302\302\172\210\212\273\272\317\131\031\326\257\217\260\007 -\260\236\061\361\202\301\300\337\056\246\155\154\031\016\265\330 -\176\046\032\105\003\075\260\171\244\224\050\255\017\177\046\345 -\250\010\376\226\350\074\150\224\123\356\203\072\210\053\025\226 -\011\262\340\172\214\056\165\326\234\353\247\126\144\217\226\117 -\150\256\075\227\302\204\217\300\274\100\300\013\134\275\366\207 -\263\065\154\254\030\120\177\204\340\114\315\222\323\040\351\063 -\274\122\231\257\062\265\051\263\045\052\264\110\371\162\341\312 -\144\367\346\202\020\215\350\235\302\212\210\372\070\146\212\374 -\143\371\001\371\170\375\173\134\167\372\166\207\372\354\337\261 -\016\171\225\127\264\275\046\357\326\001\321\353\026\012\273\216 -\013\265\305\305\212\125\253\323\254\352\221\113\051\314\031\244 -\062\045\116\052\361\145\104\320\002\316\252\316\111\264\352\237 -\174\203\260\100\173\347\103\253\247\154\243\217\175\211\201\372 -\114\245\377\325\216\303\316\113\340\265\330\263\216\105\317\166 -\300\355\100\053\375\123\017\260\247\325\073\015\261\212\242\003 -\336\061\255\314\167\352\157\173\076\326\337\221\042\022\346\276 -\372\330\062\374\020\143\024\121\162\336\135\326\026\223\275\051 -\150\063\357\072\146\354\007\212\046\337\023\327\127\145\170\047 -\336\136\111\024\000\242\000\177\232\250\041\266\251\261\225\260 -\245\271\015\026\021\332\307\154\110\074\100\340\176\015\132\315 -\126\074\321\227\005\271\313\113\355\071\113\234\304\077\322\125 -\023\156\044\260\326\161\372\364\301\272\314\355\033\365\376\201 -\101\330\000\230\075\072\310\256\172\230\067\030\005\225\002\003 -\001\000\001\243\102\060\100\060\016\006\003\125\035\017\001\001 -\377\004\004\003\002\001\206\060\017\006\003\125\035\023\001\001 -\377\004\005\060\003\001\001\377\060\035\006\003\125\035\016\004 -\026\004\024\344\257\053\046\161\032\053\110\047\205\057\122\146 -\054\357\360\211\023\161\076\060\015\006\011\052\206\110\206\367 -\015\001\001\014\005\000\003\202\002\001\000\237\252\102\046\333 -\013\233\276\377\036\226\222\056\076\242\145\112\152\230\272\042 -\313\175\301\072\330\202\012\006\306\366\245\336\300\116\207\146 -\171\241\371\246\130\234\252\371\265\346\140\347\340\350\261\036 -\102\101\063\013\067\075\316\211\160\025\312\265\044\250\317\153 -\265\322\100\041\230\317\042\064\317\073\305\042\204\340\305\016 -\212\174\135\210\344\065\044\316\233\076\032\124\036\156\333\262 -\207\247\374\363\372\201\125\024\142\012\131\251\042\005\061\076 -\202\326\356\333\127\064\274\063\225\323\027\033\350\047\242\213 -\173\116\046\032\172\132\144\266\321\254\067\361\375\240\363\070 -\354\162\360\021\165\235\313\064\122\215\346\166\153\027\306\337 -\206\253\047\216\111\053\165\146\201\020\041\246\352\076\364\256 -\045\377\174\025\336\316\214\045\077\312\142\160\012\367\057\011 -\146\007\310\077\034\374\360\333\105\060\337\142\210\301\265\017 -\235\303\237\112\336\131\131\107\305\207\042\066\346\202\247\355 -\012\271\342\007\240\215\173\172\112\074\161\322\342\003\241\037 -\062\007\335\033\344\102\316\014\000\105\141\200\265\013\040\131 -\051\170\275\371\125\313\143\305\074\114\364\266\377\333\152\137 -\061\153\231\236\054\301\153\120\244\327\346\030\024\275\205\077 -\147\253\106\237\240\377\102\247\072\177\134\313\135\260\160\035 -\053\064\365\324\166\011\014\353\170\114\131\005\363\063\102\303 -\141\025\020\033\167\115\316\042\214\324\205\362\105\175\267\123 -\352\357\100\132\224\012\134\040\137\116\100\135\142\042\166\337 -\377\316\141\275\214\043\170\322\067\002\340\216\336\321\021\067 -\211\366\277\355\111\007\142\256\222\354\100\032\257\024\011\331 -\320\116\262\242\367\276\356\356\330\377\334\032\055\336\270\066 -\161\342\374\171\267\224\045\321\110\163\133\241\065\347\263\231 -\147\165\301\031\072\053\107\116\323\102\216\375\061\310\026\146 -\332\322\014\074\333\263\216\311\241\015\200\017\173\026\167\024 -\277\377\333\011\224\262\223\274\040\130\025\351\333\161\103\363 -\336\020\303\000\334\250\052\225\266\302\326\077\220\153\166\333 -\154\376\214\274\362\160\065\014\334\231\031\065\334\327\310\106 -\143\325\066\161\256\127\373\267\202\155\334 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "GTS Root R1" -# Issuer: CN=GTS Root R1,O=Google Trust Services LLC,C=US -# Serial Number:02:03:e5:93:6f:31:b0:13:49:88:6b:a2:17 -# Subject: CN=GTS Root R1,O=Google Trust Services LLC,C=US -# Not Valid Before: Wed Jun 22 00:00:00 2016 -# Not Valid After : Sun Jun 22 00:00:00 2036 -# Fingerprint (SHA-256): D9:47:43:2A:BD:E7:B7:FA:90:FC:2E:6B:59:10:1B:12:80:E0:E1:C7:E4:E4:0F:A3:C6:88:7F:FF:57:A7:F4:CF -# Fingerprint (SHA1): E5:8C:1C:C4:91:3B:38:63:4B:E9:10:6E:E3:AD:8E:6B:9D:D9:81:4A -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "GTS Root R1" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\345\214\034\304\221\073\070\143\113\351\020\156\343\255\216\153 -\235\331\201\112 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\005\376\320\277\161\250\243\166\143\332\001\340\330\122\334\100 -END -CKA_ISSUER MULTILINE_OCTAL -\060\107\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\042\060\040\006\003\125\004\012\023\031\107\157\157\147\154\145 -\040\124\162\165\163\164\040\123\145\162\166\151\143\145\163\040 -\114\114\103\061\024\060\022\006\003\125\004\003\023\013\107\124 -\123\040\122\157\157\164\040\122\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\015\002\003\345\223\157\061\260\023\111\210\153\242\027 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "GTS Root R2" -# -# Issuer: CN=GTS Root R2,O=Google Trust Services LLC,C=US -# Serial Number:02:03:e5:ae:c5:8d:04:25:1a:ab:11:25:aa -# Subject: CN=GTS Root R2,O=Google Trust Services LLC,C=US -# Not Valid Before: Wed Jun 22 00:00:00 2016 -# Not Valid After : Sun Jun 22 00:00:00 2036 -# Fingerprint (SHA-256): 8D:25:CD:97:22:9D:BF:70:35:6B:DA:4E:B3:CC:73:40:31:E2:4C:F0:0F:AF:CF:D3:2D:C7:6E:B5:84:1C:7E:A8 -# Fingerprint (SHA1): 9A:44:49:76:32:DB:DE:FA:D0:BC:FB:5A:7B:17:BD:9E:56:09:24:94 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "GTS Root R2" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\107\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\042\060\040\006\003\125\004\012\023\031\107\157\157\147\154\145 -\040\124\162\165\163\164\040\123\145\162\166\151\143\145\163\040 -\114\114\103\061\024\060\022\006\003\125\004\003\023\013\107\124 -\123\040\122\157\157\164\040\122\062 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\107\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\042\060\040\006\003\125\004\012\023\031\107\157\157\147\154\145 -\040\124\162\165\163\164\040\123\145\162\166\151\143\145\163\040 -\114\114\103\061\024\060\022\006\003\125\004\003\023\013\107\124 -\123\040\122\157\157\164\040\122\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\015\002\003\345\256\305\215\004\045\032\253\021\045\252 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\127\060\202\003\077\240\003\002\001\002\002\015\002 -\003\345\256\305\215\004\045\032\253\021\045\252\060\015\006\011 -\052\206\110\206\367\015\001\001\014\005\000\060\107\061\013\060 -\011\006\003\125\004\006\023\002\125\123\061\042\060\040\006\003 -\125\004\012\023\031\107\157\157\147\154\145\040\124\162\165\163 -\164\040\123\145\162\166\151\143\145\163\040\114\114\103\061\024 -\060\022\006\003\125\004\003\023\013\107\124\123\040\122\157\157 -\164\040\122\062\060\036\027\015\061\066\060\066\062\062\060\060 -\060\060\060\060\132\027\015\063\066\060\066\062\062\060\060\060 -\060\060\060\132\060\107\061\013\060\011\006\003\125\004\006\023 -\002\125\123\061\042\060\040\006\003\125\004\012\023\031\107\157 -\157\147\154\145\040\124\162\165\163\164\040\123\145\162\166\151 -\143\145\163\040\114\114\103\061\024\060\022\006\003\125\004\003 -\023\013\107\124\123\040\122\157\157\164\040\122\062\060\202\002 -\042\060\015\006\011\052\206\110\206\367\015\001\001\001\005\000 -\003\202\002\017\000\060\202\002\012\002\202\002\001\000\316\336 -\375\246\373\354\354\024\064\074\007\006\132\154\131\367\031\065 -\335\367\301\235\125\252\323\315\073\244\223\162\357\012\372\155 -\235\366\360\205\200\133\241\110\122\237\071\305\267\356\050\254 -\357\313\166\150\024\271\337\255\001\154\231\037\304\042\035\237 -\376\162\167\340\054\133\257\344\004\277\117\162\240\032\064\230 -\350\071\150\354\225\045\173\166\241\346\151\271\205\031\275\211 -\214\376\255\355\066\352\163\274\377\203\342\313\175\301\322\316 -\112\263\215\005\236\213\111\223\337\301\133\320\156\136\360\056 -\060\056\202\374\372\274\264\027\012\110\345\210\233\305\233\153 -\336\260\312\264\003\360\332\364\220\270\145\144\367\134\114\255 -\350\176\146\136\231\327\270\302\076\310\320\023\235\255\356\344 -\105\173\211\125\367\212\037\142\122\204\022\263\302\100\227\343 -\212\037\107\221\246\164\132\322\370\261\143\050\020\270\263\011 -\270\126\167\100\242\046\230\171\306\376\337\045\356\076\345\240 -\177\324\141\017\121\113\074\077\214\332\341\160\164\330\302\150 -\241\371\301\014\351\241\342\177\273\125\074\166\006\356\152\116 -\314\222\210\060\115\232\275\117\013\110\232\204\265\230\243\325 -\373\163\301\127\141\335\050\126\165\023\256\207\216\347\014\121 -\011\020\165\210\114\274\215\371\173\074\324\042\110\037\052\334 -\353\153\273\104\261\313\063\161\062\106\257\255\112\361\214\350 -\164\072\254\347\032\042\163\200\322\060\367\045\102\307\042\073 -\073\022\255\226\056\306\303\166\007\252\040\267\065\111\127\351 -\222\111\350\166\026\162\061\147\053\226\176\212\243\307\224\126 -\042\277\152\113\176\001\041\262\043\062\337\344\232\104\155\131 -\133\135\365\000\240\034\233\306\170\227\215\220\377\233\310\252 -\264\257\021\121\071\136\331\373\147\255\325\133\021\235\062\232 -\033\275\325\272\133\245\311\313\045\151\123\125\047\134\340\312 -\066\313\210\141\373\036\267\320\313\356\026\373\323\246\114\336 -\222\245\324\342\337\365\006\124\336\056\235\113\264\223\060\252 -\201\316\335\032\334\121\163\015\117\160\351\345\266\026\041\031 -\171\262\346\211\013\165\144\312\325\253\274\011\301\030\241\377 -\324\124\241\205\074\375\024\044\003\262\207\323\244\267\002\003 -\001\000\001\243\102\060\100\060\016\006\003\125\035\017\001\001 -\377\004\004\003\002\001\206\060\017\006\003\125\035\023\001\001 -\377\004\005\060\003\001\001\377\060\035\006\003\125\035\016\004 -\026\004\024\273\377\312\216\043\237\117\231\312\333\342\150\246 -\245\025\047\027\036\331\016\060\015\006\011\052\206\110\206\367 -\015\001\001\014\005\000\003\202\002\001\000\037\312\316\335\307 -\276\241\237\331\047\114\013\334\027\230\021\152\210\336\075\346 -\161\126\162\262\236\032\116\234\325\053\230\044\135\233\153\173 -\260\063\202\011\275\337\045\106\352\230\236\266\033\376\203\074 -\322\142\141\301\004\355\316\340\305\311\310\023\023\125\347\250 -\143\255\214\173\001\376\167\060\341\316\150\233\005\370\022\356 -\171\061\240\101\105\065\050\012\161\244\044\117\214\334\074\202 -\007\137\146\334\175\020\376\014\141\263\005\225\356\341\256\201 -\017\250\370\307\217\115\250\043\002\046\153\035\203\122\125\316 -\265\057\000\312\200\100\340\341\164\254\140\365\207\200\235\256 -\066\144\221\135\260\150\030\352\212\141\311\167\250\227\304\311 -\307\245\374\125\113\363\360\177\271\145\075\047\150\320\314\153 -\372\123\235\341\221\032\311\135\032\226\155\062\207\355\003\040 -\310\002\316\132\276\331\352\375\262\115\304\057\033\337\137\172 -\365\370\213\306\356\061\072\045\121\125\147\215\144\062\173\351 -\236\303\202\272\052\055\351\036\264\340\110\006\242\374\147\257 -\037\042\002\163\373\040\012\257\235\124\113\241\315\377\140\107 -\260\077\135\357\033\126\275\227\041\226\055\012\321\136\235\070 -\002\107\154\271\364\366\043\045\270\240\152\232\053\167\010\372 -\304\261\050\220\046\130\010\074\342\176\252\327\075\157\272\061 -\210\012\005\353\047\265\241\111\356\240\105\124\173\346\047\145 -\231\040\041\250\243\274\373\030\226\273\122\157\014\355\203\121 -\114\351\131\342\040\140\305\302\145\222\202\214\363\020\037\016 -\212\227\276\167\202\155\077\217\035\135\274\111\047\275\314\117 -\017\341\316\166\206\004\043\305\300\214\022\133\375\333\204\240 -\044\361\110\377\144\174\320\276\134\026\321\357\231\255\300\037 -\373\313\256\274\070\042\006\046\144\332\332\227\016\077\050\025 -\104\250\117\000\312\360\232\314\317\164\152\264\076\074\353\225 -\354\265\323\132\330\201\231\351\103\030\067\353\263\273\321\130 -\142\101\363\146\322\217\252\170\225\124\040\303\132\056\164\053 -\325\321\276\030\151\300\254\325\244\317\071\272\121\204\003\145 -\351\142\300\142\376\330\115\125\226\342\320\021\372\110\064\021 -\354\236\355\005\035\344\310\326\035\206\313 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "GTS Root R2" -# Issuer: CN=GTS Root R2,O=Google Trust Services LLC,C=US -# Serial Number:02:03:e5:ae:c5:8d:04:25:1a:ab:11:25:aa -# Subject: CN=GTS Root R2,O=Google Trust Services LLC,C=US -# Not Valid Before: Wed Jun 22 00:00:00 2016 -# Not Valid After : Sun Jun 22 00:00:00 2036 -# Fingerprint (SHA-256): 8D:25:CD:97:22:9D:BF:70:35:6B:DA:4E:B3:CC:73:40:31:E2:4C:F0:0F:AF:CF:D3:2D:C7:6E:B5:84:1C:7E:A8 -# Fingerprint (SHA1): 9A:44:49:76:32:DB:DE:FA:D0:BC:FB:5A:7B:17:BD:9E:56:09:24:94 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "GTS Root R2" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\232\104\111\166\062\333\336\372\320\274\373\132\173\027\275\236 -\126\011\044\224 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\036\071\300\123\346\036\051\202\013\312\122\125\066\135\127\334 -END -CKA_ISSUER MULTILINE_OCTAL -\060\107\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\042\060\040\006\003\125\004\012\023\031\107\157\157\147\154\145 -\040\124\162\165\163\164\040\123\145\162\166\151\143\145\163\040 -\114\114\103\061\024\060\022\006\003\125\004\003\023\013\107\124 -\123\040\122\157\157\164\040\122\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\015\002\003\345\256\305\215\004\045\032\253\021\045\252 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "GTS Root R3" -# -# Issuer: CN=GTS Root R3,O=Google Trust Services LLC,C=US -# Serial Number:02:03:e5:b8:82:eb:20:f8:25:27:6d:3d:66 -# Subject: CN=GTS Root R3,O=Google Trust Services LLC,C=US -# Not Valid Before: Wed Jun 22 00:00:00 2016 -# Not Valid After : Sun Jun 22 00:00:00 2036 -# Fingerprint (SHA-256): 34:D8:A7:3E:E2:08:D9:BC:DB:0D:95:65:20:93:4B:4E:40:E6:94:82:59:6E:8B:6F:73:C8:42:6B:01:0A:6F:48 -# Fingerprint (SHA1): ED:E5:71:80:2B:C8:92:B9:5B:83:3C:D2:32:68:3F:09:CD:A0:1E:46 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "GTS Root R3" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\107\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\042\060\040\006\003\125\004\012\023\031\107\157\157\147\154\145 -\040\124\162\165\163\164\040\123\145\162\166\151\143\145\163\040 -\114\114\103\061\024\060\022\006\003\125\004\003\023\013\107\124 -\123\040\122\157\157\164\040\122\063 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\107\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\042\060\040\006\003\125\004\012\023\031\107\157\157\147\154\145 -\040\124\162\165\163\164\040\123\145\162\166\151\143\145\163\040 -\114\114\103\061\024\060\022\006\003\125\004\003\023\013\107\124 -\123\040\122\157\157\164\040\122\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\015\002\003\345\270\202\353\040\370\045\047\155\075\146 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\011\060\202\001\216\240\003\002\001\002\002\015\002 -\003\345\270\202\353\040\370\045\047\155\075\146\060\012\006\010 -\052\206\110\316\075\004\003\003\060\107\061\013\060\011\006\003 -\125\004\006\023\002\125\123\061\042\060\040\006\003\125\004\012 -\023\031\107\157\157\147\154\145\040\124\162\165\163\164\040\123 -\145\162\166\151\143\145\163\040\114\114\103\061\024\060\022\006 -\003\125\004\003\023\013\107\124\123\040\122\157\157\164\040\122 -\063\060\036\027\015\061\066\060\066\062\062\060\060\060\060\060 -\060\132\027\015\063\066\060\066\062\062\060\060\060\060\060\060 -\132\060\107\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\042\060\040\006\003\125\004\012\023\031\107\157\157\147\154 -\145\040\124\162\165\163\164\040\123\145\162\166\151\143\145\163 -\040\114\114\103\061\024\060\022\006\003\125\004\003\023\013\107 -\124\123\040\122\157\157\164\040\122\063\060\166\060\020\006\007 -\052\206\110\316\075\002\001\006\005\053\201\004\000\042\003\142 -\000\004\037\117\063\207\063\051\212\241\204\336\313\307\041\130 -\101\211\352\126\235\053\113\205\306\035\114\047\274\177\046\121 -\162\157\342\237\326\243\312\314\105\024\106\213\255\357\176\206 -\214\354\261\176\057\377\251\161\235\030\204\105\004\101\125\156 -\053\352\046\177\273\220\001\343\113\031\272\344\124\226\105\011 -\261\325\154\221\104\255\204\023\216\232\214\015\200\014\062\366 -\340\047\243\102\060\100\060\016\006\003\125\035\017\001\001\377 -\004\004\003\002\001\206\060\017\006\003\125\035\023\001\001\377 -\004\005\060\003\001\001\377\060\035\006\003\125\035\016\004\026 -\004\024\301\361\046\272\240\055\256\205\201\317\323\361\052\022 -\275\270\012\147\375\274\060\012\006\010\052\206\110\316\075\004 -\003\003\003\151\000\060\146\002\061\000\366\341\040\225\024\173 -\124\243\220\026\021\277\204\310\352\157\153\027\236\036\106\230 -\040\233\237\323\015\331\254\323\057\315\174\370\133\056\125\273 -\277\335\222\367\244\014\334\061\341\242\002\061\000\374\227\146 -\146\345\103\026\023\203\335\307\337\057\276\024\070\355\001\316 -\261\027\032\021\165\351\275\003\217\046\176\204\345\311\140\246 -\225\327\124\131\267\347\021\054\211\324\271\356\027 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "GTS Root R3" -# Issuer: CN=GTS Root R3,O=Google Trust Services LLC,C=US -# Serial Number:02:03:e5:b8:82:eb:20:f8:25:27:6d:3d:66 -# Subject: CN=GTS Root R3,O=Google Trust Services LLC,C=US -# Not Valid Before: Wed Jun 22 00:00:00 2016 -# Not Valid After : Sun Jun 22 00:00:00 2036 -# Fingerprint (SHA-256): 34:D8:A7:3E:E2:08:D9:BC:DB:0D:95:65:20:93:4B:4E:40:E6:94:82:59:6E:8B:6F:73:C8:42:6B:01:0A:6F:48 -# Fingerprint (SHA1): ED:E5:71:80:2B:C8:92:B9:5B:83:3C:D2:32:68:3F:09:CD:A0:1E:46 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "GTS Root R3" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\355\345\161\200\053\310\222\271\133\203\074\322\062\150\077\011 -\315\240\036\106 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\076\347\235\130\002\224\106\121\224\345\340\042\112\213\347\163 -END -CKA_ISSUER MULTILINE_OCTAL -\060\107\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\042\060\040\006\003\125\004\012\023\031\107\157\157\147\154\145 -\040\124\162\165\163\164\040\123\145\162\166\151\143\145\163\040 -\114\114\103\061\024\060\022\006\003\125\004\003\023\013\107\124 -\123\040\122\157\157\164\040\122\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\015\002\003\345\270\202\353\040\370\045\047\155\075\146 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "GTS Root R4" -# -# Issuer: CN=GTS Root R4,O=Google Trust Services LLC,C=US -# Serial Number:02:03:e5:c0:68:ef:63:1a:9c:72:90:50:52 -# Subject: CN=GTS Root R4,O=Google Trust Services LLC,C=US -# Not Valid Before: Wed Jun 22 00:00:00 2016 -# Not Valid After : Sun Jun 22 00:00:00 2036 -# Fingerprint (SHA-256): 34:9D:FA:40:58:C5:E2:63:12:3B:39:8A:E7:95:57:3C:4E:13:13:C8:3F:E6:8F:93:55:6C:D5:E8:03:1B:3C:7D -# Fingerprint (SHA1): 77:D3:03:67:B5:E0:0C:15:F6:0C:38:61:DF:7C:E1:3B:92:46:4D:47 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "GTS Root R4" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\107\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\042\060\040\006\003\125\004\012\023\031\107\157\157\147\154\145 -\040\124\162\165\163\164\040\123\145\162\166\151\143\145\163\040 -\114\114\103\061\024\060\022\006\003\125\004\003\023\013\107\124 -\123\040\122\157\157\164\040\122\064 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\107\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\042\060\040\006\003\125\004\012\023\031\107\157\157\147\154\145 -\040\124\162\165\163\164\040\123\145\162\166\151\143\145\163\040 -\114\114\103\061\024\060\022\006\003\125\004\003\023\013\107\124 -\123\040\122\157\157\164\040\122\064 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\015\002\003\345\300\150\357\143\032\234\162\220\120\122 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\011\060\202\001\216\240\003\002\001\002\002\015\002 -\003\345\300\150\357\143\032\234\162\220\120\122\060\012\006\010 -\052\206\110\316\075\004\003\003\060\107\061\013\060\011\006\003 -\125\004\006\023\002\125\123\061\042\060\040\006\003\125\004\012 -\023\031\107\157\157\147\154\145\040\124\162\165\163\164\040\123 -\145\162\166\151\143\145\163\040\114\114\103\061\024\060\022\006 -\003\125\004\003\023\013\107\124\123\040\122\157\157\164\040\122 -\064\060\036\027\015\061\066\060\066\062\062\060\060\060\060\060 -\060\132\027\015\063\066\060\066\062\062\060\060\060\060\060\060 -\132\060\107\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\042\060\040\006\003\125\004\012\023\031\107\157\157\147\154 -\145\040\124\162\165\163\164\040\123\145\162\166\151\143\145\163 -\040\114\114\103\061\024\060\022\006\003\125\004\003\023\013\107 -\124\123\040\122\157\157\164\040\122\064\060\166\060\020\006\007 -\052\206\110\316\075\002\001\006\005\053\201\004\000\042\003\142 -\000\004\363\164\163\247\150\213\140\256\103\270\065\305\201\060 -\173\113\111\235\373\301\141\316\346\336\106\275\153\325\141\030 -\065\256\100\335\163\367\211\221\060\132\353\074\356\205\174\242 -\100\166\073\251\306\270\107\330\052\347\222\221\152\163\351\261 -\162\071\237\051\237\242\230\323\137\136\130\206\145\017\241\204 -\145\006\321\334\213\311\307\163\310\214\152\057\345\304\253\321 -\035\212\243\102\060\100\060\016\006\003\125\035\017\001\001\377 -\004\004\003\002\001\206\060\017\006\003\125\035\023\001\001\377 -\004\005\060\003\001\001\377\060\035\006\003\125\035\016\004\026 -\004\024\200\114\326\353\164\377\111\066\243\325\330\374\265\076 -\305\152\360\224\035\214\060\012\006\010\052\206\110\316\075\004 -\003\003\003\151\000\060\146\002\061\000\350\100\377\203\336\003 -\364\237\256\035\172\247\056\271\257\117\366\203\035\016\055\205 -\001\035\321\331\152\354\017\302\257\307\136\126\136\134\325\034 -\130\042\050\013\367\060\266\057\261\174\002\061\000\360\141\074 -\247\364\240\202\343\041\325\204\035\163\206\234\055\257\312\064 -\233\361\237\271\043\066\342\274\140\003\235\200\263\232\126\310 -\341\342\273\024\171\312\315\041\324\224\265\111\103 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "GTS Root R4" -# Issuer: CN=GTS Root R4,O=Google Trust Services LLC,C=US -# Serial Number:02:03:e5:c0:68:ef:63:1a:9c:72:90:50:52 -# Subject: CN=GTS Root R4,O=Google Trust Services LLC,C=US -# Not Valid Before: Wed Jun 22 00:00:00 2016 -# Not Valid After : Sun Jun 22 00:00:00 2036 -# Fingerprint (SHA-256): 34:9D:FA:40:58:C5:E2:63:12:3B:39:8A:E7:95:57:3C:4E:13:13:C8:3F:E6:8F:93:55:6C:D5:E8:03:1B:3C:7D -# Fingerprint (SHA1): 77:D3:03:67:B5:E0:0C:15:F6:0C:38:61:DF:7C:E1:3B:92:46:4D:47 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "GTS Root R4" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\167\323\003\147\265\340\014\025\366\014\070\141\337\174\341\073 -\222\106\115\107 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\103\226\203\167\031\115\166\263\235\145\122\344\035\042\245\350 -END -CKA_ISSUER MULTILINE_OCTAL -\060\107\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\042\060\040\006\003\125\004\012\023\031\107\157\157\147\154\145 -\040\124\162\165\163\164\040\123\145\162\166\151\143\145\163\040 -\114\114\103\061\024\060\022\006\003\125\004\003\023\013\107\124 -\123\040\122\157\157\164\040\122\064 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\015\002\003\345\300\150\357\143\032\234\162\220\120\122 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Telia Root CA v2" -# -# Issuer: CN=Telia Root CA v2,O=Telia Finland Oyj,C=FI -# Serial Number:01:67:5f:27:d6:fe:7a:e3:e4:ac:be:09:5b:05:9e -# Subject: CN=Telia Root CA v2,O=Telia Finland Oyj,C=FI -# Not Valid Before: Thu Nov 29 11:55:54 2018 -# Not Valid After : Sun Nov 29 11:55:54 2043 -# Fingerprint (SHA-256): 24:2B:69:74:2F:CB:1E:5B:2A:BF:98:89:8B:94:57:21:87:54:4E:5B:4D:99:11:78:65:73:62:1F:6A:74:B8:2C -# Fingerprint (SHA1): B9:99:CD:D1:73:50:8A:C4:47:05:08:9C:8C:88:FB:BE:A0:2B:40:CD -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Telia Root CA v2" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\104\061\013\060\011\006\003\125\004\006\023\002\106\111\061 -\032\060\030\006\003\125\004\012\014\021\124\145\154\151\141\040 -\106\151\156\154\141\156\144\040\117\171\152\061\031\060\027\006 -\003\125\004\003\014\020\124\145\154\151\141\040\122\157\157\164 -\040\103\101\040\166\062 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\104\061\013\060\011\006\003\125\004\006\023\002\106\111\061 -\032\060\030\006\003\125\004\012\014\021\124\145\154\151\141\040 -\106\151\156\154\141\156\144\040\117\171\152\061\031\060\027\006 -\003\125\004\003\014\020\124\145\154\151\141\040\122\157\157\164 -\040\103\101\040\166\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\017\001\147\137\047\326\376\172\343\344\254\276\011\133\005 -\236 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\164\060\202\003\134\240\003\002\001\002\002\017\001 -\147\137\047\326\376\172\343\344\254\276\011\133\005\236\060\015 -\006\011\052\206\110\206\367\015\001\001\013\005\000\060\104\061 -\013\060\011\006\003\125\004\006\023\002\106\111\061\032\060\030 -\006\003\125\004\012\014\021\124\145\154\151\141\040\106\151\156 -\154\141\156\144\040\117\171\152\061\031\060\027\006\003\125\004 -\003\014\020\124\145\154\151\141\040\122\157\157\164\040\103\101 -\040\166\062\060\036\027\015\061\070\061\061\062\071\061\061\065 -\065\065\064\132\027\015\064\063\061\061\062\071\061\061\065\065 -\065\064\132\060\104\061\013\060\011\006\003\125\004\006\023\002 -\106\111\061\032\060\030\006\003\125\004\012\014\021\124\145\154 -\151\141\040\106\151\156\154\141\156\144\040\117\171\152\061\031 -\060\027\006\003\125\004\003\014\020\124\145\154\151\141\040\122 -\157\157\164\040\103\101\040\166\062\060\202\002\042\060\015\006 -\011\052\206\110\206\367\015\001\001\001\005\000\003\202\002\017 -\000\060\202\002\012\002\202\002\001\000\262\320\077\007\274\342 -\173\320\153\231\370\342\167\151\347\316\235\244\003\274\202\155 -\241\376\201\145\037\114\047\254\216\000\272\026\173\353\060\152 -\000\300\263\164\150\176\262\257\307\325\142\263\172\077\120\312 -\214\066\104\044\143\322\066\351\014\205\366\103\166\325\114\241 -\140\162\147\342\050\063\245\313\061\270\072\042\043\064\270\175 -\275\126\042\100\235\352\364\173\003\255\150\374\262\201\117\230 -\320\164\352\215\345\175\315\143\303\243\366\336\222\302\130\031 -\340\226\273\305\304\251\075\245\164\226\376\257\371\211\252\275 -\225\027\124\330\170\104\361\014\167\025\222\340\230\102\247\244 -\326\252\040\222\315\301\240\263\226\262\072\204\102\215\175\325 -\225\344\326\333\351\142\304\130\263\171\305\214\323\065\063\203 -\237\165\241\122\047\141\070\361\131\075\216\120\340\275\171\074 -\347\154\226\376\136\331\002\145\264\216\134\320\021\064\337\135 -\277\122\247\201\000\303\177\231\105\231\025\325\027\310\012\123 -\354\143\363\231\175\314\151\022\206\302\027\360\001\236\277\204 -\274\321\122\313\033\222\146\316\244\123\345\241\277\304\333\011 -\326\346\211\126\053\310\343\174\336\343\377\211\345\065\156\050 -\350\154\013\043\121\251\045\005\353\110\370\335\261\312\372\154 -\010\121\357\267\030\154\104\312\046\341\163\306\211\006\201\345 -\212\254\260\342\051\306\271\044\263\153\104\021\364\245\103\302 -\114\103\345\160\066\214\266\063\127\172\225\056\202\240\364\134 -\020\263\141\203\366\002\005\206\056\174\055\154\334\003\106\156 -\065\223\325\172\225\057\336\040\330\133\176\224\220\004\152\272 -\131\075\004\005\165\235\067\242\016\056\075\353\301\244\122\203 -\376\320\153\324\146\216\334\306\351\022\116\035\052\127\252\020 -\274\174\136\202\175\246\246\311\362\055\271\365\027\047\255\321 -\016\211\124\053\225\372\300\255\035\230\024\170\063\102\206\012 -\251\163\265\373\164\015\267\033\060\031\304\132\016\034\047\267 -\332\030\320\377\212\310\005\272\361\252\034\242\067\267\346\110 -\244\106\054\224\352\250\166\142\107\213\020\123\007\110\127\154 -\342\222\115\266\256\005\313\334\301\112\136\217\254\075\031\116 -\302\355\140\165\053\333\301\312\102\325\002\003\001\000\001\243 -\143\060\141\060\037\006\003\125\035\043\004\030\060\026\200\024 -\162\254\344\063\171\252\105\207\366\375\254\035\236\326\307\057 -\206\330\044\071\060\035\006\003\125\035\016\004\026\004\024\162 -\254\344\063\171\252\105\207\366\375\254\035\236\326\307\057\206 -\330\044\071\060\016\006\003\125\035\017\001\001\377\004\004\003 -\002\001\006\060\017\006\003\125\035\023\001\001\377\004\005\060 -\003\001\001\377\060\015\006\011\052\206\110\206\367\015\001\001 -\013\005\000\003\202\002\001\000\240\073\131\247\011\224\076\066 -\204\322\176\057\071\245\226\227\372\021\255\374\147\363\161\011 -\362\262\211\204\147\104\257\271\357\355\226\354\234\144\333\062 -\060\157\147\232\254\176\137\262\253\001\066\176\201\372\344\204 -\136\322\254\066\340\153\142\305\175\113\016\202\155\322\166\142 -\321\376\227\370\237\060\174\030\371\264\122\167\202\035\166\333 -\323\035\251\360\301\232\000\275\155\165\330\175\347\372\307\070 -\243\234\160\350\106\171\003\257\056\164\333\165\370\156\123\014 -\003\310\231\032\211\065\031\074\323\311\124\174\250\360\054\346 -\156\007\171\157\152\341\346\352\221\202\151\012\035\303\176\131 -\242\236\153\106\025\230\133\323\257\106\035\142\310\316\200\122 -\111\021\077\311\004\022\303\023\174\077\073\212\226\333\074\240 -\036\012\264\213\124\262\044\147\015\357\202\313\276\074\175\321 -\342\177\256\026\326\126\130\271\332\040\261\203\025\241\357\212 -\115\062\157\101\057\023\122\202\224\327\032\301\170\242\121\335 -\053\160\155\267\032\371\367\260\340\147\227\126\333\174\141\123 -\011\003\050\002\100\307\263\330\375\234\160\152\306\050\303\205 -\351\342\355\032\223\240\336\113\230\242\204\076\005\167\001\226 -\075\373\264\040\017\234\162\002\172\022\057\325\243\272\121\170 -\257\052\053\104\145\116\265\375\012\350\301\315\171\207\141\053 -\336\200\127\105\277\147\361\233\221\136\245\244\354\131\110\020 -\015\070\307\260\372\303\104\155\004\365\170\120\034\222\226\133 -\332\365\270\056\272\133\317\345\360\152\235\113\057\130\163\055 -\117\055\304\034\076\364\263\077\253\025\016\073\031\101\212\244 -\301\127\022\146\161\114\372\123\343\127\353\142\225\011\236\124 -\335\321\302\074\127\074\275\070\255\230\144\267\270\003\232\123 -\126\140\135\263\330\102\033\134\113\022\212\034\353\353\175\306 -\172\151\307\047\177\244\370\213\362\344\224\146\207\113\351\224 -\007\011\022\171\212\262\353\164\004\334\316\364\104\131\340\026 -\312\305\054\130\327\074\173\317\142\206\152\120\175\065\066\146 -\247\373\067\347\050\307\330\320\255\245\151\224\217\350\301\337 -\044\370\033\007\061\207\201\330\135\366\350\050\330\112\122\200 -\254\023\356\120\024\036\230\307 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Telia Root CA v2" -# Issuer: CN=Telia Root CA v2,O=Telia Finland Oyj,C=FI -# Serial Number:01:67:5f:27:d6:fe:7a:e3:e4:ac:be:09:5b:05:9e -# Subject: CN=Telia Root CA v2,O=Telia Finland Oyj,C=FI -# Not Valid Before: Thu Nov 29 11:55:54 2018 -# Not Valid After : Sun Nov 29 11:55:54 2043 -# Fingerprint (SHA-256): 24:2B:69:74:2F:CB:1E:5B:2A:BF:98:89:8B:94:57:21:87:54:4E:5B:4D:99:11:78:65:73:62:1F:6A:74:B8:2C -# Fingerprint (SHA1): B9:99:CD:D1:73:50:8A:C4:47:05:08:9C:8C:88:FB:BE:A0:2B:40:CD -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Telia Root CA v2" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\271\231\315\321\163\120\212\304\107\005\010\234\214\210\373\276 -\240\053\100\315 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\016\217\254\252\202\337\205\261\364\334\020\034\374\231\331\110 -END -CKA_ISSUER MULTILINE_OCTAL -\060\104\061\013\060\011\006\003\125\004\006\023\002\106\111\061 -\032\060\030\006\003\125\004\012\014\021\124\145\154\151\141\040 -\106\151\156\154\141\156\144\040\117\171\152\061\031\060\027\006 -\003\125\004\003\014\020\124\145\154\151\141\040\122\157\157\164 -\040\103\101\040\166\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\017\001\147\137\047\326\376\172\343\344\254\276\011\133\005 -\236 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "D-TRUST BR Root CA 1 2020" -# -# Issuer: CN=D-TRUST BR Root CA 1 2020,O=D-Trust GmbH,C=DE -# Serial Number:7c:c9:8f:2b:84:d7:df:ea:0f:c9:65:9a:d3:4b:4d:96 -# Subject: CN=D-TRUST BR Root CA 1 2020,O=D-Trust GmbH,C=DE -# Not Valid Before: Tue Feb 11 09:45:00 2020 -# Not Valid After : Sun Feb 11 09:44:59 2035 -# Fingerprint (SHA-256): E5:9A:AA:81:60:09:C2:2B:FF:5B:25:BA:D3:7D:F3:06:F0:49:79:7C:1F:81:D8:5A:B0:89:E6:57:BD:8F:00:44 -# Fingerprint (SHA1): 1F:5B:98:F0:E3:B5:F7:74:3C:ED:E6:B0:36:7D:32:CD:F4:09:41:67 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "D-TRUST BR Root CA 1 2020" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\110\061\013\060\011\006\003\125\004\006\023\002\104\105\061 -\025\060\023\006\003\125\004\012\023\014\104\055\124\162\165\163 -\164\040\107\155\142\110\061\042\060\040\006\003\125\004\003\023 -\031\104\055\124\122\125\123\124\040\102\122\040\122\157\157\164 -\040\103\101\040\061\040\062\060\062\060 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\110\061\013\060\011\006\003\125\004\006\023\002\104\105\061 -\025\060\023\006\003\125\004\012\023\014\104\055\124\162\165\163 -\164\040\107\155\142\110\061\042\060\040\006\003\125\004\003\023 -\031\104\055\124\122\125\123\124\040\102\122\040\122\157\157\164 -\040\103\101\040\061\040\062\060\062\060 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\174\311\217\053\204\327\337\352\017\311\145\232\323\113 -\115\226 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\333\060\202\002\140\240\003\002\001\002\002\020\174 -\311\217\053\204\327\337\352\017\311\145\232\323\113\115\226\060 -\012\006\010\052\206\110\316\075\004\003\003\060\110\061\013\060 -\011\006\003\125\004\006\023\002\104\105\061\025\060\023\006\003 -\125\004\012\023\014\104\055\124\162\165\163\164\040\107\155\142 -\110\061\042\060\040\006\003\125\004\003\023\031\104\055\124\122 -\125\123\124\040\102\122\040\122\157\157\164\040\103\101\040\061 -\040\062\060\062\060\060\036\027\015\062\060\060\062\061\061\060 -\071\064\065\060\060\132\027\015\063\065\060\062\061\061\060\071 -\064\064\065\071\132\060\110\061\013\060\011\006\003\125\004\006 -\023\002\104\105\061\025\060\023\006\003\125\004\012\023\014\104 -\055\124\162\165\163\164\040\107\155\142\110\061\042\060\040\006 -\003\125\004\003\023\031\104\055\124\122\125\123\124\040\102\122 -\040\122\157\157\164\040\103\101\040\061\040\062\060\062\060\060 -\166\060\020\006\007\052\206\110\316\075\002\001\006\005\053\201 -\004\000\042\003\142\000\004\306\313\307\050\321\373\204\365\232 -\357\102\024\040\341\103\153\156\165\255\374\053\003\204\324\166 -\223\045\327\131\073\101\145\153\036\346\064\052\273\164\366\022 -\316\350\155\347\253\344\074\116\077\104\010\213\315\026\161\313 -\277\222\231\364\244\327\074\120\124\122\220\205\203\170\224\147 -\147\243\034\011\031\075\165\064\205\336\355\140\175\307\014\264 -\101\122\271\156\345\356\102\243\202\001\015\060\202\001\011\060 -\017\006\003\125\035\023\001\001\377\004\005\060\003\001\001\377 -\060\035\006\003\125\035\016\004\026\004\024\163\221\020\253\377 -\125\263\132\174\011\045\325\262\272\010\240\153\253\037\155\060 -\016\006\003\125\035\017\001\001\377\004\004\003\002\001\006\060 -\201\306\006\003\125\035\037\004\201\276\060\201\273\060\076\240 -\074\240\072\206\070\150\164\164\160\072\057\057\143\162\154\056 -\144\055\164\162\165\163\164\056\156\145\164\057\143\162\154\057 -\144\055\164\162\165\163\164\137\142\162\137\162\157\157\164\137 -\143\141\137\061\137\062\060\062\060\056\143\162\154\060\171\240 -\167\240\165\206\163\154\144\141\160\072\057\057\144\151\162\145 -\143\164\157\162\171\056\144\055\164\162\165\163\164\056\156\145 -\164\057\103\116\075\104\055\124\122\125\123\124\045\062\060\102 -\122\045\062\060\122\157\157\164\045\062\060\103\101\045\062\060 -\061\045\062\060\062\060\062\060\054\117\075\104\055\124\162\165 -\163\164\045\062\060\107\155\142\110\054\103\075\104\105\077\143 -\145\162\164\151\146\151\143\141\164\145\162\145\166\157\143\141 -\164\151\157\156\154\151\163\164\060\012\006\010\052\206\110\316 -\075\004\003\003\003\151\000\060\146\002\061\000\224\220\055\023 -\372\341\143\370\141\143\350\255\205\170\124\221\234\270\223\070 -\076\032\101\332\100\026\123\102\010\312\057\216\361\076\201\126 -\300\252\330\355\030\304\260\256\364\076\372\046\002\061\000\363 -\050\342\306\333\053\231\373\267\121\270\044\243\244\224\172\032 -\077\346\066\342\003\127\063\212\060\313\202\307\326\024\021\325 -\165\143\133\024\225\234\037\001\317\330\325\162\247\017\073 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "D-TRUST BR Root CA 1 2020" -# Issuer: CN=D-TRUST BR Root CA 1 2020,O=D-Trust GmbH,C=DE -# Serial Number:7c:c9:8f:2b:84:d7:df:ea:0f:c9:65:9a:d3:4b:4d:96 -# Subject: CN=D-TRUST BR Root CA 1 2020,O=D-Trust GmbH,C=DE -# Not Valid Before: Tue Feb 11 09:45:00 2020 -# Not Valid After : Sun Feb 11 09:44:59 2035 -# Fingerprint (SHA-256): E5:9A:AA:81:60:09:C2:2B:FF:5B:25:BA:D3:7D:F3:06:F0:49:79:7C:1F:81:D8:5A:B0:89:E6:57:BD:8F:00:44 -# Fingerprint (SHA1): 1F:5B:98:F0:E3:B5:F7:74:3C:ED:E6:B0:36:7D:32:CD:F4:09:41:67 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "D-TRUST BR Root CA 1 2020" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\037\133\230\360\343\265\367\164\074\355\346\260\066\175\062\315 -\364\011\101\147 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\265\252\113\325\355\367\343\125\056\217\162\012\363\165\270\355 -END -CKA_ISSUER MULTILINE_OCTAL -\060\110\061\013\060\011\006\003\125\004\006\023\002\104\105\061 -\025\060\023\006\003\125\004\012\023\014\104\055\124\162\165\163 -\164\040\107\155\142\110\061\042\060\040\006\003\125\004\003\023 -\031\104\055\124\122\125\123\124\040\102\122\040\122\157\157\164 -\040\103\101\040\061\040\062\060\062\060 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\174\311\217\053\204\327\337\352\017\311\145\232\323\113 -\115\226 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "D-TRUST EV Root CA 1 2020" -# -# Issuer: CN=D-TRUST EV Root CA 1 2020,O=D-Trust GmbH,C=DE -# Serial Number:5f:02:41:d7:7a:87:7c:4c:03:a3:ac:96:8d:fb:ff:d0 -# Subject: CN=D-TRUST EV Root CA 1 2020,O=D-Trust GmbH,C=DE -# Not Valid Before: Tue Feb 11 10:00:00 2020 -# Not Valid After : Sun Feb 11 09:59:59 2035 -# Fingerprint (SHA-256): 08:17:0D:1A:A3:64:53:90:1A:2F:95:92:45:E3:47:DB:0C:8D:37:AB:AA:BC:56:B8:1A:A1:00:DC:95:89:70:DB -# Fingerprint (SHA1): 61:DB:8C:21:59:69:03:90:D8:7C:9C:12:86:54:CF:9D:3D:F4:DD:07 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "D-TRUST EV Root CA 1 2020" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\110\061\013\060\011\006\003\125\004\006\023\002\104\105\061 -\025\060\023\006\003\125\004\012\023\014\104\055\124\162\165\163 -\164\040\107\155\142\110\061\042\060\040\006\003\125\004\003\023 -\031\104\055\124\122\125\123\124\040\105\126\040\122\157\157\164 -\040\103\101\040\061\040\062\060\062\060 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\110\061\013\060\011\006\003\125\004\006\023\002\104\105\061 -\025\060\023\006\003\125\004\012\023\014\104\055\124\162\165\163 -\164\040\107\155\142\110\061\042\060\040\006\003\125\004\003\023 -\031\104\055\124\122\125\123\124\040\105\126\040\122\157\157\164 -\040\103\101\040\061\040\062\060\062\060 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\137\002\101\327\172\207\174\114\003\243\254\226\215\373 -\377\320 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\333\060\202\002\140\240\003\002\001\002\002\020\137 -\002\101\327\172\207\174\114\003\243\254\226\215\373\377\320\060 -\012\006\010\052\206\110\316\075\004\003\003\060\110\061\013\060 -\011\006\003\125\004\006\023\002\104\105\061\025\060\023\006\003 -\125\004\012\023\014\104\055\124\162\165\163\164\040\107\155\142 -\110\061\042\060\040\006\003\125\004\003\023\031\104\055\124\122 -\125\123\124\040\105\126\040\122\157\157\164\040\103\101\040\061 -\040\062\060\062\060\060\036\027\015\062\060\060\062\061\061\061 -\060\060\060\060\060\132\027\015\063\065\060\062\061\061\060\071 -\065\071\065\071\132\060\110\061\013\060\011\006\003\125\004\006 -\023\002\104\105\061\025\060\023\006\003\125\004\012\023\014\104 -\055\124\162\165\163\164\040\107\155\142\110\061\042\060\040\006 -\003\125\004\003\023\031\104\055\124\122\125\123\124\040\105\126 -\040\122\157\157\164\040\103\101\040\061\040\062\060\062\060\060 -\166\060\020\006\007\052\206\110\316\075\002\001\006\005\053\201 -\004\000\042\003\142\000\004\361\013\335\206\103\040\031\337\227 -\205\350\042\112\233\317\235\230\277\264\005\046\311\313\343\246 -\322\217\305\236\170\173\061\211\251\211\255\047\074\145\020\202 -\374\337\303\235\116\360\063\043\304\322\062\365\034\260\337\063 -\027\135\305\360\261\212\371\357\271\267\024\312\051\112\302\017 -\251\177\165\145\111\052\060\147\364\144\367\326\032\167\332\303 -\302\227\141\102\173\111\255\243\202\001\015\060\202\001\011\060 -\017\006\003\125\035\023\001\001\377\004\005\060\003\001\001\377 -\060\035\006\003\125\035\016\004\026\004\024\177\020\001\026\067 -\072\244\050\344\120\370\244\367\354\153\062\266\376\351\213\060 -\016\006\003\125\035\017\001\001\377\004\004\003\002\001\006\060 -\201\306\006\003\125\035\037\004\201\276\060\201\273\060\076\240 -\074\240\072\206\070\150\164\164\160\072\057\057\143\162\154\056 -\144\055\164\162\165\163\164\056\156\145\164\057\143\162\154\057 -\144\055\164\162\165\163\164\137\145\166\137\162\157\157\164\137 -\143\141\137\061\137\062\060\062\060\056\143\162\154\060\171\240 -\167\240\165\206\163\154\144\141\160\072\057\057\144\151\162\145 -\143\164\157\162\171\056\144\055\164\162\165\163\164\056\156\145 -\164\057\103\116\075\104\055\124\122\125\123\124\045\062\060\105 -\126\045\062\060\122\157\157\164\045\062\060\103\101\045\062\060 -\061\045\062\060\062\060\062\060\054\117\075\104\055\124\162\165 -\163\164\045\062\060\107\155\142\110\054\103\075\104\105\077\143 -\145\162\164\151\146\151\143\141\164\145\162\145\166\157\143\141 -\164\151\157\156\154\151\163\164\060\012\006\010\052\206\110\316 -\075\004\003\003\003\151\000\060\146\002\061\000\312\074\306\052 -\165\302\136\165\142\071\066\000\140\132\213\301\223\231\314\331 -\333\101\073\073\207\231\027\073\325\314\117\312\042\367\240\200 -\313\371\264\261\033\126\365\162\322\374\031\321\002\061\000\221 -\367\060\223\077\020\106\053\161\244\320\073\104\233\300\051\002 -\005\262\101\167\121\363\171\132\236\216\024\240\116\102\322\133 -\201\363\064\152\003\347\042\070\120\133\355\031\117\103\026 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "D-TRUST EV Root CA 1 2020" -# Issuer: CN=D-TRUST EV Root CA 1 2020,O=D-Trust GmbH,C=DE -# Serial Number:5f:02:41:d7:7a:87:7c:4c:03:a3:ac:96:8d:fb:ff:d0 -# Subject: CN=D-TRUST EV Root CA 1 2020,O=D-Trust GmbH,C=DE -# Not Valid Before: Tue Feb 11 10:00:00 2020 -# Not Valid After : Sun Feb 11 09:59:59 2035 -# Fingerprint (SHA-256): 08:17:0D:1A:A3:64:53:90:1A:2F:95:92:45:E3:47:DB:0C:8D:37:AB:AA:BC:56:B8:1A:A1:00:DC:95:89:70:DB -# Fingerprint (SHA1): 61:DB:8C:21:59:69:03:90:D8:7C:9C:12:86:54:CF:9D:3D:F4:DD:07 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "D-TRUST EV Root CA 1 2020" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\141\333\214\041\131\151\003\220\330\174\234\022\206\124\317\235 -\075\364\335\007 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\214\055\235\160\237\110\231\021\006\021\373\351\313\060\300\156 -END -CKA_ISSUER MULTILINE_OCTAL -\060\110\061\013\060\011\006\003\125\004\006\023\002\104\105\061 -\025\060\023\006\003\125\004\012\023\014\104\055\124\162\165\163 -\164\040\107\155\142\110\061\042\060\040\006\003\125\004\003\023 -\031\104\055\124\122\125\123\124\040\105\126\040\122\157\157\164 -\040\103\101\040\061\040\062\060\062\060 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\137\002\101\327\172\207\174\114\003\243\254\226\215\373 -\377\320 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "DigiCert TLS ECC P384 Root G5" -# -# Issuer: CN=DigiCert TLS ECC P384 Root G5,O="DigiCert, Inc.",C=US -# Serial Number:09:e0:93:65:ac:f7:d9:c8:b9:3e:1c:0b:04:2a:2e:f3 -# Subject: CN=DigiCert TLS ECC P384 Root G5,O="DigiCert, Inc.",C=US -# Not Valid Before: Fri Jan 15 00:00:00 2021 -# Not Valid After : Sun Jan 14 23:59:59 2046 -# Fingerprint (SHA-256): 01:8E:13:F0:77:25:32:CF:80:9B:D1:B1:72:81:86:72:83:FC:48:C6:E1:3B:E9:C6:98:12:85:4A:49:0C:1B:05 -# Fingerprint (SHA1): 17:F3:DE:5E:9F:0F:19:E9:8E:F6:1F:32:26:6E:20:C4:07:AE:30:EE -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "DigiCert TLS ECC P384 Root G5" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\116\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\027\060\025\006\003\125\004\012\023\016\104\151\147\151\103\145 -\162\164\054\040\111\156\143\056\061\046\060\044\006\003\125\004 -\003\023\035\104\151\147\151\103\145\162\164\040\124\114\123\040 -\105\103\103\040\120\063\070\064\040\122\157\157\164\040\107\065 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\116\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\027\060\025\006\003\125\004\012\023\016\104\151\147\151\103\145 -\162\164\054\040\111\156\143\056\061\046\060\044\006\003\125\004 -\003\023\035\104\151\147\151\103\145\162\164\040\124\114\123\040 -\105\103\103\040\120\063\070\064\040\122\157\157\164\040\107\065 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\011\340\223\145\254\367\331\310\271\076\034\013\004\052 -\056\363 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\031\060\202\001\237\240\003\002\001\002\002\020\011 -\340\223\145\254\367\331\310\271\076\034\013\004\052\056\363\060 -\012\006\010\052\206\110\316\075\004\003\003\060\116\061\013\060 -\011\006\003\125\004\006\023\002\125\123\061\027\060\025\006\003 -\125\004\012\023\016\104\151\147\151\103\145\162\164\054\040\111 -\156\143\056\061\046\060\044\006\003\125\004\003\023\035\104\151 -\147\151\103\145\162\164\040\124\114\123\040\105\103\103\040\120 -\063\070\064\040\122\157\157\164\040\107\065\060\036\027\015\062 -\061\060\061\061\065\060\060\060\060\060\060\132\027\015\064\066 -\060\061\061\064\062\063\065\071\065\071\132\060\116\061\013\060 -\011\006\003\125\004\006\023\002\125\123\061\027\060\025\006\003 -\125\004\012\023\016\104\151\147\151\103\145\162\164\054\040\111 -\156\143\056\061\046\060\044\006\003\125\004\003\023\035\104\151 -\147\151\103\145\162\164\040\124\114\123\040\105\103\103\040\120 -\063\070\064\040\122\157\157\164\040\107\065\060\166\060\020\006 -\007\052\206\110\316\075\002\001\006\005\053\201\004\000\042\003 -\142\000\004\301\104\241\317\021\227\120\232\336\043\202\065\007 -\315\320\313\030\235\322\361\177\167\065\117\073\335\224\162\122 -\355\302\073\370\354\372\173\153\130\040\354\231\256\311\374\150 -\263\165\271\333\011\354\310\023\365\116\306\012\035\146\060\114 -\273\037\107\012\074\141\020\102\051\174\245\010\016\340\042\351 -\323\065\150\316\233\143\237\204\265\231\115\130\240\216\365\124 -\347\225\311\243\102\060\100\060\035\006\003\125\035\016\004\026 -\004\024\301\121\105\120\131\253\076\347\054\132\372\040\042\022 -\007\200\210\174\021\152\060\016\006\003\125\035\017\001\001\377 -\004\004\003\002\001\206\060\017\006\003\125\035\023\001\001\377 -\004\005\060\003\001\001\377\060\012\006\010\052\206\110\316\075 -\004\003\003\003\150\000\060\145\002\061\000\211\152\215\107\347 -\354\374\156\125\003\331\147\154\046\116\203\306\375\311\373\053 -\023\274\267\172\214\264\145\322\151\151\143\023\143\073\046\120 -\056\001\241\171\006\221\235\110\277\302\276\002\060\107\303\025 -\173\261\240\221\231\111\223\250\074\174\350\106\006\213\054\362 -\061\000\224\235\142\310\211\275\031\204\024\351\245\373\001\270 -\015\166\103\214\056\123\313\174\337\014\027\226\120 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "DigiCert TLS ECC P384 Root G5" -# Issuer: CN=DigiCert TLS ECC P384 Root G5,O="DigiCert, Inc.",C=US -# Serial Number:09:e0:93:65:ac:f7:d9:c8:b9:3e:1c:0b:04:2a:2e:f3 -# Subject: CN=DigiCert TLS ECC P384 Root G5,O="DigiCert, Inc.",C=US -# Not Valid Before: Fri Jan 15 00:00:00 2021 -# Not Valid After : Sun Jan 14 23:59:59 2046 -# Fingerprint (SHA-256): 01:8E:13:F0:77:25:32:CF:80:9B:D1:B1:72:81:86:72:83:FC:48:C6:E1:3B:E9:C6:98:12:85:4A:49:0C:1B:05 -# Fingerprint (SHA1): 17:F3:DE:5E:9F:0F:19:E9:8E:F6:1F:32:26:6E:20:C4:07:AE:30:EE -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "DigiCert TLS ECC P384 Root G5" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\027\363\336\136\237\017\031\351\216\366\037\062\046\156\040\304 -\007\256\060\356 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\323\161\004\152\103\034\333\246\131\341\250\243\252\305\161\355 -END -CKA_ISSUER MULTILINE_OCTAL -\060\116\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\027\060\025\006\003\125\004\012\023\016\104\151\147\151\103\145 -\162\164\054\040\111\156\143\056\061\046\060\044\006\003\125\004 -\003\023\035\104\151\147\151\103\145\162\164\040\124\114\123\040 -\105\103\103\040\120\063\070\064\040\122\157\157\164\040\107\065 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\011\340\223\145\254\367\331\310\271\076\034\013\004\052 -\056\363 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "DigiCert TLS RSA4096 Root G5" -# -# Issuer: CN=DigiCert TLS RSA4096 Root G5,O="DigiCert, Inc.",C=US -# Serial Number:08:f9:b4:78:a8:fa:7e:da:6a:33:37:89:de:7c:cf:8a -# Subject: CN=DigiCert TLS RSA4096 Root G5,O="DigiCert, Inc.",C=US -# Not Valid Before: Fri Jan 15 00:00:00 2021 -# Not Valid After : Sun Jan 14 23:59:59 2046 -# Fingerprint (SHA-256): 37:1A:00:DC:05:33:B3:72:1A:7E:EB:40:E8:41:9E:70:79:9D:2B:0A:0F:2C:1D:80:69:31:65:F7:CE:C4:AD:75 -# Fingerprint (SHA1): A7:88:49:DC:5D:7C:75:8C:8C:DE:39:98:56:B3:AA:D0:B2:A5:71:35 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "DigiCert TLS RSA4096 Root G5" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\115\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\027\060\025\006\003\125\004\012\023\016\104\151\147\151\103\145 -\162\164\054\040\111\156\143\056\061\045\060\043\006\003\125\004 -\003\023\034\104\151\147\151\103\145\162\164\040\124\114\123\040 -\122\123\101\064\060\071\066\040\122\157\157\164\040\107\065 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\115\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\027\060\025\006\003\125\004\012\023\016\104\151\147\151\103\145 -\162\164\054\040\111\156\143\056\061\045\060\043\006\003\125\004 -\003\023\034\104\151\147\151\103\145\162\164\040\124\114\123\040 -\122\123\101\064\060\071\066\040\122\157\157\164\040\107\065 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\010\371\264\170\250\372\176\332\152\063\067\211\336\174 -\317\212 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\146\060\202\003\116\240\003\002\001\002\002\020\010 -\371\264\170\250\372\176\332\152\063\067\211\336\174\317\212\060 -\015\006\011\052\206\110\206\367\015\001\001\014\005\000\060\115 -\061\013\060\011\006\003\125\004\006\023\002\125\123\061\027\060 -\025\006\003\125\004\012\023\016\104\151\147\151\103\145\162\164 -\054\040\111\156\143\056\061\045\060\043\006\003\125\004\003\023 -\034\104\151\147\151\103\145\162\164\040\124\114\123\040\122\123 -\101\064\060\071\066\040\122\157\157\164\040\107\065\060\036\027 -\015\062\061\060\061\061\065\060\060\060\060\060\060\132\027\015 -\064\066\060\061\061\064\062\063\065\071\065\071\132\060\115\061 -\013\060\011\006\003\125\004\006\023\002\125\123\061\027\060\025 -\006\003\125\004\012\023\016\104\151\147\151\103\145\162\164\054 -\040\111\156\143\056\061\045\060\043\006\003\125\004\003\023\034 -\104\151\147\151\103\145\162\164\040\124\114\123\040\122\123\101 -\064\060\071\066\040\122\157\157\164\040\107\065\060\202\002\042 -\060\015\006\011\052\206\110\206\367\015\001\001\001\005\000\003 -\202\002\017\000\060\202\002\012\002\202\002\001\000\263\320\364 -\311\171\021\235\375\374\146\201\347\314\325\344\274\354\201\076 -\152\065\216\056\267\347\336\257\371\007\115\317\060\235\352\011 -\013\231\275\154\127\332\030\112\270\170\254\072\071\250\246\110 -\254\056\162\345\275\353\361\032\315\347\244\003\251\077\021\264 -\330\057\211\026\373\224\001\075\273\057\370\023\005\241\170\034 -\216\050\340\105\340\203\364\131\033\225\263\256\176\003\105\345 -\276\302\102\376\356\362\074\266\205\023\230\062\235\026\250\051 -\302\013\034\070\334\237\061\167\134\277\047\243\374\047\254\267 -\053\275\164\233\027\055\362\201\332\135\260\341\043\027\076\210 -\112\022\043\320\352\317\235\336\003\027\261\102\112\240\026\114 -\244\155\223\351\077\072\356\072\174\235\130\235\364\116\217\374 -\073\043\310\155\270\342\005\332\314\353\354\303\061\364\327\247 -\051\124\200\317\104\133\114\157\060\236\363\314\335\037\224\103 -\235\115\177\160\160\015\324\072\321\067\360\154\235\233\300\024 -\223\130\357\315\101\070\165\274\023\003\225\174\177\343\134\351 -\325\015\325\342\174\020\142\252\153\360\075\166\363\077\243\350 -\260\301\375\357\252\127\115\254\206\247\030\264\051\301\054\016 -\277\144\276\051\214\330\002\055\315\134\057\362\177\357\025\364 -\014\025\254\012\260\361\323\015\117\152\115\167\227\001\240\361 -\146\267\267\316\357\316\354\354\245\165\312\254\343\341\143\367 -\270\241\004\310\274\173\077\135\055\026\042\126\355\110\111\376 -\247\057\171\060\045\233\272\153\055\077\235\073\304\027\347\035 -\056\373\362\317\246\374\343\024\054\226\230\041\214\264\221\351 -\031\140\203\362\060\053\006\163\120\325\230\073\006\351\307\212 -\014\140\214\050\370\122\233\156\341\366\115\273\006\044\233\327 -\053\046\077\375\052\057\161\365\326\044\276\177\061\236\017\155 -\350\217\117\115\243\077\377\065\352\337\111\136\101\217\206\371 -\361\167\171\113\033\264\243\136\057\373\106\002\320\146\023\136 -\136\205\117\316\330\160\210\173\316\001\265\226\227\327\315\175 -\375\202\370\302\044\301\312\001\071\117\215\242\301\024\100\037 -\234\146\325\014\011\106\326\362\320\321\110\166\126\072\103\313 -\266\012\021\071\272\214\023\154\006\265\236\317\353\002\003\001 -\000\001\243\102\060\100\060\035\006\003\125\035\016\004\026\004 -\024\121\063\034\355\066\100\257\027\323\045\315\151\150\362\257 -\116\043\076\263\101\060\016\006\003\125\035\017\001\001\377\004 -\004\003\002\001\206\060\017\006\003\125\035\023\001\001\377\004 -\005\060\003\001\001\377\060\015\006\011\052\206\110\206\367\015 -\001\001\014\005\000\003\202\002\001\000\140\246\257\133\137\127 -\332\211\333\113\120\251\304\043\065\041\377\320\141\060\204\221 -\267\077\020\317\045\216\311\277\106\064\331\301\041\046\034\160 -\031\162\036\243\311\207\376\251\103\144\226\072\310\123\004\012 -\266\101\273\304\107\000\331\237\030\030\073\262\016\363\064\352 -\044\367\335\257\040\140\256\222\050\137\066\347\135\344\336\307 -\074\333\120\071\255\273\075\050\115\226\174\166\306\133\364\301 -\333\024\245\253\031\142\007\030\100\137\227\221\334\234\307\253 -\265\121\015\346\151\123\125\314\071\175\332\305\021\125\162\305 -\073\213\211\370\064\055\244\027\345\027\346\231\175\060\210\041 -\067\315\060\027\075\270\362\274\250\165\240\103\334\076\211\113 -\220\256\155\003\340\034\243\240\226\011\273\175\243\267\052\020 -\104\113\106\007\064\143\355\061\271\004\356\243\233\232\256\346 -\061\170\364\352\044\141\073\253\130\144\377\273\207\047\142\045 -\201\337\334\241\057\366\355\247\377\172\217\121\056\060\370\244 -\001\322\205\071\137\001\231\226\157\132\133\160\031\106\376\206 -\140\076\255\200\020\011\335\071\045\057\130\177\273\322\164\360 -\367\106\037\106\071\112\330\123\320\363\056\073\161\245\324\157 -\374\363\147\344\007\217\335\046\031\341\215\133\372\243\223\021 -\233\351\310\072\303\125\150\232\222\341\122\166\070\350\341\272 -\275\373\117\325\357\263\347\110\203\061\360\202\041\343\266\276 -\247\253\157\357\237\337\114\317\001\270\142\152\043\075\347\011 -\115\200\033\173\060\244\303\335\007\177\064\276\244\046\262\366 -\101\350\011\035\343\040\230\252\067\117\377\367\361\342\051\160 -\061\107\077\164\320\024\026\372\041\212\002\325\212\011\224\167 -\056\362\131\050\213\174\120\222\012\146\170\070\203\165\304\265 -\132\250\021\306\345\301\235\146\125\317\123\304\257\327\165\205 -\251\102\023\126\354\041\167\201\223\132\014\352\226\331\111\312 -\241\010\362\227\073\155\233\004\030\044\104\216\174\001\362\334 -\045\330\136\206\232\261\071\333\365\221\062\152\321\246\160\212 -\242\367\336\244\105\205\046\250\036\214\135\051\133\310\113\330 -\232\152\003\136\160\362\205\117\154\113\150\057\312\124\366\214 -\332\062\376\303\153\203\077\070\306\176 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "DigiCert TLS RSA4096 Root G5" -# Issuer: CN=DigiCert TLS RSA4096 Root G5,O="DigiCert, Inc.",C=US -# Serial Number:08:f9:b4:78:a8:fa:7e:da:6a:33:37:89:de:7c:cf:8a -# Subject: CN=DigiCert TLS RSA4096 Root G5,O="DigiCert, Inc.",C=US -# Not Valid Before: Fri Jan 15 00:00:00 2021 -# Not Valid After : Sun Jan 14 23:59:59 2046 -# Fingerprint (SHA-256): 37:1A:00:DC:05:33:B3:72:1A:7E:EB:40:E8:41:9E:70:79:9D:2B:0A:0F:2C:1D:80:69:31:65:F7:CE:C4:AD:75 -# Fingerprint (SHA1): A7:88:49:DC:5D:7C:75:8C:8C:DE:39:98:56:B3:AA:D0:B2:A5:71:35 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "DigiCert TLS RSA4096 Root G5" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\247\210\111\334\135\174\165\214\214\336\071\230\126\263\252\320 -\262\245\161\065 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\254\376\367\064\226\251\362\263\264\022\113\344\047\101\157\341 -END -CKA_ISSUER MULTILINE_OCTAL -\060\115\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\027\060\025\006\003\125\004\012\023\016\104\151\147\151\103\145 -\162\164\054\040\111\156\143\056\061\045\060\043\006\003\125\004 -\003\023\034\104\151\147\151\103\145\162\164\040\124\114\123\040 -\122\123\101\064\060\071\066\040\122\157\157\164\040\107\065 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\010\371\264\170\250\372\176\332\152\063\067\211\336\174 -\317\212 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "DigiCert SMIME ECC P384 Root G5" -# -# Issuer: CN=DigiCert SMIME ECC P384 Root G5,O="DigiCert, Inc.",C=US -# Serial Number:05:3f:6e:a0:06:01:72:7d:ed:3f:c3:a3:b6:a3:d6:ef -# Subject: CN=DigiCert SMIME ECC P384 Root G5,O="DigiCert, Inc.",C=US -# Not Valid Before: Fri Jan 15 00:00:00 2021 -# Not Valid After : Sun Jan 14 23:59:59 2046 -# Fingerprint (SHA-256): E8:E8:17:65:36:A6:0C:C2:C4:E1:01:87:C3:BE:FC:A2:0E:F2:63:49:70:18:F5:66:D5:BE:A0:F9:4D:0C:11:1B -# Fingerprint (SHA1): 1C:B8:A7:08:C9:0D:20:79:01:A0:B2:36:7F:F0:95:65:E4:53:24:FE -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "DigiCert SMIME ECC P384 Root G5" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\120\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\027\060\025\006\003\125\004\012\023\016\104\151\147\151\103\145 -\162\164\054\040\111\156\143\056\061\050\060\046\006\003\125\004 -\003\023\037\104\151\147\151\103\145\162\164\040\123\115\111\115 -\105\040\105\103\103\040\120\063\070\064\040\122\157\157\164\040 -\107\065 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\120\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\027\060\025\006\003\125\004\012\023\016\104\151\147\151\103\145 -\162\164\054\040\111\156\143\056\061\050\060\046\006\003\125\004 -\003\023\037\104\151\147\151\103\145\162\164\040\123\115\111\115 -\105\040\105\103\103\040\120\063\070\064\040\122\157\157\164\040 -\107\065 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\005\077\156\240\006\001\162\175\355\077\303\243\266\243 -\326\357 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\034\060\202\001\243\240\003\002\001\002\002\020\005 -\077\156\240\006\001\162\175\355\077\303\243\266\243\326\357\060 -\012\006\010\052\206\110\316\075\004\003\003\060\120\061\013\060 -\011\006\003\125\004\006\023\002\125\123\061\027\060\025\006\003 -\125\004\012\023\016\104\151\147\151\103\145\162\164\054\040\111 -\156\143\056\061\050\060\046\006\003\125\004\003\023\037\104\151 -\147\151\103\145\162\164\040\123\115\111\115\105\040\105\103\103 -\040\120\063\070\064\040\122\157\157\164\040\107\065\060\036\027 -\015\062\061\060\061\061\065\060\060\060\060\060\060\132\027\015 -\064\066\060\061\061\064\062\063\065\071\065\071\132\060\120\061 -\013\060\011\006\003\125\004\006\023\002\125\123\061\027\060\025 -\006\003\125\004\012\023\016\104\151\147\151\103\145\162\164\054 -\040\111\156\143\056\061\050\060\046\006\003\125\004\003\023\037 -\104\151\147\151\103\145\162\164\040\123\115\111\115\105\040\105 -\103\103\040\120\063\070\064\040\122\157\157\164\040\107\065\060 -\166\060\020\006\007\052\206\110\316\075\002\001\006\005\053\201 -\004\000\042\003\142\000\004\026\235\125\345\266\324\373\373\147 -\153\032\324\241\252\322\167\225\076\210\345\007\237\266\160\146 -\040\050\244\210\354\160\065\257\263\062\377\067\023\112\236\274 -\001\003\336\204\301\270\306\346\145\107\211\362\023\125\277\315 -\245\036\010\140\177\255\177\350\141\222\051\317\011\107\136\013 -\034\300\037\244\277\362\133\274\230\357\231\114\314\160\153\266 -\272\320\050\035\277\276\004\243\102\060\100\060\035\006\003\125 -\035\016\004\026\004\024\163\172\153\226\333\102\007\213\122\146 -\302\144\062\027\376\340\147\220\056\255\060\016\006\003\125\035 -\017\001\001\377\004\004\003\002\001\206\060\017\006\003\125\035 -\023\001\001\377\004\005\060\003\001\001\377\060\012\006\010\052 -\206\110\316\075\004\003\003\003\147\000\060\144\002\060\067\104 -\365\062\200\343\161\353\364\155\317\174\314\221\232\303\156\161 -\330\322\043\135\222\115\202\102\155\134\141\225\366\221\365\247 -\010\366\152\227\351\234\224\055\230\160\375\063\266\011\002\060 -\007\074\057\271\130\202\136\017\243\142\250\223\147\360\040\303 -\151\277\003\054\073\120\247\073\257\101\070\311\122\110\221\326 -\016\373\274\140\060\174\144\077\022\036\105\177\121\076\364\246 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "DigiCert SMIME ECC P384 Root G5" -# Issuer: CN=DigiCert SMIME ECC P384 Root G5,O="DigiCert, Inc.",C=US -# Serial Number:05:3f:6e:a0:06:01:72:7d:ed:3f:c3:a3:b6:a3:d6:ef -# Subject: CN=DigiCert SMIME ECC P384 Root G5,O="DigiCert, Inc.",C=US -# Not Valid Before: Fri Jan 15 00:00:00 2021 -# Not Valid After : Sun Jan 14 23:59:59 2046 -# Fingerprint (SHA-256): E8:E8:17:65:36:A6:0C:C2:C4:E1:01:87:C3:BE:FC:A2:0E:F2:63:49:70:18:F5:66:D5:BE:A0:F9:4D:0C:11:1B -# Fingerprint (SHA1): 1C:B8:A7:08:C9:0D:20:79:01:A0:B2:36:7F:F0:95:65:E4:53:24:FE -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "DigiCert SMIME ECC P384 Root G5" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\034\270\247\010\311\015\040\171\001\240\262\066\177\360\225\145 -\344\123\044\376 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\246\376\364\122\066\104\330\356\015\267\003\013\357\164\263\003 -END -CKA_ISSUER MULTILINE_OCTAL -\060\120\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\027\060\025\006\003\125\004\012\023\016\104\151\147\151\103\145 -\162\164\054\040\111\156\143\056\061\050\060\046\006\003\125\004 -\003\023\037\104\151\147\151\103\145\162\164\040\123\115\111\115 -\105\040\105\103\103\040\120\063\070\064\040\122\157\157\164\040 -\107\065 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\005\077\156\240\006\001\162\175\355\077\303\243\266\243 -\326\357 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "DigiCert SMIME RSA4096 Root G5" -# -# Issuer: CN=DigiCert SMIME RSA4096 Root G5,O="DigiCert, Inc.",C=US -# Serial Number:05:f6:ba:04:23:83:46:cb:7d:5c:e6:b9:5b:ba:1c:55 -# Subject: CN=DigiCert SMIME RSA4096 Root G5,O="DigiCert, Inc.",C=US -# Not Valid Before: Fri Jan 15 00:00:00 2021 -# Not Valid After : Sun Jan 14 23:59:59 2046 -# Fingerprint (SHA-256): 90:37:0D:3E:FA:88:BF:58:C3:01:05:BA:25:10:4A:35:84:60:A7:FA:52:DF:C2:01:1D:F2:33:A0:F4:17:91:2A -# Fingerprint (SHA1): 5B:C5:AD:E2:9A:A7:54:DA:84:89:53:A5:FE:D7:5B:46:86:D0:57:08 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "DigiCert SMIME RSA4096 Root G5" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\117\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\027\060\025\006\003\125\004\012\023\016\104\151\147\151\103\145 -\162\164\054\040\111\156\143\056\061\047\060\045\006\003\125\004 -\003\023\036\104\151\147\151\103\145\162\164\040\123\115\111\115 -\105\040\122\123\101\064\060\071\066\040\122\157\157\164\040\107 -\065 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\117\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\027\060\025\006\003\125\004\012\023\016\104\151\147\151\103\145 -\162\164\054\040\111\156\143\056\061\047\060\045\006\003\125\004 -\003\023\036\104\151\147\151\103\145\162\164\040\123\115\111\115 -\105\040\122\123\101\064\060\071\066\040\122\157\157\164\040\107 -\065 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\005\366\272\004\043\203\106\313\175\134\346\271\133\272 -\034\125 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\152\060\202\003\122\240\003\002\001\002\002\020\005 -\366\272\004\043\203\106\313\175\134\346\271\133\272\034\125\060 -\015\006\011\052\206\110\206\367\015\001\001\014\005\000\060\117 -\061\013\060\011\006\003\125\004\006\023\002\125\123\061\027\060 -\025\006\003\125\004\012\023\016\104\151\147\151\103\145\162\164 -\054\040\111\156\143\056\061\047\060\045\006\003\125\004\003\023 -\036\104\151\147\151\103\145\162\164\040\123\115\111\115\105\040 -\122\123\101\064\060\071\066\040\122\157\157\164\040\107\065\060 -\036\027\015\062\061\060\061\061\065\060\060\060\060\060\060\132 -\027\015\064\066\060\061\061\064\062\063\065\071\065\071\132\060 -\117\061\013\060\011\006\003\125\004\006\023\002\125\123\061\027 -\060\025\006\003\125\004\012\023\016\104\151\147\151\103\145\162 -\164\054\040\111\156\143\056\061\047\060\045\006\003\125\004\003 -\023\036\104\151\147\151\103\145\162\164\040\123\115\111\115\105 -\040\122\123\101\064\060\071\066\040\122\157\157\164\040\107\065 -\060\202\002\042\060\015\006\011\052\206\110\206\367\015\001\001 -\001\005\000\003\202\002\017\000\060\202\002\012\002\202\002\001 -\000\340\152\133\331\370\371\175\354\265\173\357\137\335\134\064 -\330\332\135\321\313\145\165\253\041\174\133\000\324\202\157\105 -\205\101\212\251\022\002\162\062\360\024\365\003\165\273\143\227 -\111\017\100\231\013\032\036\126\247\322\320\341\253\335\345\004 -\033\343\037\024\022\002\210\365\240\200\011\366\047\232\120\360 -\272\343\242\340\254\152\024\221\265\153\070\020\172\242\061\341 -\221\033\267\271\360\053\133\310\167\011\166\267\121\304\066\012 -\231\123\124\104\045\267\011\065\206\027\005\126\223\075\101\267 -\002\327\142\037\212\222\021\207\352\021\155\352\010\021\334\261 -\170\110\111\222\366\264\121\200\170\043\330\376\341\126\032\072 -\220\023\126\064\211\325\342\225\213\137\336\262\314\373\077\070 -\267\205\367\352\236\277\056\241\056\057\115\175\152\021\056\066 -\240\377\021\010\004\225\125\340\033\073\147\223\251\224\125\352 -\062\355\006\072\177\302\177\343\255\023\047\321\064\101\263\060 -\303\277\264\210\370\003\202\244\337\076\253\170\167\240\131\223 -\161\347\335\353\000\004\173\314\110\071\050\340\036\243\025\151 -\310\066\262\241\013\227\337\125\326\357\221\234\244\366\026\367 -\121\012\356\003\043\221\334\004\377\340\335\070\366\042\003\000 -\302\007\161\032\022\311\327\106\052\224\033\315\326\273\033\356 -\277\276\115\120\130\260\013\315\060\166\051\365\317\345\266\152 -\057\166\260\260\151\152\320\155\145\030\065\176\223\274\162\027 -\301\125\102\315\057\302\045\273\364\375\035\241\144\042\124\135 -\342\236\162\101\204\156\161\226\352\105\007\266\136\172\112\206 -\235\163\144\167\070\003\322\017\123\245\125\040\304\115\377\150 -\157\125\251\352\335\161\344\117\331\205\243\174\116\051\002\236 -\013\011\362\032\123\314\000\246\335\321\064\366\015\301\060\261 -\234\002\144\254\065\355\245\260\051\261\322\225\063\017\322\040 -\063\275\354\043\113\362\031\371\332\230\144\344\054\061\037\056 -\341\215\034\004\225\050\115\214\130\315\113\345\163\202\206\214 -\354\250\326\171\134\373\144\273\334\014\114\050\366\027\257\342 -\150\326\026\206\230\333\374\001\334\061\272\370\234\016\371\050 -\106\112\341\375\226\006\105\171\021\150\027\145\134\213\046\207 -\133\002\003\001\000\001\243\102\060\100\060\035\006\003\125\035 -\016\004\026\004\024\321\243\324\127\035\117\125\333\165\114\134 -\102\236\143\026\316\264\306\073\037\060\016\006\003\125\035\017 -\001\001\377\004\004\003\002\001\206\060\017\006\003\125\035\023 -\001\001\377\004\005\060\003\001\001\377\060\015\006\011\052\206 -\110\206\367\015\001\001\014\005\000\003\202\002\001\000\007\247 -\012\336\123\273\232\353\160\277\262\066\220\315\344\247\270\361 -\014\344\135\132\035\170\145\374\311\270\036\043\021\127\174\151 -\065\155\001\377\123\120\277\007\016\272\307\001\077\130\052\224 -\165\003\253\034\013\043\334\033\212\036\067\075\035\130\217\163 -\331\263\052\157\337\020\240\133\014\247\312\260\177\271\044\242 -\001\065\062\345\136\106\101\353\330\177\163\347\102\351\244\121 -\046\167\201\012\250\353\017\012\120\235\176\212\040\147\374\013 -\216\072\021\323\305\214\140\030\331\113\261\374\324\361\264\111 -\116\256\207\341\321\373\166\241\137\363\006\317\227\226\014\351 -\236\165\201\134\123\015\042\374\066\346\111\156\164\333\000\205 -\215\174\042\240\216\373\020\114\324\142\023\133\357\113\162\046 -\213\374\116\212\217\376\227\020\123\305\170\213\102\144\033\137 -\340\211\375\273\011\177\120\340\124\205\046\021\152\035\145\371 -\111\051\334\174\066\337\373\075\367\322\254\356\062\215\156\246 -\175\071\234\105\304\312\015\365\073\264\171\123\245\057\126\307 -\121\305\212\114\144\135\220\103\043\216\153\114\027\170\314\350 -\277\365\073\344\250\110\317\255\233\014\337\062\112\323\331\022 -\216\043\170\015\055\257\237\257\236\074\011\302\227\000\355\072 -\151\034\161\077\071\337\323\217\304\146\365\357\066\224\017\363 -\335\222\266\226\137\220\246\335\163\252\246\040\224\224\045\152 -\011\014\162\344\023\043\140\114\243\312\027\056\173\147\000\333 -\320\315\352\172\037\071\046\127\211\060\167\313\116\345\225\105 -\117\137\373\066\134\075\371\040\265\072\020\045\117\223\062\132 -\356\301\226\350\351\126\004\260\111\141\115\354\170\250\235\030 -\301\377\330\352\057\126\357\225\053\173\004\136\147\343\125\100 -\355\071\004\371\013\171\365\152\214\134\017\211\232\220\307\315 -\213\336\333\046\065\241\156\315\263\102\362\242\017\073\014\216 -\223\377\024\317\374\367\223\367\344\101\010\156\031\122\021\017 -\123\031\163\170\014\317\330\205\201\370\255\125\310\260\236\106 -\143\257\234\122\356\134\277\360\300\133\067\036\011\040\322\076 -\043\306\241\025\112\016\066\176\060\305\171\152\274\042\210\331 -\014\122\100\037\335\116\017\147\046\026\322\255\027\034 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "DigiCert SMIME RSA4096 Root G5" -# Issuer: CN=DigiCert SMIME RSA4096 Root G5,O="DigiCert, Inc.",C=US -# Serial Number:05:f6:ba:04:23:83:46:cb:7d:5c:e6:b9:5b:ba:1c:55 -# Subject: CN=DigiCert SMIME RSA4096 Root G5,O="DigiCert, Inc.",C=US -# Not Valid Before: Fri Jan 15 00:00:00 2021 -# Not Valid After : Sun Jan 14 23:59:59 2046 -# Fingerprint (SHA-256): 90:37:0D:3E:FA:88:BF:58:C3:01:05:BA:25:10:4A:35:84:60:A7:FA:52:DF:C2:01:1D:F2:33:A0:F4:17:91:2A -# Fingerprint (SHA1): 5B:C5:AD:E2:9A:A7:54:DA:84:89:53:A5:FE:D7:5B:46:86:D0:57:08 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "DigiCert SMIME RSA4096 Root G5" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\133\305\255\342\232\247\124\332\204\211\123\245\376\327\133\106 -\206\320\127\010 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\321\173\340\265\077\065\162\237\175\276\013\245\244\035\251\156 -END -CKA_ISSUER MULTILINE_OCTAL -\060\117\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\027\060\025\006\003\125\004\012\023\016\104\151\147\151\103\145 -\162\164\054\040\111\156\143\056\061\047\060\045\006\003\125\004 -\003\023\036\104\151\147\151\103\145\162\164\040\123\115\111\115 -\105\040\122\123\101\064\060\071\066\040\122\157\157\164\040\107 -\065 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\005\366\272\004\043\203\106\313\175\134\346\271\133\272 -\034\125 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Certainly Root R1" -# -# Issuer: CN=Certainly Root R1,O=Certainly,C=US -# Serial Number:00:8e:0f:f9:4b:90:71:68:65:33:54:f4:d4:44:39:b7:e0 -# Subject: CN=Certainly Root R1,O=Certainly,C=US -# Not Valid Before: Thu Apr 01 00:00:00 2021 -# Not Valid After : Sun Apr 01 00:00:00 2046 -# Fingerprint (SHA-256): 77:B8:2C:D8:64:4C:43:05:F7:AC:C5:CB:15:6B:45:67:50:04:03:3D:51:C6:0C:62:02:A8:E0:C3:34:67:D3:A0 -# Fingerprint (SHA1): A0:50:EE:0F:28:71:F4:27:B2:12:6D:6F:50:96:25:BA:CC:86:42:AF -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Certainly Root R1" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\075\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\022\060\020\006\003\125\004\012\023\011\103\145\162\164\141\151 -\156\154\171\061\032\060\030\006\003\125\004\003\023\021\103\145 -\162\164\141\151\156\154\171\040\122\157\157\164\040\122\061 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\075\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\022\060\020\006\003\125\004\012\023\011\103\145\162\164\141\151 -\156\154\171\061\032\060\030\006\003\125\004\003\023\021\103\145 -\162\164\141\151\156\154\171\040\122\157\157\164\040\122\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\021\000\216\017\371\113\220\161\150\145\063\124\364\324\104 -\071\267\340 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\107\060\202\003\057\240\003\002\001\002\002\021\000 -\216\017\371\113\220\161\150\145\063\124\364\324\104\071\267\340 -\060\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060 -\075\061\013\060\011\006\003\125\004\006\023\002\125\123\061\022 -\060\020\006\003\125\004\012\023\011\103\145\162\164\141\151\156 -\154\171\061\032\060\030\006\003\125\004\003\023\021\103\145\162 -\164\141\151\156\154\171\040\122\157\157\164\040\122\061\060\036 -\027\015\062\061\060\064\060\061\060\060\060\060\060\060\132\027 -\015\064\066\060\064\060\061\060\060\060\060\060\060\132\060\075 -\061\013\060\011\006\003\125\004\006\023\002\125\123\061\022\060 -\020\006\003\125\004\012\023\011\103\145\162\164\141\151\156\154 -\171\061\032\060\030\006\003\125\004\003\023\021\103\145\162\164 -\141\151\156\154\171\040\122\157\157\164\040\122\061\060\202\002 -\042\060\015\006\011\052\206\110\206\367\015\001\001\001\005\000 -\003\202\002\017\000\060\202\002\012\002\202\002\001\000\320\066 -\324\037\352\335\253\344\321\266\346\373\042\300\335\023\015\152 -\173\042\023\034\227\074\150\143\146\062\234\003\265\215\244\201 -\203\332\170\060\021\317\334\262\053\276\222\277\216\344\304\023 -\276\244\150\114\332\002\150\026\164\276\262\335\004\344\153\052 -\335\067\037\140\054\333\365\367\241\174\225\267\014\160\206\056 -\361\072\357\122\367\314\323\233\371\213\276\016\337\061\267\235 -\150\134\222\246\365\345\363\012\064\265\377\173\242\344\207\241 -\306\257\027\000\357\003\221\355\251\034\116\161\075\322\213\154 -\211\364\170\206\346\152\111\240\316\265\322\260\253\233\366\364 -\324\056\343\162\371\066\306\353\025\267\045\214\072\374\045\015 -\263\042\163\041\164\310\112\226\141\222\365\057\013\030\245\364 -\255\342\356\101\275\001\171\372\226\214\215\027\002\060\264\371 -\257\170\032\214\264\066\020\020\007\005\160\320\364\061\220\212 -\121\305\206\046\171\262\021\210\136\305\360\012\124\315\111\246 -\277\002\234\322\104\247\355\343\170\357\106\136\155\161\321\171 -\160\034\106\137\121\351\311\067\334\137\176\151\173\101\337\064 -\105\340\073\204\364\241\212\012\066\236\067\314\142\122\341\211 -\015\050\371\172\043\261\015\075\075\232\375\235\201\357\054\220 -\300\173\104\116\273\111\340\016\112\126\222\274\313\265\335\171 -\027\211\221\336\141\211\164\222\250\343\062\205\276\116\205\244 -\113\131\313\053\305\170\216\161\124\320\002\067\231\214\345\111 -\352\340\124\162\244\021\006\057\013\214\301\133\276\265\241\260 -\123\156\234\270\140\221\037\131\153\371\055\364\224\012\227\265 -\354\305\166\003\124\033\145\122\272\114\222\126\121\065\240\100 -\330\051\333\256\122\166\073\055\060\100\233\212\320\102\126\264 -\267\210\001\244\207\073\123\226\315\243\026\217\363\146\252\027 -\261\307\140\340\301\103\005\014\356\233\133\140\157\006\134\207 -\133\047\371\100\021\236\234\063\301\267\345\065\127\005\177\047 -\316\027\040\214\034\374\361\373\332\061\051\111\355\365\013\204 -\247\117\301\366\116\302\050\234\372\356\340\257\007\373\063\021 -\172\041\117\013\041\020\266\100\072\253\042\072\004\234\213\233 -\204\206\162\232\322\247\245\304\264\165\221\251\053\043\002\003 -\001\000\001\243\102\060\100\060\016\006\003\125\035\017\001\001 -\377\004\004\003\002\001\006\060\017\006\003\125\035\023\001\001 -\377\004\005\060\003\001\001\377\060\035\006\003\125\035\016\004 -\026\004\024\340\252\077\045\215\237\104\134\301\072\350\056\256 -\167\114\204\076\147\014\364\060\015\006\011\052\206\110\206\367 -\015\001\001\013\005\000\003\202\002\001\000\271\127\257\270\022 -\332\127\203\217\150\013\063\035\003\123\125\364\225\160\344\053 -\075\260\071\353\372\211\142\375\367\326\030\004\057\041\064\335 -\361\150\360\325\226\132\336\302\200\243\301\215\306\152\367\131 -\167\256\025\144\317\133\171\005\167\146\352\214\323\153\015\335 -\361\131\054\301\063\245\060\200\025\105\007\105\032\061\042\266 -\222\000\253\231\115\072\217\167\257\251\042\312\057\143\312\025 -\326\307\306\360\075\154\374\034\015\230\020\141\236\021\242\042 -\327\012\362\221\172\153\071\016\057\060\303\066\111\237\340\351 -\017\002\104\120\067\224\125\175\352\237\366\073\272\224\245\114 -\351\274\076\121\264\350\312\222\066\124\155\134\045\050\332\335 -\255\024\375\323\356\342\042\005\353\320\362\267\150\022\327\132 -\212\101\032\306\222\245\132\073\143\105\117\277\341\072\167\042 -\057\134\277\106\371\132\003\205\023\102\137\312\336\123\327\142 -\265\246\065\004\302\107\377\231\375\204\337\134\316\351\136\200 -\050\101\362\175\347\036\220\330\117\166\076\202\074\015\374\245 -\003\372\173\032\331\105\036\140\332\304\216\371\374\053\311\173 -\225\305\052\377\252\211\337\202\061\017\162\377\014\047\327\012 -\036\126\000\120\036\014\220\301\226\265\330\024\205\273\247\015 -\026\301\370\007\044\033\272\205\241\032\005\011\200\272\225\143 -\311\072\354\045\237\177\235\272\244\107\025\233\104\160\361\152 -\113\326\070\136\103\363\030\176\120\156\351\132\050\346\145\346 -\167\033\072\375\035\276\003\046\243\333\324\341\273\176\226\047 -\053\035\356\244\373\332\045\124\023\003\336\071\306\303\037\115 -\220\354\217\033\112\322\034\355\205\225\070\120\171\106\326\301 -\220\120\061\251\134\232\156\035\365\063\126\213\247\231\322\362 -\310\054\063\223\222\060\307\116\214\145\063\020\144\027\375\044 -\027\226\321\215\302\072\152\053\353\023\213\104\362\041\363\112 -\032\267\167\137\327\355\210\244\162\345\071\037\225\235\276\147 -\301\160\021\075\273\364\370\111\267\343\046\227\072\237\322\137 -\174\373\300\231\174\071\051\340\173\035\277\015\247\217\322\051 -\064\156\044\025\313\336\220\136\277\032\304\146\352\302\346\272 -\071\137\212\231\251\101\131\007\260\054\257 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Certainly Root R1" -# Issuer: CN=Certainly Root R1,O=Certainly,C=US -# Serial Number:00:8e:0f:f9:4b:90:71:68:65:33:54:f4:d4:44:39:b7:e0 -# Subject: CN=Certainly Root R1,O=Certainly,C=US -# Not Valid Before: Thu Apr 01 00:00:00 2021 -# Not Valid After : Sun Apr 01 00:00:00 2046 -# Fingerprint (SHA-256): 77:B8:2C:D8:64:4C:43:05:F7:AC:C5:CB:15:6B:45:67:50:04:03:3D:51:C6:0C:62:02:A8:E0:C3:34:67:D3:A0 -# Fingerprint (SHA1): A0:50:EE:0F:28:71:F4:27:B2:12:6D:6F:50:96:25:BA:CC:86:42:AF -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Certainly Root R1" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\240\120\356\017\050\161\364\047\262\022\155\157\120\226\045\272 -\314\206\102\257 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\007\160\324\076\202\207\240\372\063\066\023\364\372\063\347\022 -END -CKA_ISSUER MULTILINE_OCTAL -\060\075\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\022\060\020\006\003\125\004\012\023\011\103\145\162\164\141\151 -\156\154\171\061\032\060\030\006\003\125\004\003\023\021\103\145 -\162\164\141\151\156\154\171\040\122\157\157\164\040\122\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\021\000\216\017\371\113\220\161\150\145\063\124\364\324\104 -\071\267\340 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Certainly Root E1" -# -# Issuer: CN=Certainly Root E1,O=Certainly,C=US -# Serial Number:06:25:33:b1:47:03:33:27:5c:f9:8d:9a:b9:bf:cc:f8 -# Subject: CN=Certainly Root E1,O=Certainly,C=US -# Not Valid Before: Thu Apr 01 00:00:00 2021 -# Not Valid After : Sun Apr 01 00:00:00 2046 -# Fingerprint (SHA-256): B4:58:5F:22:E4:AC:75:6A:4E:86:12:A1:36:1C:5D:9D:03:1A:93:FD:84:FE:BB:77:8F:A3:06:8B:0F:C4:2D:C2 -# Fingerprint (SHA1): F9:E1:6D:DC:01:89:CF:D5:82:45:63:3E:C5:37:7D:C2:EB:93:6F:2B -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Certainly Root E1" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\075\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\022\060\020\006\003\125\004\012\023\011\103\145\162\164\141\151 -\156\154\171\061\032\060\030\006\003\125\004\003\023\021\103\145 -\162\164\141\151\156\154\171\040\122\157\157\164\040\105\061 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\075\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\022\060\020\006\003\125\004\012\023\011\103\145\162\164\141\151 -\156\154\171\061\032\060\030\006\003\125\004\003\023\021\103\145 -\162\164\141\151\156\154\171\040\122\157\157\164\040\105\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\006\045\063\261\107\003\063\047\134\371\215\232\271\277 -\314\370 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\001\367\060\202\001\175\240\003\002\001\002\002\020\006 -\045\063\261\107\003\063\047\134\371\215\232\271\277\314\370\060 -\012\006\010\052\206\110\316\075\004\003\003\060\075\061\013\060 -\011\006\003\125\004\006\023\002\125\123\061\022\060\020\006\003 -\125\004\012\023\011\103\145\162\164\141\151\156\154\171\061\032 -\060\030\006\003\125\004\003\023\021\103\145\162\164\141\151\156 -\154\171\040\122\157\157\164\040\105\061\060\036\027\015\062\061 -\060\064\060\061\060\060\060\060\060\060\132\027\015\064\066\060 -\064\060\061\060\060\060\060\060\060\132\060\075\061\013\060\011 -\006\003\125\004\006\023\002\125\123\061\022\060\020\006\003\125 -\004\012\023\011\103\145\162\164\141\151\156\154\171\061\032\060 -\030\006\003\125\004\003\023\021\103\145\162\164\141\151\156\154 -\171\040\122\157\157\164\040\105\061\060\166\060\020\006\007\052 -\206\110\316\075\002\001\006\005\053\201\004\000\042\003\142\000 -\004\336\157\370\177\034\337\355\371\107\207\206\261\244\300\212 -\370\202\227\200\352\217\310\112\136\052\175\210\150\247\001\142 -\024\221\044\172\134\236\243\027\175\212\206\041\064\030\120\033 -\020\336\320\067\113\046\307\031\140\200\351\064\275\140\031\066 -\100\326\051\207\011\074\221\172\366\274\023\043\335\131\116\004 -\136\317\310\002\034\030\123\301\061\330\332\040\351\104\215\344 -\166\243\102\060\100\060\016\006\003\125\035\017\001\001\377\004 -\004\003\002\001\006\060\017\006\003\125\035\023\001\001\377\004 -\005\060\003\001\001\377\060\035\006\003\125\035\016\004\026\004 -\024\363\050\030\313\144\165\356\051\052\353\355\256\043\130\070 -\205\353\310\042\007\060\012\006\010\052\206\110\316\075\004\003 -\003\003\150\000\060\145\002\061\000\261\216\132\040\303\262\031 -\142\115\336\260\117\337\156\322\160\212\361\237\176\152\214\346 -\272\336\203\151\312\151\263\251\005\265\226\222\027\207\302\322 -\352\320\173\316\330\101\133\174\256\002\060\106\336\352\313\135 -\232\354\062\302\145\026\260\114\060\134\060\363\332\116\163\206 -\006\330\316\211\004\110\067\067\370\335\063\121\235\160\257\173 -\125\330\001\056\175\005\144\016\206\270\221 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Certainly Root E1" -# Issuer: CN=Certainly Root E1,O=Certainly,C=US -# Serial Number:06:25:33:b1:47:03:33:27:5c:f9:8d:9a:b9:bf:cc:f8 -# Subject: CN=Certainly Root E1,O=Certainly,C=US -# Not Valid Before: Thu Apr 01 00:00:00 2021 -# Not Valid After : Sun Apr 01 00:00:00 2046 -# Fingerprint (SHA-256): B4:58:5F:22:E4:AC:75:6A:4E:86:12:A1:36:1C:5D:9D:03:1A:93:FD:84:FE:BB:77:8F:A3:06:8B:0F:C4:2D:C2 -# Fingerprint (SHA1): F9:E1:6D:DC:01:89:CF:D5:82:45:63:3E:C5:37:7D:C2:EB:93:6F:2B -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Certainly Root E1" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\371\341\155\334\001\211\317\325\202\105\143\076\305\067\175\302 -\353\223\157\053 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\012\236\312\315\076\122\120\306\066\363\113\243\355\247\123\351 -END -CKA_ISSUER MULTILINE_OCTAL -\060\075\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\022\060\020\006\003\125\004\012\023\011\103\145\162\164\141\151 -\156\154\171\061\032\060\030\006\003\125\004\003\023\021\103\145 -\162\164\141\151\156\154\171\040\122\157\157\164\040\105\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\006\045\063\261\107\003\063\047\134\371\215\232\271\277 -\314\370 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "DIGITALSIGN GLOBAL ROOT RSA CA" -# -# Issuer: CN=DIGITALSIGN GLOBAL ROOT RSA CA,O=DigitalSign Certificadora Digital,C=PT -# Serial Number:5d:59:c8:ca:ab:09:57:f5:e6:b5:da:29:94:04:6a:ff:c5:d4:95:87 -# Subject: CN=DIGITALSIGN GLOBAL ROOT RSA CA,O=DigitalSign Certificadora Digital,C=PT -# Not Valid Before: Thu Jan 21 10:50:34 2021 -# Not Valid After : Mon Jan 15 10:50:34 2046 -# Fingerprint (SHA-256): 82:BD:5D:85:1A:CF:7F:6E:1B:A7:BF:CB:C5:30:30:D0:E7:BC:3C:21:DF:77:2D:85:8C:AB:41:D1:99:BD:F5:95 -# Fingerprint (SHA1): B9:82:07:97:AE:52:A5:68:6F:46:07:DF:FD:03:72:3D:92:86:88:2D -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "DIGITALSIGN GLOBAL ROOT RSA CA" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\142\061\013\060\011\006\003\125\004\006\023\002\120\124\061 -\052\060\050\006\003\125\004\012\014\041\104\151\147\151\164\141 -\154\123\151\147\156\040\103\145\162\164\151\146\151\143\141\144 -\157\162\141\040\104\151\147\151\164\141\154\061\047\060\045\006 -\003\125\004\003\014\036\104\111\107\111\124\101\114\123\111\107 -\116\040\107\114\117\102\101\114\040\122\117\117\124\040\122\123 -\101\040\103\101 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\142\061\013\060\011\006\003\125\004\006\023\002\120\124\061 -\052\060\050\006\003\125\004\012\014\041\104\151\147\151\164\141 -\154\123\151\147\156\040\103\145\162\164\151\146\151\143\141\144 -\157\162\141\040\104\151\147\151\164\141\154\061\047\060\045\006 -\003\125\004\003\014\036\104\111\107\111\124\101\114\123\111\107 -\116\040\107\114\117\102\101\114\040\122\117\117\124\040\122\123 -\101\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\135\131\310\312\253\011\127\365\346\265\332\051\224\004 -\152\377\305\324\225\207 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\265\060\202\003\235\240\003\002\001\002\002\024\135 -\131\310\312\253\011\127\365\346\265\332\051\224\004\152\377\305 -\324\225\207\060\015\006\011\052\206\110\206\367\015\001\001\015 -\005\000\060\142\061\013\060\011\006\003\125\004\006\023\002\120 -\124\061\052\060\050\006\003\125\004\012\014\041\104\151\147\151 -\164\141\154\123\151\147\156\040\103\145\162\164\151\146\151\143 -\141\144\157\162\141\040\104\151\147\151\164\141\154\061\047\060 -\045\006\003\125\004\003\014\036\104\111\107\111\124\101\114\123 -\111\107\116\040\107\114\117\102\101\114\040\122\117\117\124\040 -\122\123\101\040\103\101\060\036\027\015\062\061\060\061\062\061 -\061\060\065\060\063\064\132\027\015\064\066\060\061\061\065\061 -\060\065\060\063\064\132\060\142\061\013\060\011\006\003\125\004 -\006\023\002\120\124\061\052\060\050\006\003\125\004\012\014\041 -\104\151\147\151\164\141\154\123\151\147\156\040\103\145\162\164 -\151\146\151\143\141\144\157\162\141\040\104\151\147\151\164\141 -\154\061\047\060\045\006\003\125\004\003\014\036\104\111\107\111 -\124\101\114\123\111\107\116\040\107\114\117\102\101\114\040\122 -\117\117\124\040\122\123\101\040\103\101\060\202\002\042\060\015 -\006\011\052\206\110\206\367\015\001\001\001\005\000\003\202\002 -\017\000\060\202\002\012\002\202\002\001\000\310\207\266\070\323 -\034\360\336\022\370\203\307\304\212\342\211\270\264\042\172\170 -\370\014\146\121\150\166\067\012\325\117\302\132\010\270\026\134 -\367\162\001\011\067\204\201\052\124\153\327\222\320\154\372\250 -\247\103\022\064\353\016\333\067\017\051\376\212\061\121\102\350 -\113\234\220\250\310\054\021\323\375\240\051\176\316\336\224\366 -\202\340\130\264\116\105\045\361\042\362\075\323\017\173\124\032 -\334\062\266\326\121\116\176\101\264\127\270\054\306\271\016\056 -\312\127\361\325\310\323\130\347\245\351\102\021\256\323\040\045 -\224\151\327\217\312\242\015\303\323\237\007\150\077\025\322\147 -\056\123\375\166\202\233\013\163\251\051\015\236\021\223\024\010 -\230\354\236\124\022\112\126\242\006\025\354\153\154\056\222\140 -\056\206\015\256\202\037\121\115\343\262\007\327\020\031\127\042 -\366\251\151\104\204\363\331\075\240\006\277\314\210\176\177\365 -\316\133\245\302\052\152\164\102\352\157\246\377\371\150\261\320 -\137\275\221\322\125\157\063\127\114\036\235\344\342\213\301\205 -\145\240\340\152\234\000\000\210\222\335\130\010\026\362\160\061 -\250\034\341\336\275\116\161\351\326\276\176\265\241\132\303\115 -\367\277\233\275\224\244\375\365\252\123\223\106\311\046\001\004 -\160\304\240\161\272\316\045\146\373\221\176\125\160\356\111\012 -\115\142\177\302\120\232\162\362\030\147\235\351\105\250\064\204 -\350\370\201\366\321\132\042\036\007\117\073\263\177\335\021\245 -\163\334\276\251\031\072\151\251\155\033\062\342\211\252\245\047 -\013\132\176\164\342\017\144\071\135\176\134\271\301\027\374\307 -\215\136\311\354\044\355\322\362\077\172\204\105\067\002\276\076 -\153\131\304\346\133\026\155\300\252\236\252\265\131\056\054\160 -\125\234\314\231\226\230\044\124\321\216\332\312\264\021\264\267 -\160\103\037\157\220\013\040\240\250\166\023\145\333\333\043\132 -\165\113\241\013\061\167\012\356\175\150\141\032\023\214\352\121 -\176\134\126\243\127\114\135\241\353\023\145\277\124\024\314\363 -\356\334\327\354\074\227\362\170\126\270\337\162\134\160\374\316 -\006\335\237\322\007\061\357\347\122\221\236\315\272\327\300\030 -\104\007\061\145\111\062\151\023\112\353\217\002\003\001\000\001 -\243\143\060\141\060\017\006\003\125\035\023\001\001\377\004\005 -\060\003\001\001\377\060\037\006\003\125\035\043\004\030\060\026 -\200\024\265\066\274\074\214\032\253\054\366\131\031\055\203\024 -\332\223\045\025\326\206\060\035\006\003\125\035\016\004\026\004 -\024\265\066\274\074\214\032\253\054\366\131\031\055\203\024\332 -\223\045\025\326\206\060\016\006\003\125\035\017\001\001\377\004 -\004\003\002\001\006\060\015\006\011\052\206\110\206\367\015\001 -\001\015\005\000\003\202\002\001\000\024\373\061\045\070\061\370 -\312\010\262\043\166\070\255\370\323\131\365\314\264\127\045\341 -\104\276\176\374\026\354\256\372\046\237\117\147\026\112\126\360 -\375\355\307\031\001\064\216\220\132\055\326\200\134\354\161\322 -\201\045\202\036\000\161\337\232\321\325\035\042\273\321\245\363 -\142\017\264\353\334\044\163\376\246\126\315\232\024\305\004\065 -\026\061\242\007\353\245\000\342\266\370\137\162\375\077\141\111 -\216\336\176\115\070\327\172\036\164\067\154\121\334\276\000\004 -\270\070\024\363\040\301\355\233\247\043\375\015\102\204\035\177 -\362\163\303\320\170\143\361\237\354\327\133\351\361\276\154\240 -\113\003\236\215\151\341\024\332\210\020\201\043\123\377\332\124 -\053\013\306\271\226\225\004\030\106\363\173\250\227\330\133\150 -\244\344\070\034\016\105\345\230\323\011\256\232\136\354\263\171 -\015\071\162\362\364\224\235\016\236\140\042\346\250\366\114\205 -\315\007\202\072\150\071\315\075\137\343\070\364\266\257\073\153 -\112\237\140\121\105\242\100\002\345\252\014\343\076\321\170\324 -\242\164\234\046\272\005\232\050\160\112\076\246\013\320\035\111 -\360\272\370\256\101\020\176\244\007\022\275\250\317\051\075\127 -\273\307\361\103\107\000\076\256\160\030\132\040\173\011\313\072 -\072\160\200\345\114\140\230\301\025\301\035\112\367\310\360\233 -\341\162\255\347\135\150\130\013\004\261\214\274\237\267\373\156 -\213\133\004\125\373\353\043\125\327\170\120\332\045\313\276\047 -\066\273\044\032\171\034\121\321\376\023\273\377\170\054\334\244 -\276\057\366\305\113\123\317\247\114\231\136\160\254\131\210\004 -\256\144\004\277\173\246\172\115\323\350\167\275\241\176\120\025 -\363\357\111\060\205\115\041\127\252\333\054\165\227\255\201\001 -\207\242\261\160\235\036\006\132\003\140\261\077\246\155\202\054 -\324\024\261\201\245\350\075\210\035\264\162\054\130\067\212\216 -\070\224\270\163\335\251\340\270\366\167\242\263\174\130\336\256 -\151\072\265\213\245\032\273\362\330\164\006\234\375\142\163\040 -\041\166\261\176\160\236\031\324\353\027\142\031\070\231\315\066 -\053\107\376\061\313\337\271\344\254\010\323\330\246\353\324\236 -\176\113\144\244\125\135\053\027\311 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "DIGITALSIGN GLOBAL ROOT RSA CA" -# Issuer: CN=DIGITALSIGN GLOBAL ROOT RSA CA,O=DigitalSign Certificadora Digital,C=PT -# Serial Number:5d:59:c8:ca:ab:09:57:f5:e6:b5:da:29:94:04:6a:ff:c5:d4:95:87 -# Subject: CN=DIGITALSIGN GLOBAL ROOT RSA CA,O=DigitalSign Certificadora Digital,C=PT -# Not Valid Before: Thu Jan 21 10:50:34 2021 -# Not Valid After : Mon Jan 15 10:50:34 2046 -# Fingerprint (SHA-256): 82:BD:5D:85:1A:CF:7F:6E:1B:A7:BF:CB:C5:30:30:D0:E7:BC:3C:21:DF:77:2D:85:8C:AB:41:D1:99:BD:F5:95 -# Fingerprint (SHA1): B9:82:07:97:AE:52:A5:68:6F:46:07:DF:FD:03:72:3D:92:86:88:2D -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "DIGITALSIGN GLOBAL ROOT RSA CA" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\271\202\007\227\256\122\245\150\157\106\007\337\375\003\162\075 -\222\206\210\055 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\033\032\275\032\171\306\333\264\355\263\207\314\251\323\116\170 -END -CKA_ISSUER MULTILINE_OCTAL -\060\142\061\013\060\011\006\003\125\004\006\023\002\120\124\061 -\052\060\050\006\003\125\004\012\014\041\104\151\147\151\164\141 -\154\123\151\147\156\040\103\145\162\164\151\146\151\143\141\144 -\157\162\141\040\104\151\147\151\164\141\154\061\047\060\045\006 -\003\125\004\003\014\036\104\111\107\111\124\101\114\123\111\107 -\116\040\107\114\117\102\101\114\040\122\117\117\124\040\122\123 -\101\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\135\131\310\312\253\011\127\365\346\265\332\051\224\004 -\152\377\305\324\225\207 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "DIGITALSIGN GLOBAL ROOT ECDSA CA" -# -# Issuer: CN=DIGITALSIGN GLOBAL ROOT ECDSA CA,O=DigitalSign Certificadora Digital,C=PT -# Serial Number:36:2d:8f:72:88:a2:28:27:e4:00:ff:24:c6:2d:e4:eb:fa:9d:b6:e1 -# Subject: CN=DIGITALSIGN GLOBAL ROOT ECDSA CA,O=DigitalSign Certificadora Digital,C=PT -# Not Valid Before: Thu Jan 21 11:07:50 2021 -# Not Valid After : Mon Jan 15 11:07:50 2046 -# Fingerprint (SHA-256): 26:1D:71:14:AE:5F:8F:F2:D8:C7:20:9A:9D:E4:28:9E:6A:FC:9D:71:70:23:D8:54:50:90:91:99:F1:85:7C:FE -# Fingerprint (SHA1): 67:A8:08:EB:8F:88:F5:80:6C:05:45:1B:17:F3:D7:00:2F:D2:4A:8A -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "DIGITALSIGN GLOBAL ROOT ECDSA CA" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\144\061\013\060\011\006\003\125\004\006\023\002\120\124\061 -\052\060\050\006\003\125\004\012\014\041\104\151\147\151\164\141 -\154\123\151\147\156\040\103\145\162\164\151\146\151\143\141\144 -\157\162\141\040\104\151\147\151\164\141\154\061\051\060\047\006 -\003\125\004\003\014\040\104\111\107\111\124\101\114\123\111\107 -\116\040\107\114\117\102\101\114\040\122\117\117\124\040\105\103 -\104\123\101\040\103\101 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\144\061\013\060\011\006\003\125\004\006\023\002\120\124\061 -\052\060\050\006\003\125\004\012\014\041\104\151\147\151\164\141 -\154\123\151\147\156\040\103\145\162\164\151\146\151\143\141\144 -\157\162\141\040\104\151\147\151\164\141\154\061\051\060\047\006 -\003\125\004\003\014\040\104\111\107\111\124\101\114\123\111\107 -\116\040\107\114\117\102\101\114\040\122\117\117\124\040\105\103 -\104\123\101\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\066\055\217\162\210\242\050\047\344\000\377\044\306\055 -\344\353\372\235\266\341 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\152\060\202\001\360\240\003\002\001\002\002\024\066 -\055\217\162\210\242\050\047\344\000\377\044\306\055\344\353\372 -\235\266\341\060\012\006\010\052\206\110\316\075\004\003\003\060 -\144\061\013\060\011\006\003\125\004\006\023\002\120\124\061\052 -\060\050\006\003\125\004\012\014\041\104\151\147\151\164\141\154 -\123\151\147\156\040\103\145\162\164\151\146\151\143\141\144\157 -\162\141\040\104\151\147\151\164\141\154\061\051\060\047\006\003 -\125\004\003\014\040\104\111\107\111\124\101\114\123\111\107\116 -\040\107\114\117\102\101\114\040\122\117\117\124\040\105\103\104 -\123\101\040\103\101\060\036\027\015\062\061\060\061\062\061\061 -\061\060\067\065\060\132\027\015\064\066\060\061\061\065\061\061 -\060\067\065\060\132\060\144\061\013\060\011\006\003\125\004\006 -\023\002\120\124\061\052\060\050\006\003\125\004\012\014\041\104 -\151\147\151\164\141\154\123\151\147\156\040\103\145\162\164\151 -\146\151\143\141\144\157\162\141\040\104\151\147\151\164\141\154 -\061\051\060\047\006\003\125\004\003\014\040\104\111\107\111\124 -\101\114\123\111\107\116\040\107\114\117\102\101\114\040\122\117 -\117\124\040\105\103\104\123\101\040\103\101\060\166\060\020\006 -\007\052\206\110\316\075\002\001\006\005\053\201\004\000\042\003 -\142\000\004\156\013\243\253\063\115\034\352\112\350\374\004\215 -\024\240\175\360\010\054\137\203\253\223\321\322\173\272\327\111 -\175\217\354\022\120\137\324\271\313\345\360\371\063\143\037\311 -\127\354\100\330\021\013\227\350\122\026\314\051\216\364\006\206 -\036\070\334\075\127\304\356\252\275\310\124\004\046\132\047\023 -\121\107\075\037\037\032\216\250\225\244\063\320\314\107\314\155 -\270\374\110\243\143\060\141\060\017\006\003\125\035\023\001\001 -\377\004\005\060\003\001\001\377\060\037\006\003\125\035\043\004 -\030\060\026\200\024\316\257\112\213\032\165\342\361\070\347\002 -\360\026\255\136\352\144\325\173\264\060\035\006\003\125\035\016 -\004\026\004\024\316\257\112\213\032\165\342\361\070\347\002\360 -\026\255\136\352\144\325\173\264\060\016\006\003\125\035\017\001 -\001\377\004\004\003\002\001\006\060\012\006\010\052\206\110\316 -\075\004\003\003\003\150\000\060\145\002\060\012\210\304\161\234 -\104\003\115\215\264\307\274\250\256\331\060\047\065\152\153\026 -\143\327\374\347\131\341\247\211\033\114\061\232\043\125\104\346 -\363\103\041\325\107\047\157\155\127\001\252\002\061\000\373\262 -\352\342\227\177\121\265\237\110\353\274\157\065\211\250\144\160 -\253\127\166\315\300\306\024\140\312\177\342\202\000\163\367\314 -\065\352\216\044\233\345\010\131\307\004\214\163\170\376 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "DIGITALSIGN GLOBAL ROOT ECDSA CA" -# Issuer: CN=DIGITALSIGN GLOBAL ROOT ECDSA CA,O=DigitalSign Certificadora Digital,C=PT -# Serial Number:36:2d:8f:72:88:a2:28:27:e4:00:ff:24:c6:2d:e4:eb:fa:9d:b6:e1 -# Subject: CN=DIGITALSIGN GLOBAL ROOT ECDSA CA,O=DigitalSign Certificadora Digital,C=PT -# Not Valid Before: Thu Jan 21 11:07:50 2021 -# Not Valid After : Mon Jan 15 11:07:50 2046 -# Fingerprint (SHA-256): 26:1D:71:14:AE:5F:8F:F2:D8:C7:20:9A:9D:E4:28:9E:6A:FC:9D:71:70:23:D8:54:50:90:91:99:F1:85:7C:FE -# Fingerprint (SHA1): 67:A8:08:EB:8F:88:F5:80:6C:05:45:1B:17:F3:D7:00:2F:D2:4A:8A -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "DIGITALSIGN GLOBAL ROOT ECDSA CA" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\147\250\010\353\217\210\365\200\154\005\105\033\027\363\327\000 -\057\322\112\212 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\252\055\241\316\377\041\302\210\313\132\036\214\341\311\222\217 -END -CKA_ISSUER MULTILINE_OCTAL -\060\144\061\013\060\011\006\003\125\004\006\023\002\120\124\061 -\052\060\050\006\003\125\004\012\014\041\104\151\147\151\164\141 -\154\123\151\147\156\040\103\145\162\164\151\146\151\143\141\144 -\157\162\141\040\104\151\147\151\164\141\154\061\051\060\047\006 -\003\125\004\003\014\040\104\111\107\111\124\101\114\123\111\107 -\116\040\107\114\117\102\101\114\040\122\117\117\124\040\105\103 -\104\123\101\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\066\055\217\162\210\242\050\047\344\000\377\044\306\055 -\344\353\372\235\266\341 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Security Communication ECC RootCA1" -# -# Issuer: CN=Security Communication ECC RootCA1,O="SECOM Trust Systems CO.,LTD.",C=JP -# Serial Number:00:d6:5d:9b:b3:78:81:2e:eb -# Subject: CN=Security Communication ECC RootCA1,O="SECOM Trust Systems CO.,LTD.",C=JP -# Not Valid Before: Thu Jun 16 05:15:28 2016 -# Not Valid After : Mon Jan 18 05:15:28 2038 -# Fingerprint (SHA-256): E7:4F:BD:A5:5B:D5:64:C4:73:A3:6B:44:1A:A7:99:C8:A6:8E:07:74:40:E8:28:8B:9F:A1:E5:0E:4B:BA:CA:11 -# Fingerprint (SHA1): B8:0E:26:A9:BF:D2:B2:3B:C0:EF:46:C9:BA:C7:BB:F6:1D:0D:41:41 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Security Communication ECC RootCA1" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\141\061\013\060\011\006\003\125\004\006\023\002\112\120\061 -\045\060\043\006\003\125\004\012\023\034\123\105\103\117\115\040 -\124\162\165\163\164\040\123\171\163\164\145\155\163\040\103\117 -\056\054\114\124\104\056\061\053\060\051\006\003\125\004\003\023 -\042\123\145\143\165\162\151\164\171\040\103\157\155\155\165\156 -\151\143\141\164\151\157\156\040\105\103\103\040\122\157\157\164 -\103\101\061 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\141\061\013\060\011\006\003\125\004\006\023\002\112\120\061 -\045\060\043\006\003\125\004\012\023\034\123\105\103\117\115\040 -\124\162\165\163\164\040\123\171\163\164\145\155\163\040\103\117 -\056\054\114\124\104\056\061\053\060\051\006\003\125\004\003\023 -\042\123\145\143\165\162\151\164\171\040\103\157\155\155\165\156 -\151\143\141\164\151\157\156\040\105\103\103\040\122\157\157\164 -\103\101\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\011\000\326\135\233\263\170\201\056\353 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\070\060\202\001\276\240\003\002\001\002\002\011\000 -\326\135\233\263\170\201\056\353\060\012\006\010\052\206\110\316 -\075\004\003\003\060\141\061\013\060\011\006\003\125\004\006\023 -\002\112\120\061\045\060\043\006\003\125\004\012\023\034\123\105 -\103\117\115\040\124\162\165\163\164\040\123\171\163\164\145\155 -\163\040\103\117\056\054\114\124\104\056\061\053\060\051\006\003 -\125\004\003\023\042\123\145\143\165\162\151\164\171\040\103\157 -\155\155\165\156\151\143\141\164\151\157\156\040\105\103\103\040 -\122\157\157\164\103\101\061\060\036\027\015\061\066\060\066\061 -\066\060\065\061\065\062\070\132\027\015\063\070\060\061\061\070 -\060\065\061\065\062\070\132\060\141\061\013\060\011\006\003\125 -\004\006\023\002\112\120\061\045\060\043\006\003\125\004\012\023 -\034\123\105\103\117\115\040\124\162\165\163\164\040\123\171\163 -\164\145\155\163\040\103\117\056\054\114\124\104\056\061\053\060 -\051\006\003\125\004\003\023\042\123\145\143\165\162\151\164\171 -\040\103\157\155\155\165\156\151\143\141\164\151\157\156\040\105 -\103\103\040\122\157\157\164\103\101\061\060\166\060\020\006\007 -\052\206\110\316\075\002\001\006\005\053\201\004\000\042\003\142 -\000\004\244\245\157\140\003\003\303\275\061\364\323\027\234\053 -\204\165\254\345\375\075\127\156\327\143\277\346\004\211\222\216 -\201\234\343\351\107\156\312\220\022\310\023\340\247\235\367\145 -\164\037\154\020\262\350\344\351\357\155\205\062\231\104\261\136 -\375\314\166\020\330\133\275\242\306\371\326\102\344\127\166\334 -\220\302\065\251\113\210\074\022\107\155\134\377\111\117\032\112 -\120\261\243\102\060\100\060\035\006\003\125\035\016\004\026\004 -\024\206\034\347\376\055\245\112\213\010\376\050\021\372\276\243 -\146\370\140\131\057\060\016\006\003\125\035\017\001\001\377\004 -\004\003\002\001\006\060\017\006\003\125\035\023\001\001\377\004 -\005\060\003\001\001\377\060\012\006\010\052\206\110\316\075\004 -\003\003\003\150\000\060\145\002\060\025\135\102\075\374\266\356 -\367\073\261\066\350\236\366\304\106\050\111\063\320\130\103\052 -\143\051\314\115\261\264\172\242\271\015\070\245\135\110\052\375 -\313\262\163\135\243\210\010\307\014\002\061\000\300\253\055\016 -\155\355\030\242\333\123\351\045\333\125\010\340\120\314\337\104 -\141\026\202\253\111\260\262\201\354\163\207\170\264\114\262\142 -\033\022\372\026\115\045\113\143\275\036\067\331 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Security Communication ECC RootCA1" -# Issuer: CN=Security Communication ECC RootCA1,O="SECOM Trust Systems CO.,LTD.",C=JP -# Serial Number:00:d6:5d:9b:b3:78:81:2e:eb -# Subject: CN=Security Communication ECC RootCA1,O="SECOM Trust Systems CO.,LTD.",C=JP -# Not Valid Before: Thu Jun 16 05:15:28 2016 -# Not Valid After : Mon Jan 18 05:15:28 2038 -# Fingerprint (SHA-256): E7:4F:BD:A5:5B:D5:64:C4:73:A3:6B:44:1A:A7:99:C8:A6:8E:07:74:40:E8:28:8B:9F:A1:E5:0E:4B:BA:CA:11 -# Fingerprint (SHA1): B8:0E:26:A9:BF:D2:B2:3B:C0:EF:46:C9:BA:C7:BB:F6:1D:0D:41:41 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Security Communication ECC RootCA1" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\270\016\046\251\277\322\262\073\300\357\106\311\272\307\273\366 -\035\015\101\101 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\176\103\260\222\150\354\005\103\114\230\253\135\065\056\176\206 -END -CKA_ISSUER MULTILINE_OCTAL -\060\141\061\013\060\011\006\003\125\004\006\023\002\112\120\061 -\045\060\043\006\003\125\004\012\023\034\123\105\103\117\115\040 -\124\162\165\163\164\040\123\171\163\164\145\155\163\040\103\117 -\056\054\114\124\104\056\061\053\060\051\006\003\125\004\003\023 -\042\123\145\143\165\162\151\164\171\040\103\157\155\155\165\156 -\151\143\141\164\151\157\156\040\105\103\103\040\122\157\157\164 -\103\101\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\011\000\326\135\233\263\170\201\056\353 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "BJCA Global Root CA1" -# -# Issuer: CN=BJCA Global Root CA1,O=BEIJING CERTIFICATE AUTHORITY,C=CN -# Serial Number:55:6f:65:e3:b4:d9:90:6a:1b:09:d1:6c:3e:c0:6c:20 -# Subject: CN=BJCA Global Root CA1,O=BEIJING CERTIFICATE AUTHORITY,C=CN -# Not Valid Before: Thu Dec 19 03:16:17 2019 -# Not Valid After : Mon Dec 12 03:16:17 2044 -# Fingerprint (SHA-256): F3:89:6F:88:FE:7C:0A:88:27:66:A7:FA:6A:D2:74:9F:B5:7A:7F:3E:98:FB:76:9C:1F:A7:B0:9C:2C:44:D5:AE -# Fingerprint (SHA1): D5:EC:8D:7B:4C:BA:79:F4:E7:E8:CB:9D:6B:AE:77:83:10:03:21:6A -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "BJCA Global Root CA1" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\124\061\013\060\011\006\003\125\004\006\023\002\103\116\061 -\046\060\044\006\003\125\004\012\014\035\102\105\111\112\111\116 -\107\040\103\105\122\124\111\106\111\103\101\124\105\040\101\125 -\124\110\117\122\111\124\131\061\035\060\033\006\003\125\004\003 -\014\024\102\112\103\101\040\107\154\157\142\141\154\040\122\157 -\157\164\040\103\101\061 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\124\061\013\060\011\006\003\125\004\006\023\002\103\116\061 -\046\060\044\006\003\125\004\012\014\035\102\105\111\112\111\116 -\107\040\103\105\122\124\111\106\111\103\101\124\105\040\101\125 -\124\110\117\122\111\124\131\061\035\060\033\006\003\125\004\003 -\014\024\102\112\103\101\040\107\154\157\142\141\154\040\122\157 -\157\164\040\103\101\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\125\157\145\343\264\331\220\152\033\011\321\154\076\300 -\154\040 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\164\060\202\003\134\240\003\002\001\002\002\020\125 -\157\145\343\264\331\220\152\033\011\321\154\076\300\154\040\060 -\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060\124 -\061\013\060\011\006\003\125\004\006\023\002\103\116\061\046\060 -\044\006\003\125\004\012\014\035\102\105\111\112\111\116\107\040 -\103\105\122\124\111\106\111\103\101\124\105\040\101\125\124\110 -\117\122\111\124\131\061\035\060\033\006\003\125\004\003\014\024 -\102\112\103\101\040\107\154\157\142\141\154\040\122\157\157\164 -\040\103\101\061\060\036\027\015\061\071\061\062\061\071\060\063 -\061\066\061\067\132\027\015\064\064\061\062\061\062\060\063\061 -\066\061\067\132\060\124\061\013\060\011\006\003\125\004\006\023 -\002\103\116\061\046\060\044\006\003\125\004\012\014\035\102\105 -\111\112\111\116\107\040\103\105\122\124\111\106\111\103\101\124 -\105\040\101\125\124\110\117\122\111\124\131\061\035\060\033\006 -\003\125\004\003\014\024\102\112\103\101\040\107\154\157\142\141 -\154\040\122\157\157\164\040\103\101\061\060\202\002\042\060\015 -\006\011\052\206\110\206\367\015\001\001\001\005\000\003\202\002 -\017\000\060\202\002\012\002\202\002\001\000\361\146\010\275\331 -\305\025\141\313\204\004\101\245\151\067\167\035\301\260\173\372 -\303\167\110\220\023\162\144\321\270\174\220\065\235\030\171\210 -\343\227\001\074\107\201\362\016\242\230\015\236\077\067\340\031 -\262\220\362\106\034\222\261\072\141\316\372\267\106\236\003\206 -\327\063\156\355\367\105\214\166\067\336\156\226\221\367\327\176 -\053\207\027\325\213\065\356\204\221\162\127\334\140\303\303\271 -\347\307\147\044\043\117\143\012\143\366\146\175\113\125\247\077 -\170\144\111\151\022\227\340\114\015\323\011\240\062\060\072\372 -\237\300\362\234\305\022\052\056\034\265\004\063\332\244\070\021 -\152\336\306\030\366\107\072\042\101\207\042\374\304\211\050\124 -\330\214\245\060\012\370\027\026\312\254\067\375\171\247\221\027 -\170\070\231\255\130\355\262\336\314\211\175\003\234\263\211\145 -\347\343\073\261\042\206\217\006\155\170\007\375\221\022\177\260 -\153\034\211\015\371\270\313\164\133\007\302\310\364\065\321\144 -\143\172\351\156\232\050\326\060\275\346\033\335\025\257\204\352 -\234\307\312\365\016\352\362\135\051\207\217\151\163\071\276\056 -\044\157\105\041\254\305\324\151\045\006\203\255\172\110\205\023 -\054\015\006\270\154\171\126\374\243\147\062\201\365\127\245\312 -\127\102\151\351\134\044\141\357\342\060\030\116\104\230\125\157 -\172\302\223\330\031\266\336\174\107\212\021\116\111\107\333\050 -\224\002\013\224\112\054\371\022\320\117\350\061\176\154\172\277 -\246\077\233\071\075\002\026\243\030\263\147\254\133\077\054\203 -\053\147\071\201\134\271\176\224\325\144\335\236\217\156\256\350 -\174\133\264\327\152\107\110\327\176\263\324\055\216\126\166\116 -\317\151\361\156\104\154\324\044\352\215\044\241\030\277\275\127 -\376\251\231\065\265\333\020\167\270\075\110\272\326\301\347\361 -\043\076\327\337\205\235\047\074\324\100\275\012\014\275\365\347 -\215\045\326\201\164\207\106\324\051\165\242\102\154\367\163\211 -\347\175\277\172\112\037\323\042\311\025\125\317\337\157\174\125 -\320\244\213\007\021\067\137\203\246\046\127\246\001\133\176\376 -\130\150\007\251\351\172\331\271\350\377\120\037\253\302\264\300 -\316\350\352\375\017\275\215\115\270\274\161\002\003\001\000\001 -\243\102\060\100\060\035\006\003\125\035\016\004\026\004\024\305 -\357\355\314\330\215\041\306\110\344\343\327\024\056\247\026\223 -\345\230\001\060\017\006\003\125\035\023\001\001\377\004\005\060 -\003\001\001\377\060\016\006\003\125\035\017\001\001\377\004\004 -\003\002\001\006\060\015\006\011\052\206\110\206\367\015\001\001 -\013\005\000\003\202\002\001\000\122\202\254\041\064\037\043\362 -\242\330\371\270\257\067\066\040\211\321\067\003\326\151\237\270 -\141\020\272\242\061\230\131\107\350\321\015\045\036\025\101\014 -\340\052\125\325\127\122\313\370\344\307\151\243\035\115\161\002 -\136\137\041\105\140\110\134\011\216\111\020\301\004\334\251\142 -\153\002\360\103\310\116\235\070\111\164\311\062\160\124\155\301 -\107\374\216\264\066\236\324\234\275\335\040\326\123\311\030\251 -\265\126\271\166\213\225\147\146\356\275\230\376\256\357\276\156 -\373\140\366\375\131\306\052\033\077\043\112\224\044\060\047\310 -\211\274\353\104\044\232\313\075\276\117\325\172\316\216\027\313 -\142\301\331\336\036\016\172\377\103\206\064\122\274\141\077\074 -\137\273\331\166\264\123\274\227\263\376\212\114\022\056\053\363 -\327\316\341\242\377\335\173\160\373\073\241\115\244\143\002\375 -\070\227\225\077\005\160\240\153\337\142\201\103\213\264\131\015 -\112\214\124\234\305\273\201\237\315\175\245\357\013\045\036\072 -\040\333\034\374\037\230\147\002\012\324\163\104\023\333\121\204 -\032\125\003\126\340\000\176\164\006\377\070\304\162\035\323\250 -\077\150\061\135\323\011\307\056\214\133\143\340\350\334\036\322 -\354\141\036\362\336\345\357\366\231\166\140\055\036\224\162\161 -\306\013\052\062\307\222\116\325\106\327\035\371\251\031\012\310 -\372\225\316\155\043\230\252\013\070\255\232\126\015\157\215\361 -\061\000\210\301\027\234\315\031\066\065\376\125\123\240\340\074 -\063\137\226\136\342\062\351\337\063\273\006\112\251\330\204\163 -\316\167\322\306\254\161\341\134\243\035\014\273\012\337\137\342 -\243\161\330\332\067\132\240\170\053\364\324\175\353\166\355\362 -\141\160\245\145\232\323\211\064\030\253\373\162\076\327\264\075 -\171\134\330\037\241\063\173\331\202\120\014\223\027\252\154\334 -\302\202\273\002\127\066\257\230\047\052\071\120\341\260\211\365 -\045\227\176\107\150\020\264\354\163\312\263\227\321\044\334\366 -\142\240\050\323\265\243\270\144\267\210\142\102\317\235\123\315 -\231\276\144\150\217\117\036\022\110\367\322\051\303\230\050\312 -\362\062\013\223\214\051\117\074\140\062\315\005\226\141\354\362 -\257\376\263\160\054\056\246\362 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "BJCA Global Root CA1" -# Issuer: CN=BJCA Global Root CA1,O=BEIJING CERTIFICATE AUTHORITY,C=CN -# Serial Number:55:6f:65:e3:b4:d9:90:6a:1b:09:d1:6c:3e:c0:6c:20 -# Subject: CN=BJCA Global Root CA1,O=BEIJING CERTIFICATE AUTHORITY,C=CN -# Not Valid Before: Thu Dec 19 03:16:17 2019 -# Not Valid After : Mon Dec 12 03:16:17 2044 -# Fingerprint (SHA-256): F3:89:6F:88:FE:7C:0A:88:27:66:A7:FA:6A:D2:74:9F:B5:7A:7F:3E:98:FB:76:9C:1F:A7:B0:9C:2C:44:D5:AE -# Fingerprint (SHA1): D5:EC:8D:7B:4C:BA:79:F4:E7:E8:CB:9D:6B:AE:77:83:10:03:21:6A -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "BJCA Global Root CA1" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\325\354\215\173\114\272\171\364\347\350\313\235\153\256\167\203 -\020\003\041\152 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\102\062\231\166\103\063\066\044\065\007\202\233\050\371\320\220 -END -CKA_ISSUER MULTILINE_OCTAL -\060\124\061\013\060\011\006\003\125\004\006\023\002\103\116\061 -\046\060\044\006\003\125\004\012\014\035\102\105\111\112\111\116 -\107\040\103\105\122\124\111\106\111\103\101\124\105\040\101\125 -\124\110\117\122\111\124\131\061\035\060\033\006\003\125\004\003 -\014\024\102\112\103\101\040\107\154\157\142\141\154\040\122\157 -\157\164\040\103\101\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\125\157\145\343\264\331\220\152\033\011\321\154\076\300 -\154\040 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "BJCA Global Root CA2" -# -# Issuer: CN=BJCA Global Root CA2,O=BEIJING CERTIFICATE AUTHORITY,C=CN -# Serial Number:2c:17:08:7d:64:2a:c0:fe:85:18:59:06:cf:b4:4a:eb -# Subject: CN=BJCA Global Root CA2,O=BEIJING CERTIFICATE AUTHORITY,C=CN -# Not Valid Before: Thu Dec 19 03:18:21 2019 -# Not Valid After : Mon Dec 12 03:18:21 2044 -# Fingerprint (SHA-256): 57:4D:F6:93:1E:27:80:39:66:7B:72:0A:FD:C1:60:0F:C2:7E:B6:6D:D3:09:29:79:FB:73:85:64:87:21:28:82 -# Fingerprint (SHA1): F4:27:86:EB:6E:B8:6D:88:31:67:02:FB:BA:66:A4:53:00:AA:7A:A6 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "BJCA Global Root CA2" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\124\061\013\060\011\006\003\125\004\006\023\002\103\116\061 -\046\060\044\006\003\125\004\012\014\035\102\105\111\112\111\116 -\107\040\103\105\122\124\111\106\111\103\101\124\105\040\101\125 -\124\110\117\122\111\124\131\061\035\060\033\006\003\125\004\003 -\014\024\102\112\103\101\040\107\154\157\142\141\154\040\122\157 -\157\164\040\103\101\062 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\124\061\013\060\011\006\003\125\004\006\023\002\103\116\061 -\046\060\044\006\003\125\004\012\014\035\102\105\111\112\111\116 -\107\040\103\105\122\124\111\106\111\103\101\124\105\040\101\125 -\124\110\117\122\111\124\131\061\035\060\033\006\003\125\004\003 -\014\024\102\112\103\101\040\107\154\157\142\141\154\040\122\157 -\157\164\040\103\101\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\054\027\010\175\144\052\300\376\205\030\131\006\317\264 -\112\353 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\045\060\202\001\253\240\003\002\001\002\002\020\054 -\027\010\175\144\052\300\376\205\030\131\006\317\264\112\353\060 -\012\006\010\052\206\110\316\075\004\003\003\060\124\061\013\060 -\011\006\003\125\004\006\023\002\103\116\061\046\060\044\006\003 -\125\004\012\014\035\102\105\111\112\111\116\107\040\103\105\122 -\124\111\106\111\103\101\124\105\040\101\125\124\110\117\122\111 -\124\131\061\035\060\033\006\003\125\004\003\014\024\102\112\103 -\101\040\107\154\157\142\141\154\040\122\157\157\164\040\103\101 -\062\060\036\027\015\061\071\061\062\061\071\060\063\061\070\062 -\061\132\027\015\064\064\061\062\061\062\060\063\061\070\062\061 -\132\060\124\061\013\060\011\006\003\125\004\006\023\002\103\116 -\061\046\060\044\006\003\125\004\012\014\035\102\105\111\112\111 -\116\107\040\103\105\122\124\111\106\111\103\101\124\105\040\101 -\125\124\110\117\122\111\124\131\061\035\060\033\006\003\125\004 -\003\014\024\102\112\103\101\040\107\154\157\142\141\154\040\122 -\157\157\164\040\103\101\062\060\166\060\020\006\007\052\206\110 -\316\075\002\001\006\005\053\201\004\000\042\003\142\000\004\235 -\313\200\221\215\123\147\265\271\120\261\003\370\345\111\037\101 -\042\011\260\121\122\130\326\053\064\217\305\022\106\024\305\213 -\057\054\204\377\054\156\250\325\361\011\343\003\041\024\304\103 -\075\174\301\054\304\113\152\112\315\351\207\340\175\366\042\276 -\372\112\121\270\060\212\375\341\336\030\022\012\366\107\267\347 -\027\277\047\212\324\101\114\226\074\140\226\301\375\025\034\243 -\102\060\100\060\035\006\003\125\035\016\004\026\004\024\322\112 -\261\121\177\006\360\321\202\037\116\156\137\253\203\374\110\324 -\260\221\060\017\006\003\125\035\023\001\001\377\004\005\060\003 -\001\001\377\060\016\006\003\125\035\017\001\001\377\004\004\003 -\002\001\006\060\012\006\010\052\206\110\316\075\004\003\003\003 -\150\000\060\145\002\060\032\274\133\327\376\251\322\124\016\112 -\135\322\155\261\100\334\364\103\325\322\112\231\031\022\126\200 -\367\203\064\341\065\116\110\155\004\017\127\061\060\060\055\261 -\252\235\003\070\333\006\002\061\000\313\314\207\123\313\172\337 -\040\121\163\220\300\250\133\141\320\305\120\071\375\205\376\301 -\343\170\370\246\326\113\275\233\207\217\017\345\326\123\226\253 -\074\310\100\332\141\367\123\243\367 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "BJCA Global Root CA2" -# Issuer: CN=BJCA Global Root CA2,O=BEIJING CERTIFICATE AUTHORITY,C=CN -# Serial Number:2c:17:08:7d:64:2a:c0:fe:85:18:59:06:cf:b4:4a:eb -# Subject: CN=BJCA Global Root CA2,O=BEIJING CERTIFICATE AUTHORITY,C=CN -# Not Valid Before: Thu Dec 19 03:18:21 2019 -# Not Valid After : Mon Dec 12 03:18:21 2044 -# Fingerprint (SHA-256): 57:4D:F6:93:1E:27:80:39:66:7B:72:0A:FD:C1:60:0F:C2:7E:B6:6D:D3:09:29:79:FB:73:85:64:87:21:28:82 -# Fingerprint (SHA1): F4:27:86:EB:6E:B8:6D:88:31:67:02:FB:BA:66:A4:53:00:AA:7A:A6 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "BJCA Global Root CA2" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\364\047\206\353\156\270\155\210\061\147\002\373\272\146\244\123 -\000\252\172\246 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\136\012\366\107\137\246\024\350\021\001\225\077\115\001\353\074 -END -CKA_ISSUER MULTILINE_OCTAL -\060\124\061\013\060\011\006\003\125\004\006\023\002\103\116\061 -\046\060\044\006\003\125\004\012\014\035\102\105\111\112\111\116 -\107\040\103\105\122\124\111\106\111\103\101\124\105\040\101\125 -\124\110\117\122\111\124\131\061\035\060\033\006\003\125\004\003 -\014\024\102\112\103\101\040\107\154\157\142\141\154\040\122\157 -\157\164\040\103\101\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\054\027\010\175\144\052\300\376\205\030\131\006\317\264 -\112\353 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "LAWtrust Root CA2 (4096)" -# -# Issuer: CN=LAWtrust Root CA2 (4096),O=LAWtrust,C=ZA -# Serial Number: 1427795633 (0x551a6eb1) -# Subject: CN=LAWtrust Root CA2 (4096),O=LAWtrust,C=ZA -# Not Valid Before: Tue Feb 14 09:19:38 2023 -# Not Valid After : Fri Feb 14 09:49:38 2053 -# Fingerprint (SHA-256): 48:E1:CF:9E:43:B6:88:A5:10:44:16:0F:46:D7:73:B8:27:7F:E4:5B:EA:AD:0E:4D:F9:0D:19:74:38:2F:EA:99 -# Fingerprint (SHA1): EC:A2:D5:30:A9:AB:2C:7D:0E:75:61:64:4E:0A:E0:16:A1:54:38:7D -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "LAWtrust Root CA2 (4096)" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\103\061\013\060\011\006\003\125\004\006\023\002\132\101\061 -\021\060\017\006\003\125\004\012\023\010\114\101\127\164\162\165 -\163\164\061\041\060\037\006\003\125\004\003\023\030\114\101\127 -\164\162\165\163\164\040\122\157\157\164\040\103\101\062\040\050 -\064\060\071\066\051 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\103\061\013\060\011\006\003\125\004\006\023\002\132\101\061 -\021\060\017\006\003\125\004\012\023\010\114\101\127\164\162\165 -\163\164\061\041\060\037\006\003\125\004\003\023\030\114\101\127 -\164\162\165\163\164\040\122\157\157\164\040\103\101\062\040\050 -\064\060\071\066\051 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\004\125\032\156\261 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\230\060\202\003\200\240\003\002\001\002\002\004\125 -\032\156\261\060\015\006\011\052\206\110\206\367\015\001\001\013 -\005\000\060\103\061\013\060\011\006\003\125\004\006\023\002\132 -\101\061\021\060\017\006\003\125\004\012\023\010\114\101\127\164 -\162\165\163\164\061\041\060\037\006\003\125\004\003\023\030\114 -\101\127\164\162\165\163\164\040\122\157\157\164\040\103\101\062 -\040\050\064\060\071\066\051\060\040\027\015\062\063\060\062\061 -\064\060\071\061\071\063\070\132\030\017\062\060\065\063\060\062 -\061\064\060\071\064\071\063\070\132\060\103\061\013\060\011\006 -\003\125\004\006\023\002\132\101\061\021\060\017\006\003\125\004 -\012\023\010\114\101\127\164\162\165\163\164\061\041\060\037\006 -\003\125\004\003\023\030\114\101\127\164\162\165\163\164\040\122 -\157\157\164\040\103\101\062\040\050\064\060\071\066\051\060\202 -\002\042\060\015\006\011\052\206\110\206\367\015\001\001\001\005 -\000\003\202\002\017\000\060\202\002\012\002\202\002\001\000\314 -\027\313\053\103\272\154\371\311\223\212\145\015\022\114\354\047 -\024\267\023\171\340\324\325\055\030\126\361\371\352\052\020\026 -\116\154\104\307\152\145\106\363\232\211\065\321\207\370\063\211 -\057\210\011\032\222\020\221\220\301\153\237\016\156\177\046\212 -\023\135\030\254\150\001\015\020\170\145\160\330\216\217\204\132 -\227\060\030\320\021\016\112\215\122\020\245\201\053\121\050\365 -\143\304\266\354\100\263\001\345\255\167\275\345\070\357\274\215 -\263\335\031\240\173\015\215\264\333\152\373\045\063\132\372\221 -\257\304\161\105\060\370\210\051\173\313\277\325\272\047\004\216 -\335\262\000\367\312\134\231\065\024\352\375\165\006\025\010\273 -\312\127\150\373\077\373\264\064\163\143\321\325\343\310\070\132 -\151\175\152\172\104\014\015\212\116\355\222\035\020\217\073\042 -\054\266\337\355\305\306\360\211\171\124\145\136\137\033\275\217 -\175\337\271\267\355\353\344\305\007\321\147\074\225\073\221\376 -\102\172\122\100\200\004\322\071\127\113\364\222\175\377\233\357 -\345\235\311\011\262\221\022\070\246\051\010\073\256\353\312\314 -\355\115\347\116\041\001\007\374\157\062\316\151\214\204\122\306 -\167\352\047\060\012\336\245\257\060\053\150\037\254\324\354\041 -\255\042\111\166\316\017\302\362\007\052\371\152\022\203\232\073 -\004\256\031\172\376\241\206\044\372\101\136\045\174\100\254\047 -\266\343\051\066\157\065\342\127\320\031\130\337\377\144\366\303 -\001\111\166\333\053\276\274\271\117\024\012\325\033\130\041\366 -\034\056\000\174\370\224\265\313\067\032\024\344\062\271\026\324 -\140\354\005\252\137\062\372\152\043\022\254\324\020\273\322\242 -\202\264\113\016\213\160\047\252\326\007\301\147\210\372\204\303 -\010\311\212\204\310\322\067\162\201\017\215\026\112\344\327\065 -\121\245\070\017\214\204\113\225\066\300\365\327\235\340\135\217 -\253\221\356\000\010\271\235\122\037\354\370\231\273\171\126\261 -\111\332\322\345\330\141\213\133\257\360\253\067\305\173\032\216 -\206\276\176\305\173\025\036\141\150\350\013\207\213\163\111\241 -\027\163\176\051\170\216\312\340\101\057\165\163\164\242\227\072 -\177\367\056\164\011\270\114\140\213\106\066\031\020\055\235\002 -\003\001\000\001\243\201\221\060\201\216\060\017\006\003\125\035 -\023\001\001\377\004\005\060\003\001\001\377\060\016\006\003\125 -\035\017\001\001\377\004\004\003\002\001\006\060\053\006\003\125 -\035\020\004\044\060\042\200\017\062\060\062\063\060\062\061\064 -\060\071\061\071\063\070\132\201\017\062\060\065\063\060\062\061 -\064\060\071\064\071\063\070\132\060\037\006\003\125\035\043\004 -\030\060\026\200\024\327\326\126\142\134\077\027\201\346\163\104 -\051\365\121\005\357\013\140\067\254\060\035\006\003\125\035\016 -\004\026\004\024\327\326\126\142\134\077\027\201\346\163\104\051 -\365\121\005\357\013\140\067\254\060\015\006\011\052\206\110\206 -\367\015\001\001\013\005\000\003\202\002\001\000\111\234\051\376 -\075\354\236\105\177\253\076\074\376\043\157\067\076\167\247\123 -\377\170\237\374\111\104\200\127\146\234\156\332\171\377\315\105 -\255\114\223\277\265\131\306\351\020\267\345\370\214\373\207\305 -\036\213\330\263\077\002\226\012\273\212\216\357\327\264\300\203 -\040\070\227\131\105\144\374\366\167\023\362\011\327\241\310\070 -\164\010\352\371\110\114\372\037\004\234\264\377\354\156\126\066 -\162\223\154\225\076\054\137\336\017\013\253\311\314\025\076\026 -\217\146\374\262\020\270\241\321\264\336\300\143\031\314\357\123 -\252\165\066\042\213\045\037\277\233\310\327\301\137\354\246\067 -\011\252\173\142\274\366\042\055\361\326\130\335\214\273\122\364 -\013\247\166\251\172\173\032\215\334\255\232\201\142\056\206\005 -\220\162\107\057\241\311\147\204\260\015\154\260\270\233\026\267 -\320\231\024\057\234\022\233\043\250\215\246\103\036\351\345\055 -\345\170\247\037\144\224\144\266\167\262\250\134\373\011\253\051 -\353\036\155\165\321\366\320\305\245\303\035\237\036\363\032\055 -\262\310\037\345\050\012\156\363\137\375\332\346\043\241\166\220 -\134\113\230\001\202\054\356\107\055\002\032\137\177\064\305\151 -\265\162\255\076\363\317\236\155\370\051\350\021\047\053\340\131 -\013\033\141\353\112\312\151\245\244\325\315\121\033\224\216\171 -\315\337\366\256\164\135\261\054\033\206\123\376\321\060\006\101 -\064\007\142\202\114\364\176\307\207\164\016\260\041\036\011\040 -\200\301\263\025\075\106\155\323\361\006\222\077\357\240\225\212 -\034\156\167\061\266\353\170\051\014\173\356\202\245\117\176\244 -\051\136\236\252\055\370\216\300\363\374\015\006\205\233\116\334 -\367\342\011\174\320\024\121\036\172\263\043\257\372\321\141\052 -\145\265\001\331\270\343\007\312\044\166\322\360\112\276\357\206 -\004\200\102\025\160\021\150\176\327\307\273\376\347\116\233\234 -\225\245\034\112\244\311\320\011\214\252\316\110\322\036\222\227 -\327\021\351\355\146\314\067\334\365\327\033\164\233\246\352\102 -\254\135\062\340\130\364\201\107\377\322\022\342\176\034\334\111 -\166\226\303\035\237\113\312\134\052\067\133\075\212\321\070\233 -\041\332\343\277\105\103\323\340\130\167\037\050 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "LAWtrust Root CA2 (4096)" -# Issuer: CN=LAWtrust Root CA2 (4096),O=LAWtrust,C=ZA -# Serial Number: 1427795633 (0x551a6eb1) -# Subject: CN=LAWtrust Root CA2 (4096),O=LAWtrust,C=ZA -# Not Valid Before: Tue Feb 14 09:19:38 2023 -# Not Valid After : Fri Feb 14 09:49:38 2053 -# Fingerprint (SHA-256): 48:E1:CF:9E:43:B6:88:A5:10:44:16:0F:46:D7:73:B8:27:7F:E4:5B:EA:AD:0E:4D:F9:0D:19:74:38:2F:EA:99 -# Fingerprint (SHA1): EC:A2:D5:30:A9:AB:2C:7D:0E:75:61:64:4E:0A:E0:16:A1:54:38:7D -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "LAWtrust Root CA2 (4096)" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\354\242\325\060\251\253\054\175\016\165\141\144\116\012\340\026 -\241\124\070\175 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\257\035\306\323\105\305\353\365\246\141\043\060\075\056\021\261 -END -CKA_ISSUER MULTILINE_OCTAL -\060\103\061\013\060\011\006\003\125\004\006\023\002\132\101\061 -\021\060\017\006\003\125\004\012\023\010\114\101\127\164\162\165 -\163\164\061\041\060\037\006\003\125\004\003\023\030\114\101\127 -\164\162\165\163\164\040\122\157\157\164\040\103\101\062\040\050 -\064\060\071\066\051 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\004\125\032\156\261 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Sectigo Public Email Protection Root E46" -# -# Issuer: CN=Sectigo Public Email Protection Root E46,O=Sectigo Limited,C=GB -# Serial Number:6e:f5:d3:a7:41:8e:a0:59:40:a7:30:6b:d2:40:65:56 -# Subject: CN=Sectigo Public Email Protection Root E46,O=Sectigo Limited,C=GB -# Not Valid Before: Mon Mar 22 00:00:00 2021 -# Not Valid After : Wed Mar 21 23:59:59 2046 -# Fingerprint (SHA-256): 22:D9:59:92:34:D6:0F:1D:4B:C7:C7:E9:6F:43:FA:55:5B:07:30:1F:D4:75:17:50:89:DA:FB:8C:25:E4:77:B3 -# Fingerprint (SHA1): 3A:C5:C3:78:34:5B:E1:82:92:46:ED:17:86:B3:93:91:7B:51:F2:14 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Sectigo Public Email Protection Root E46" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\132\061\013\060\011\006\003\125\004\006\023\002\107\102\061 -\030\060\026\006\003\125\004\012\023\017\123\145\143\164\151\147 -\157\040\114\151\155\151\164\145\144\061\061\060\057\006\003\125 -\004\003\023\050\123\145\143\164\151\147\157\040\120\165\142\154 -\151\143\040\105\155\141\151\154\040\120\162\157\164\145\143\164 -\151\157\156\040\122\157\157\164\040\105\064\066 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\132\061\013\060\011\006\003\125\004\006\023\002\107\102\061 -\030\060\026\006\003\125\004\012\023\017\123\145\143\164\151\147 -\157\040\114\151\155\151\164\145\144\061\061\060\057\006\003\125 -\004\003\023\050\123\145\143\164\151\147\157\040\120\165\142\154 -\151\143\040\105\155\141\151\154\040\120\162\157\164\145\143\164 -\151\157\156\040\122\157\157\164\040\105\064\066 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\156\365\323\247\101\216\240\131\100\247\060\153\322\100 -\145\126 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\061\060\202\001\267\240\003\002\001\002\002\020\156 -\365\323\247\101\216\240\131\100\247\060\153\322\100\145\126\060 -\012\006\010\052\206\110\316\075\004\003\003\060\132\061\013\060 -\011\006\003\125\004\006\023\002\107\102\061\030\060\026\006\003 -\125\004\012\023\017\123\145\143\164\151\147\157\040\114\151\155 -\151\164\145\144\061\061\060\057\006\003\125\004\003\023\050\123 -\145\143\164\151\147\157\040\120\165\142\154\151\143\040\105\155 -\141\151\154\040\120\162\157\164\145\143\164\151\157\156\040\122 -\157\157\164\040\105\064\066\060\036\027\015\062\061\060\063\062 -\062\060\060\060\060\060\060\132\027\015\064\066\060\063\062\061 -\062\063\065\071\065\071\132\060\132\061\013\060\011\006\003\125 -\004\006\023\002\107\102\061\030\060\026\006\003\125\004\012\023 -\017\123\145\143\164\151\147\157\040\114\151\155\151\164\145\144 -\061\061\060\057\006\003\125\004\003\023\050\123\145\143\164\151 -\147\157\040\120\165\142\154\151\143\040\105\155\141\151\154\040 -\120\162\157\164\145\143\164\151\157\156\040\122\157\157\164\040 -\105\064\066\060\166\060\020\006\007\052\206\110\316\075\002\001 -\006\005\053\201\004\000\042\003\142\000\004\270\247\122\224\365 -\076\005\260\033\366\037\261\323\176\271\344\005\146\124\200\316 -\154\245\150\175\344\123\122\333\202\372\304\206\337\103\170\367 -\310\255\026\274\077\170\062\313\153\323\111\326\104\345\263\176 -\237\173\246\306\054\362\342\266\323\211\260\232\074\113\316\211 -\113\306\306\313\072\111\140\017\106\274\155\116\172\234\311\233 -\205\173\012\266\260\107\302\210\343\324\321\243\102\060\100\060 -\035\006\003\125\035\016\004\026\004\024\055\116\214\247\302\043 -\262\127\251\006\153\076\153\053\211\363\303\136\107\316\060\016 -\006\003\125\035\017\001\001\377\004\004\003\002\001\206\060\017 -\006\003\125\035\023\001\001\377\004\005\060\003\001\001\377\060 -\012\006\010\052\206\110\316\075\004\003\003\003\150\000\060\145 -\002\061\000\222\235\032\131\143\105\130\216\033\026\344\175\172 -\154\066\110\060\037\053\162\347\220\063\064\375\044\242\306\006 -\214\157\073\062\127\132\370\376\306\111\022\123\232\331\020\262 -\231\121\162\002\060\005\045\052\063\041\374\223\346\042\242\314 -\160\125\050\065\126\242\007\304\041\204\043\032\114\114\231\120 -\231\222\024\313\112\334\126\373\365\323\217\152\054\365\161\072 -\370\213\073\003\236 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Sectigo Public Email Protection Root E46" -# Issuer: CN=Sectigo Public Email Protection Root E46,O=Sectigo Limited,C=GB -# Serial Number:6e:f5:d3:a7:41:8e:a0:59:40:a7:30:6b:d2:40:65:56 -# Subject: CN=Sectigo Public Email Protection Root E46,O=Sectigo Limited,C=GB -# Not Valid Before: Mon Mar 22 00:00:00 2021 -# Not Valid After : Wed Mar 21 23:59:59 2046 -# Fingerprint (SHA-256): 22:D9:59:92:34:D6:0F:1D:4B:C7:C7:E9:6F:43:FA:55:5B:07:30:1F:D4:75:17:50:89:DA:FB:8C:25:E4:77:B3 -# Fingerprint (SHA1): 3A:C5:C3:78:34:5B:E1:82:92:46:ED:17:86:B3:93:91:7B:51:F2:14 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Sectigo Public Email Protection Root E46" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\072\305\303\170\064\133\341\202\222\106\355\027\206\263\223\221 -\173\121\362\024 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\271\032\257\054\211\226\100\140\047\006\073\241\177\335\211\323 -END -CKA_ISSUER MULTILINE_OCTAL -\060\132\061\013\060\011\006\003\125\004\006\023\002\107\102\061 -\030\060\026\006\003\125\004\012\023\017\123\145\143\164\151\147 -\157\040\114\151\155\151\164\145\144\061\061\060\057\006\003\125 -\004\003\023\050\123\145\143\164\151\147\157\040\120\165\142\154 -\151\143\040\105\155\141\151\154\040\120\162\157\164\145\143\164 -\151\157\156\040\122\157\157\164\040\105\064\066 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\156\365\323\247\101\216\240\131\100\247\060\153\322\100 -\145\126 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Sectigo Public Email Protection Root R46" -# -# Issuer: CN=Sectigo Public Email Protection Root R46,O=Sectigo Limited,C=GB -# Serial Number:1d:44:9e:b9:0d:83:91:74:ae:dd:f2:eb:88:b7:a6:a3 -# Subject: CN=Sectigo Public Email Protection Root R46,O=Sectigo Limited,C=GB -# Not Valid Before: Mon Mar 22 00:00:00 2021 -# Not Valid After : Wed Mar 21 23:59:59 2046 -# Fingerprint (SHA-256): D5:91:7A:77:91:EB:7C:F2:0A:2E:57:EB:98:28:4A:67:B2:8A:57:E8:91:82:DA:53:D5:46:67:8C:9F:DE:2B:4F -# Fingerprint (SHA1): D3:7B:8B:0A:E8:42:44:FB:6B:80:38:EE:AE:91:80:26:1A:48:70:66 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Sectigo Public Email Protection Root R46" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\132\061\013\060\011\006\003\125\004\006\023\002\107\102\061 -\030\060\026\006\003\125\004\012\023\017\123\145\143\164\151\147 -\157\040\114\151\155\151\164\145\144\061\061\060\057\006\003\125 -\004\003\023\050\123\145\143\164\151\147\157\040\120\165\142\154 -\151\143\040\105\155\141\151\154\040\120\162\157\164\145\143\164 -\151\157\156\040\122\157\157\164\040\122\064\066 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\132\061\013\060\011\006\003\125\004\006\023\002\107\102\061 -\030\060\026\006\003\125\004\012\023\017\123\145\143\164\151\147 -\157\040\114\151\155\151\164\145\144\061\061\060\057\006\003\125 -\004\003\023\050\123\145\143\164\151\147\157\040\120\165\142\154 -\151\143\040\105\155\141\151\154\040\120\162\157\164\145\143\164 -\151\157\156\040\122\157\157\164\040\122\064\066 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\035\104\236\271\015\203\221\164\256\335\362\353\210\267 -\246\243 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\200\060\202\003\150\240\003\002\001\002\002\020\035 -\104\236\271\015\203\221\164\256\335\362\353\210\267\246\243\060 -\015\006\011\052\206\110\206\367\015\001\001\014\005\000\060\132 -\061\013\060\011\006\003\125\004\006\023\002\107\102\061\030\060 -\026\006\003\125\004\012\023\017\123\145\143\164\151\147\157\040 -\114\151\155\151\164\145\144\061\061\060\057\006\003\125\004\003 -\023\050\123\145\143\164\151\147\157\040\120\165\142\154\151\143 -\040\105\155\141\151\154\040\120\162\157\164\145\143\164\151\157 -\156\040\122\157\157\164\040\122\064\066\060\036\027\015\062\061 -\060\063\062\062\060\060\060\060\060\060\132\027\015\064\066\060 -\063\062\061\062\063\065\071\065\071\132\060\132\061\013\060\011 -\006\003\125\004\006\023\002\107\102\061\030\060\026\006\003\125 -\004\012\023\017\123\145\143\164\151\147\157\040\114\151\155\151 -\164\145\144\061\061\060\057\006\003\125\004\003\023\050\123\145 -\143\164\151\147\157\040\120\165\142\154\151\143\040\105\155\141 -\151\154\040\120\162\157\164\145\143\164\151\157\156\040\122\157 -\157\164\040\122\064\066\060\202\002\042\060\015\006\011\052\206 -\110\206\367\015\001\001\001\005\000\003\202\002\017\000\060\202 -\002\012\002\202\002\001\000\221\345\033\372\252\155\067\053\165 -\307\056\137\024\245\333\054\227\266\054\106\217\151\331\354\226 -\055\363\035\132\276\323\035\043\346\150\011\377\112\021\163\032 -\256\147\237\166\232\322\347\354\270\331\137\053\371\046\126\121 -\257\166\235\251\374\027\357\062\012\320\043\074\272\054\117\107 -\203\354\235\005\150\102\136\006\340\325\350\053\150\110\227\262 -\372\363\244\161\065\175\064\233\027\213\177\115\015\333\334\117 -\005\114\224\142\277\065\372\057\310\247\034\146\331\161\137\345 -\346\132\125\312\253\364\270\167\031\105\120\105\116\112\253\333 -\236\146\301\031\267\067\102\310\126\245\100\022\371\063\350\070 -\105\072\306\204\243\002\216\057\044\260\303\101\205\007\111\234 -\317\334\321\362\046\157\355\063\034\063\147\052\105\067\331\205 -\145\042\032\261\265\020\122\011\153\003\306\037\160\075\221\304 -\175\220\075\355\146\370\220\377\045\340\355\222\242\213\061\051 -\255\234\022\146\170\143\235\127\354\373\013\336\216\334\213\313 -\072\251\167\364\272\345\354\070\214\213\346\023\146\247\151\130 -\303\202\032\032\315\361\237\330\123\222\116\111\175\251\105\347 -\361\103\041\132\267\076\100\315\143\211\317\331\277\307\120\013 -\341\274\347\210\226\255\236\324\027\332\135\317\340\221\375\246 -\020\324\271\003\201\233\151\254\373\204\250\201\065\353\033\353 -\150\154\174\140\076\303\337\311\264\256\164\035\110\255\335\156 -\021\206\341\052\152\066\026\256\310\316\274\333\130\374\100\223 -\100\330\216\123\227\302\254\042\070\345\210\061\263\056\241\357 -\354\340\102\015\352\377\223\126\112\006\244\233\114\002\150\144 -\217\126\120\301\201\005\375\313\333\305\327\025\362\153\265\166 -\303\243\371\062\316\312\265\112\251\033\175\031\334\177\307\152 -\176\225\354\266\270\215\375\225\112\234\243\053\155\213\361\160 -\345\107\053\000\134\344\271\236\324\370\331\130\051\320\313\340 -\050\142\154\256\234\142\342\314\274\066\223\101\365\357\376\106 -\142\225\260\127\112\164\054\107\122\051\235\335\242\241\117\102 -\302\222\316\055\120\122\136\214\012\241\367\330\235\305\370\375 -\066\207\116\127\375\150\241\137\231\203\034\360\265\335\350\222 -\323\145\100\125\312\226\205\002\003\001\000\001\243\102\060\100 -\060\035\006\003\125\035\016\004\026\004\024\247\327\225\167\353 -\112\303\047\315\223\276\067\114\046\204\041\024\175\135\230\060 -\016\006\003\125\035\017\001\001\377\004\004\003\002\001\206\060 -\017\006\003\125\035\023\001\001\377\004\005\060\003\001\001\377 -\060\015\006\011\052\206\110\206\367\015\001\001\014\005\000\003 -\202\002\001\000\064\322\361\025\363\223\001\324\162\213\360\253 -\010\037\023\074\163\264\260\253\350\170\331\154\272\232\257\046 -\354\020\200\345\015\123\061\335\343\372\214\121\042\044\063\067 -\270\030\176\072\372\130\350\064\345\214\340\241\037\011\101\322 -\067\077\314\313\011\065\102\210\351\374\021\327\317\102\252\244 -\160\266\161\301\123\275\305\164\257\304\042\044\143\317\142\202 -\175\311\313\121\301\210\220\155\133\134\276\373\231\250\272\266 -\206\260\351\146\013\345\033\153\257\352\053\206\247\337\250\043 -\114\226\077\117\127\102\030\025\203\103\361\206\046\267\052\003 -\316\013\235\350\245\150\036\214\157\275\205\343\033\121\217\347 -\027\057\053\320\326\170\302\055\335\162\210\324\145\236\372\231 -\324\176\347\227\012\222\001\232\245\251\204\072\014\052\164\075 -\063\030\310\207\367\350\244\365\206\102\071\375\153\165\051\374 -\000\006\254\242\245\032\124\216\351\120\111\027\146\257\113\004 -\055\233\224\200\245\124\253\214\127\027\104\237\017\326\150\144 -\162\264\113\036\001\307\331\233\224\331\203\231\257\022\005\021 -\243\230\042\322\362\127\312\044\371\272\070\025\022\110\272\143 -\073\374\213\225\170\326\162\007\126\314\315\374\235\034\320\305 -\144\073\143\064\317\004\231\212\267\060\171\172\266\362\306\325 -\331\124\172\207\013\176\116\367\204\354\024\363\210\026\022\361 -\325\256\012\032\011\356\206\255\345\253\375\256\303\051\171\164 -\303\001\137\021\233\337\165\231\306\112\367\233\217\154\111\354 -\041\057\264\002\131\263\055\320\162\220\272\013\024\164\170\113 -\317\301\137\125\162\216\124\053\023\316\372\130\014\323\273\054 -\331\251\221\141\370\370\361\266\173\336\274\251\314\222\004\314 -\113\153\137\163\200\266\041\355\120\117\327\166\207\156\316\337 -\322\267\275\142\241\175\130\142\150\105\122\266\077\336\022\333 -\355\004\151\236\166\210\252\001\155\332\206\307\140\033\303\122 -\254\067\354\120\161\200\162\052\041\105\012\123\107\074\031\353 -\215\322\131\004\336\045\260\353\037\065\157\140\175\327\265\306 -\273\013\047\215\340\115\124\345\317\035\046\001\156\073\065\310 -\040\022\211\203\360\322\355\130\073\064\235\273\061\365\062\375 -\061\363\126\032 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Sectigo Public Email Protection Root R46" -# Issuer: CN=Sectigo Public Email Protection Root R46,O=Sectigo Limited,C=GB -# Serial Number:1d:44:9e:b9:0d:83:91:74:ae:dd:f2:eb:88:b7:a6:a3 -# Subject: CN=Sectigo Public Email Protection Root R46,O=Sectigo Limited,C=GB -# Not Valid Before: Mon Mar 22 00:00:00 2021 -# Not Valid After : Wed Mar 21 23:59:59 2046 -# Fingerprint (SHA-256): D5:91:7A:77:91:EB:7C:F2:0A:2E:57:EB:98:28:4A:67:B2:8A:57:E8:91:82:DA:53:D5:46:67:8C:9F:DE:2B:4F -# Fingerprint (SHA1): D3:7B:8B:0A:E8:42:44:FB:6B:80:38:EE:AE:91:80:26:1A:48:70:66 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Sectigo Public Email Protection Root R46" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\323\173\213\012\350\102\104\373\153\200\070\356\256\221\200\046 -\032\110\160\146 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\102\047\005\220\034\246\300\373\242\015\375\337\142\211\335\133 -END -CKA_ISSUER MULTILINE_OCTAL -\060\132\061\013\060\011\006\003\125\004\006\023\002\107\102\061 -\030\060\026\006\003\125\004\012\023\017\123\145\143\164\151\147 -\157\040\114\151\155\151\164\145\144\061\061\060\057\006\003\125 -\004\003\023\050\123\145\143\164\151\147\157\040\120\165\142\154 -\151\143\040\105\155\141\151\154\040\120\162\157\164\145\143\164 -\151\157\156\040\122\157\157\164\040\122\064\066 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\035\104\236\271\015\203\221\164\256\335\362\353\210\267 -\246\243 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Sectigo Public Server Authentication Root E46" -# -# Issuer: CN=Sectigo Public Server Authentication Root E46,O=Sectigo Limited,C=GB -# Serial Number:42:f2:cc:da:1b:69:37:44:5f:15:fe:75:28:10:b8:f4 -# Subject: CN=Sectigo Public Server Authentication Root E46,O=Sectigo Limited,C=GB -# Not Valid Before: Mon Mar 22 00:00:00 2021 -# Not Valid After : Wed Mar 21 23:59:59 2046 -# Fingerprint (SHA-256): C9:0F:26:F0:FB:1B:40:18:B2:22:27:51:9B:5C:A2:B5:3E:2C:A5:B3:BE:5C:F1:8E:FE:1B:EF:47:38:0C:53:83 -# Fingerprint (SHA1): EC:8A:39:6C:40:F0:2E:BC:42:75:D4:9F:AB:1C:1A:5B:67:BE:D2:9A -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Sectigo Public Server Authentication Root E46" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\137\061\013\060\011\006\003\125\004\006\023\002\107\102\061 -\030\060\026\006\003\125\004\012\023\017\123\145\143\164\151\147 -\157\040\114\151\155\151\164\145\144\061\066\060\064\006\003\125 -\004\003\023\055\123\145\143\164\151\147\157\040\120\165\142\154 -\151\143\040\123\145\162\166\145\162\040\101\165\164\150\145\156 -\164\151\143\141\164\151\157\156\040\122\157\157\164\040\105\064 -\066 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\137\061\013\060\011\006\003\125\004\006\023\002\107\102\061 -\030\060\026\006\003\125\004\012\023\017\123\145\143\164\151\147 -\157\040\114\151\155\151\164\145\144\061\066\060\064\006\003\125 -\004\003\023\055\123\145\143\164\151\147\157\040\120\165\142\154 -\151\143\040\123\145\162\166\145\162\040\101\165\164\150\145\156 -\164\151\143\141\164\151\157\156\040\122\157\157\164\040\105\064 -\066 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\102\362\314\332\033\151\067\104\137\025\376\165\050\020 -\270\364 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\072\060\202\001\301\240\003\002\001\002\002\020\102 -\362\314\332\033\151\067\104\137\025\376\165\050\020\270\364\060 -\012\006\010\052\206\110\316\075\004\003\003\060\137\061\013\060 -\011\006\003\125\004\006\023\002\107\102\061\030\060\026\006\003 -\125\004\012\023\017\123\145\143\164\151\147\157\040\114\151\155 -\151\164\145\144\061\066\060\064\006\003\125\004\003\023\055\123 -\145\143\164\151\147\157\040\120\165\142\154\151\143\040\123\145 -\162\166\145\162\040\101\165\164\150\145\156\164\151\143\141\164 -\151\157\156\040\122\157\157\164\040\105\064\066\060\036\027\015 -\062\061\060\063\062\062\060\060\060\060\060\060\132\027\015\064 -\066\060\063\062\061\062\063\065\071\065\071\132\060\137\061\013 -\060\011\006\003\125\004\006\023\002\107\102\061\030\060\026\006 -\003\125\004\012\023\017\123\145\143\164\151\147\157\040\114\151 -\155\151\164\145\144\061\066\060\064\006\003\125\004\003\023\055 -\123\145\143\164\151\147\157\040\120\165\142\154\151\143\040\123 -\145\162\166\145\162\040\101\165\164\150\145\156\164\151\143\141 -\164\151\157\156\040\122\157\157\164\040\105\064\066\060\166\060 -\020\006\007\052\206\110\316\075\002\001\006\005\053\201\004\000 -\042\003\142\000\004\166\372\231\251\156\040\355\371\327\167\343 -\007\073\250\333\075\137\070\350\253\125\246\126\117\326\110\352 -\354\177\055\252\303\262\305\171\354\231\141\177\020\171\307\002 -\132\371\004\067\365\064\065\053\167\316\177\040\217\122\243\000 -\211\354\325\247\242\155\133\343\113\222\223\240\200\365\001\224 -\334\360\150\007\036\315\356\376\045\122\265\040\103\034\033\376 -\353\031\316\103\243\243\102\060\100\060\035\006\003\125\035\016 -\004\026\004\024\321\042\332\114\131\361\113\137\046\070\252\235 -\326\356\353\015\303\373\251\141\060\016\006\003\125\035\017\001 -\001\377\004\004\003\002\001\206\060\017\006\003\125\035\023\001 -\001\377\004\005\060\003\001\001\377\060\012\006\010\052\206\110 -\316\075\004\003\003\003\147\000\060\144\002\060\047\356\244\132 -\250\041\273\351\107\227\224\211\245\164\040\155\171\117\310\275 -\223\136\130\030\373\055\032\000\152\311\270\075\320\244\117\104 -\107\224\001\126\242\370\063\045\014\102\337\252\002\060\035\352 -\341\056\210\056\341\371\247\035\002\062\116\362\237\154\125\164 -\343\256\256\373\245\032\356\355\322\374\302\003\021\353\105\134 -\140\020\075\134\177\231\003\133\155\124\110\001\212\163 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Sectigo Public Server Authentication Root E46" -# Issuer: CN=Sectigo Public Server Authentication Root E46,O=Sectigo Limited,C=GB -# Serial Number:42:f2:cc:da:1b:69:37:44:5f:15:fe:75:28:10:b8:f4 -# Subject: CN=Sectigo Public Server Authentication Root E46,O=Sectigo Limited,C=GB -# Not Valid Before: Mon Mar 22 00:00:00 2021 -# Not Valid After : Wed Mar 21 23:59:59 2046 -# Fingerprint (SHA-256): C9:0F:26:F0:FB:1B:40:18:B2:22:27:51:9B:5C:A2:B5:3E:2C:A5:B3:BE:5C:F1:8E:FE:1B:EF:47:38:0C:53:83 -# Fingerprint (SHA1): EC:8A:39:6C:40:F0:2E:BC:42:75:D4:9F:AB:1C:1A:5B:67:BE:D2:9A -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Sectigo Public Server Authentication Root E46" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\354\212\071\154\100\360\056\274\102\165\324\237\253\034\032\133 -\147\276\322\232 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\050\043\370\262\230\134\067\026\073\076\106\023\116\260\263\001 -END -CKA_ISSUER MULTILINE_OCTAL -\060\137\061\013\060\011\006\003\125\004\006\023\002\107\102\061 -\030\060\026\006\003\125\004\012\023\017\123\145\143\164\151\147 -\157\040\114\151\155\151\164\145\144\061\066\060\064\006\003\125 -\004\003\023\055\123\145\143\164\151\147\157\040\120\165\142\154 -\151\143\040\123\145\162\166\145\162\040\101\165\164\150\145\156 -\164\151\143\141\164\151\157\156\040\122\157\157\164\040\105\064 -\066 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\102\362\314\332\033\151\067\104\137\025\376\165\050\020 -\270\364 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Sectigo Public Server Authentication Root R46" -# -# Issuer: CN=Sectigo Public Server Authentication Root R46,O=Sectigo Limited,C=GB -# Serial Number:75:8d:fd:8b:ae:7c:07:00:fa:a9:25:a7:e1:c7:ad:14 -# Subject: CN=Sectigo Public Server Authentication Root R46,O=Sectigo Limited,C=GB -# Not Valid Before: Mon Mar 22 00:00:00 2021 -# Not Valid After : Wed Mar 21 23:59:59 2046 -# Fingerprint (SHA-256): 7B:B6:47:A6:2A:EE:AC:88:BF:25:7A:A5:22:D0:1F:FE:A3:95:E0:AB:45:C7:3F:93:F6:56:54:EC:38:F2:5A:06 -# Fingerprint (SHA1): AD:98:F9:F3:E4:7D:75:3B:65:D4:82:B3:A4:52:17:BB:6E:F5:E4:38 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Sectigo Public Server Authentication Root R46" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\137\061\013\060\011\006\003\125\004\006\023\002\107\102\061 -\030\060\026\006\003\125\004\012\023\017\123\145\143\164\151\147 -\157\040\114\151\155\151\164\145\144\061\066\060\064\006\003\125 -\004\003\023\055\123\145\143\164\151\147\157\040\120\165\142\154 -\151\143\040\123\145\162\166\145\162\040\101\165\164\150\145\156 -\164\151\143\141\164\151\157\156\040\122\157\157\164\040\122\064 -\066 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\137\061\013\060\011\006\003\125\004\006\023\002\107\102\061 -\030\060\026\006\003\125\004\012\023\017\123\145\143\164\151\147 -\157\040\114\151\155\151\164\145\144\061\066\060\064\006\003\125 -\004\003\023\055\123\145\143\164\151\147\157\040\120\165\142\154 -\151\143\040\123\145\162\166\145\162\040\101\165\164\150\145\156 -\164\151\143\141\164\151\157\156\040\122\157\157\164\040\122\064 -\066 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\165\215\375\213\256\174\007\000\372\251\045\247\341\307 -\255\024 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\212\060\202\003\162\240\003\002\001\002\002\020\165 -\215\375\213\256\174\007\000\372\251\045\247\341\307\255\024\060 -\015\006\011\052\206\110\206\367\015\001\001\014\005\000\060\137 -\061\013\060\011\006\003\125\004\006\023\002\107\102\061\030\060 -\026\006\003\125\004\012\023\017\123\145\143\164\151\147\157\040 -\114\151\155\151\164\145\144\061\066\060\064\006\003\125\004\003 -\023\055\123\145\143\164\151\147\157\040\120\165\142\154\151\143 -\040\123\145\162\166\145\162\040\101\165\164\150\145\156\164\151 -\143\141\164\151\157\156\040\122\157\157\164\040\122\064\066\060 -\036\027\015\062\061\060\063\062\062\060\060\060\060\060\060\132 -\027\015\064\066\060\063\062\061\062\063\065\071\065\071\132\060 -\137\061\013\060\011\006\003\125\004\006\023\002\107\102\061\030 -\060\026\006\003\125\004\012\023\017\123\145\143\164\151\147\157 -\040\114\151\155\151\164\145\144\061\066\060\064\006\003\125\004 -\003\023\055\123\145\143\164\151\147\157\040\120\165\142\154\151 -\143\040\123\145\162\166\145\162\040\101\165\164\150\145\156\164 -\151\143\141\164\151\157\156\040\122\157\157\164\040\122\064\066 -\060\202\002\042\060\015\006\011\052\206\110\206\367\015\001\001 -\001\005\000\003\202\002\017\000\060\202\002\012\002\202\002\001 -\000\223\276\325\066\122\165\330\001\043\240\034\107\102\111\356 -\143\266\267\041\375\304\225\325\110\053\046\174\024\123\020\332 -\171\375\053\267\055\244\324\054\372\352\062\335\111\302\271\275 -\017\110\075\173\132\230\124\257\236\135\061\164\117\007\374\120 -\041\335\244\317\150\117\033\022\143\155\045\231\114\052\231\363 -\110\060\141\372\201\174\036\247\010\112\334\076\053\034\037\030 -\114\161\252\065\214\255\370\156\350\073\112\331\345\224\002\326 -\211\204\023\252\155\310\117\063\314\120\226\067\222\063\334\137 -\210\347\237\124\331\110\360\230\103\326\146\375\237\027\070\103 -\305\001\121\013\327\343\043\017\024\135\133\024\347\113\276\335 -\364\310\332\003\067\321\326\071\241\041\121\060\203\260\155\327 -\060\116\226\133\221\360\160\044\253\277\105\201\144\103\015\275 -\041\072\057\074\351\236\015\313\040\265\102\047\314\332\157\233 -\356\144\060\220\071\315\223\145\201\041\061\265\043\120\063\067 -\042\343\070\355\370\061\060\314\105\376\142\371\321\135\062\171 -\102\207\337\152\314\126\031\100\115\316\252\273\371\265\166\111 -\224\361\047\370\221\245\203\345\006\263\143\016\200\334\340\022 -\125\200\246\073\146\264\071\207\055\310\360\320\321\024\351\344 -\015\115\016\366\135\127\162\305\073\034\107\126\235\342\325\373 -\201\141\214\314\115\200\220\064\133\267\327\024\165\334\330\004 -\110\237\300\301\050\210\264\351\034\312\247\261\361\126\267\173 -\111\114\131\345\040\025\250\204\002\051\372\070\224\151\232\111 -\006\217\315\037\171\024\027\022\014\203\172\336\037\261\227\356 -\371\227\170\050\244\310\104\222\351\175\046\005\246\130\162\233 -\171\023\330\021\137\256\305\070\142\064\150\262\206\060\216\370 -\220\141\236\062\154\365\007\066\315\242\114\156\354\212\066\355 -\362\346\231\025\104\160\303\174\274\234\071\300\264\341\153\367 -\203\045\043\127\331\022\200\345\111\360\165\017\357\215\353\034 -\233\124\050\264\041\074\374\174\012\377\357\173\153\165\377\213 -\035\240\031\005\253\372\370\053\201\102\350\070\272\273\373\252 -\375\075\340\363\312\337\116\227\227\051\355\363\030\126\351\245 -\226\254\275\303\220\230\262\340\371\242\324\246\107\103\174\155 -\317\002\003\001\000\001\243\102\060\100\060\035\006\003\125\035 -\016\004\026\004\024\126\163\130\144\225\371\222\032\260\022\052 -\004\142\171\241\100\025\210\041\111\060\016\006\003\125\035\017 -\001\001\377\004\004\003\002\001\206\060\017\006\003\125\035\023 -\001\001\377\004\005\060\003\001\001\377\060\015\006\011\052\206 -\110\206\367\015\001\001\014\005\000\003\202\002\001\000\057\134 -\231\074\374\006\136\214\224\056\160\352\322\062\061\215\264\360 -\121\325\274\012\363\144\237\007\136\325\301\163\150\144\172\242 -\271\016\350\371\135\205\055\250\067\105\252\050\364\226\005\120 -\140\251\111\176\237\342\231\066\051\023\104\107\152\235\125\040 -\074\330\233\361\003\062\272\332\100\241\163\352\203\241\267\104 -\246\016\231\001\233\344\274\177\276\023\224\176\312\246\036\166 -\200\066\075\204\006\213\063\046\145\155\312\176\236\376\037\214 -\130\070\173\032\203\261\017\274\027\021\273\346\006\314\143\372 -\201\362\201\114\332\013\020\153\241\372\325\050\245\317\006\100 -\026\377\173\175\030\136\071\022\244\123\236\176\062\102\020\246 -\041\221\251\034\116\027\174\204\274\237\214\321\350\337\346\121 -\271\066\107\077\220\271\307\274\002\334\133\034\117\016\110\301 -\045\203\234\012\077\236\261\003\063\022\032\047\254\367\042\154 -\044\321\001\101\370\130\003\376\045\150\042\037\232\132\074\174 -\154\236\165\110\363\201\361\146\147\156\114\202\300\356\272\127 -\016\030\357\056\232\367\022\330\240\153\351\005\245\241\351\150 -\370\274\114\077\022\036\105\350\122\300\243\277\022\047\171\271 -\314\061\074\303\366\072\042\026\003\240\311\217\146\244\133\242 -\115\326\201\045\006\351\166\244\000\012\076\313\315\065\233\340 -\341\070\313\140\123\206\050\102\101\034\104\127\350\250\255\253 -\105\343\045\020\274\333\076\145\101\373\033\246\227\017\353\271 -\164\171\371\036\274\035\127\015\107\257\303\057\237\207\106\247 -\353\046\132\017\126\143\265\142\140\156\000\373\343\047\021\042 -\347\376\231\217\064\365\271\350\303\221\162\275\330\303\036\271 -\056\362\221\104\121\320\127\315\014\064\325\110\041\277\333\023 -\361\146\045\103\122\322\160\042\066\315\237\304\034\165\040\255 -\143\162\143\006\017\016\047\316\322\152\015\274\265\071\032\351 -\321\166\172\321\134\344\347\111\111\055\125\067\150\360\032\072 -\230\076\124\027\207\124\351\246\047\120\211\173\040\057\077\377 -\277\241\213\112\107\230\377\053\173\111\076\303\051\106\140\030 -\102\253\063\051\272\300\051\271\023\211\323\210\212\071\101\073 -\311\375\246\355\037\364\140\143\337\322\055\125\001\213 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Sectigo Public Server Authentication Root R46" -# Issuer: CN=Sectigo Public Server Authentication Root R46,O=Sectigo Limited,C=GB -# Serial Number:75:8d:fd:8b:ae:7c:07:00:fa:a9:25:a7:e1:c7:ad:14 -# Subject: CN=Sectigo Public Server Authentication Root R46,O=Sectigo Limited,C=GB -# Not Valid Before: Mon Mar 22 00:00:00 2021 -# Not Valid After : Wed Mar 21 23:59:59 2046 -# Fingerprint (SHA-256): 7B:B6:47:A6:2A:EE:AC:88:BF:25:7A:A5:22:D0:1F:FE:A3:95:E0:AB:45:C7:3F:93:F6:56:54:EC:38:F2:5A:06 -# Fingerprint (SHA1): AD:98:F9:F3:E4:7D:75:3B:65:D4:82:B3:A4:52:17:BB:6E:F5:E4:38 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Sectigo Public Server Authentication Root R46" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\255\230\371\363\344\175\165\073\145\324\202\263\244\122\027\273 -\156\365\344\070 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\062\020\011\122\000\325\176\154\103\337\025\300\261\026\223\345 -END -CKA_ISSUER MULTILINE_OCTAL -\060\137\061\013\060\011\006\003\125\004\006\023\002\107\102\061 -\030\060\026\006\003\125\004\012\023\017\123\145\143\164\151\147 -\157\040\114\151\155\151\164\145\144\061\066\060\064\006\003\125 -\004\003\023\055\123\145\143\164\151\147\157\040\120\165\142\154 -\151\143\040\123\145\162\166\145\162\040\101\165\164\150\145\156 -\164\151\143\141\164\151\157\156\040\122\157\157\164\040\122\064 -\066 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\165\215\375\213\256\174\007\000\372\251\045\247\341\307 -\255\024 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "SSL.com TLS RSA Root CA 2022" -# -# Issuer: CN=SSL.com TLS RSA Root CA 2022,O=SSL Corporation,C=US -# Serial Number:6f:be:da:ad:73:bd:08:40:e2:8b:4d:be:d4:f7:5b:91 -# Subject: CN=SSL.com TLS RSA Root CA 2022,O=SSL Corporation,C=US -# Not Valid Before: Thu Aug 25 16:34:22 2022 -# Not Valid After : Sun Aug 19 16:34:21 2046 -# Fingerprint (SHA-256): 8F:AF:7D:2E:2C:B4:70:9B:B8:E0:B3:36:66:BF:75:A5:DD:45:B5:DE:48:0F:8E:A8:D4:BF:E6:BE:BC:17:F2:ED -# Fingerprint (SHA1): EC:2C:83:40:72:AF:26:95:10:FF:0E:F2:03:EE:31:70:F6:78:9D:CA -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "SSL.com TLS RSA Root CA 2022" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\116\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\030\060\026\006\003\125\004\012\014\017\123\123\114\040\103\157 -\162\160\157\162\141\164\151\157\156\061\045\060\043\006\003\125 -\004\003\014\034\123\123\114\056\143\157\155\040\124\114\123\040 -\122\123\101\040\122\157\157\164\040\103\101\040\062\060\062\062 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\116\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\030\060\026\006\003\125\004\012\014\017\123\123\114\040\103\157 -\162\160\157\162\141\164\151\157\156\061\045\060\043\006\003\125 -\004\003\014\034\123\123\114\056\143\157\155\040\124\114\123\040 -\122\123\101\040\122\157\157\164\040\103\101\040\062\060\062\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\157\276\332\255\163\275\010\100\342\213\115\276\324\367 -\133\221 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\211\060\202\003\161\240\003\002\001\002\002\020\157 -\276\332\255\163\275\010\100\342\213\115\276\324\367\133\221\060 -\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060\116 -\061\013\060\011\006\003\125\004\006\023\002\125\123\061\030\060 -\026\006\003\125\004\012\014\017\123\123\114\040\103\157\162\160 -\157\162\141\164\151\157\156\061\045\060\043\006\003\125\004\003 -\014\034\123\123\114\056\143\157\155\040\124\114\123\040\122\123 -\101\040\122\157\157\164\040\103\101\040\062\060\062\062\060\036 -\027\015\062\062\060\070\062\065\061\066\063\064\062\062\132\027 -\015\064\066\060\070\061\071\061\066\063\064\062\061\132\060\116 -\061\013\060\011\006\003\125\004\006\023\002\125\123\061\030\060 -\026\006\003\125\004\012\014\017\123\123\114\040\103\157\162\160 -\157\162\141\164\151\157\156\061\045\060\043\006\003\125\004\003 -\014\034\123\123\114\056\143\157\155\040\124\114\123\040\122\123 -\101\040\122\157\157\164\040\103\101\040\062\060\062\062\060\202 -\002\042\060\015\006\011\052\206\110\206\367\015\001\001\001\005 -\000\003\202\002\017\000\060\202\002\012\002\202\002\001\000\320 -\244\011\162\117\100\210\022\141\076\065\043\236\356\366\164\317 -\057\173\130\075\316\074\015\020\050\220\057\227\367\214\110\330 -\240\330\045\261\114\260\021\114\027\163\120\320\042\112\143\273 -\201\323\051\156\325\265\011\076\046\030\177\262\022\177\223\230 -\267\257\360\066\277\362\356\030\236\234\073\122\305\107\031\135 -\164\363\144\146\325\135\307\150\264\277\033\034\006\243\274\217 -\100\043\266\036\306\204\275\121\304\033\071\301\225\322\051\354 -\113\256\173\055\277\071\375\264\142\336\226\173\101\306\234\240 -\340\006\162\373\360\007\227\011\071\201\164\257\367\064\131\021 -\127\012\302\133\301\044\364\061\163\060\202\306\235\272\002\367 -\076\174\104\137\203\015\363\361\335\040\151\026\011\120\342\324 -\125\266\340\200\162\166\156\114\107\267\165\125\131\264\123\164 -\331\224\306\101\255\130\212\061\146\017\036\242\033\051\100\116 -\057\337\173\346\026\054\055\374\277\354\363\264\372\276\030\366 -\233\111\324\356\005\156\331\064\363\234\361\354\001\213\321\040 -\306\017\240\265\274\027\116\110\173\121\302\374\351\134\151\067 -\107\146\263\150\370\025\050\360\271\323\244\025\314\132\117\272 -\122\160\243\022\105\335\306\272\116\373\302\320\367\250\122\047 -\155\156\171\265\214\374\173\214\301\026\114\356\200\177\276\360 -\166\276\101\123\022\063\256\132\070\102\253\327\017\076\101\215 -\166\007\062\325\253\211\366\116\147\331\261\102\165\043\156\363 -\315\102\262\374\125\365\123\207\027\073\300\063\130\361\122\322 -\371\200\244\360\350\360\073\213\070\314\244\306\220\177\017\234 -\375\213\321\243\317\332\203\247\151\311\120\066\325\134\005\322 -\012\101\164\333\143\021\067\301\245\240\226\113\036\214\026\022 -\167\256\224\064\173\036\177\302\146\000\344\252\203\352\212\220 -\255\316\066\104\115\321\121\351\274\037\363\152\005\375\300\164 -\037\045\031\100\121\156\352\202\121\100\337\233\271\010\052\006 -\002\325\043\034\023\326\351\333\333\306\260\172\313\173\047\233 -\373\340\325\106\044\355\020\113\143\113\245\005\217\272\270\035 -\053\246\372\221\342\222\122\275\354\353\147\227\155\232\055\237 -\201\062\005\147\062\373\110\010\077\331\045\270\004\045\057\002 -\003\001\000\001\243\143\060\141\060\017\006\003\125\035\023\001 -\001\377\004\005\060\003\001\001\377\060\037\006\003\125\035\043 -\004\030\060\026\200\024\373\056\067\356\343\204\172\047\056\315 -\031\065\261\063\174\377\324\104\102\271\060\035\006\003\125\035 -\016\004\026\004\024\373\056\067\356\343\204\172\047\056\315\031 -\065\261\063\174\377\324\104\102\271\060\016\006\003\125\035\017 -\001\001\377\004\004\003\002\001\206\060\015\006\011\052\206\110 -\206\367\015\001\001\013\005\000\003\202\002\001\000\215\211\155 -\204\105\030\361\117\263\240\357\150\244\300\035\254\060\274\147 -\146\260\232\315\266\253\042\031\146\323\073\101\265\020\235\020 -\272\162\156\051\044\040\034\001\231\142\323\226\340\342\373\014 -\102\327\341\132\304\226\115\124\315\217\312\103\123\375\052\270 -\352\370\145\312\001\302\255\140\150\006\237\071\032\121\331\340 -\215\046\371\013\116\245\123\045\172\043\244\034\316\010\033\337 -\107\210\262\255\076\340\047\207\213\111\214\037\251\107\130\173 -\226\362\210\035\030\256\263\321\246\012\224\372\333\323\345\070 -\012\153\171\022\063\373\112\131\067\026\100\016\273\336\365\211 -\014\361\154\323\367\121\153\136\065\365\333\300\046\352\022\163 -\116\251\221\220\246\027\303\154\057\070\324\243\162\224\103\054 -\142\341\116\134\062\075\275\114\175\031\107\242\303\111\347\226 -\077\217\232\323\073\344\021\330\213\003\334\366\266\140\125\030 -\246\201\121\363\341\250\025\152\353\340\013\360\024\061\326\271 -\214\105\072\250\020\330\360\271\047\353\367\313\172\357\005\162 -\226\265\304\217\226\163\304\350\126\163\234\274\151\121\143\274 -\357\147\034\103\032\137\167\031\037\030\370\034\045\051\371\111 -\231\051\266\222\075\242\203\067\261\040\221\250\233\060\351\152 -\154\264\043\223\145\004\253\021\363\016\035\123\044\111\123\035 -\241\077\235\110\222\021\342\175\015\117\365\327\275\242\130\076 -\170\235\036\037\053\376\041\273\032\023\266\261\050\144\375\260 -\002\000\307\154\200\242\275\026\120\040\017\162\201\137\314\224 -\377\273\231\346\272\220\313\352\371\306\014\302\256\305\031\316 -\063\241\153\134\273\176\174\064\127\027\255\360\077\256\315\352 -\257\231\354\054\124\176\214\316\056\022\126\110\357\027\073\077 -\112\136\140\322\334\164\066\274\245\103\143\313\017\133\243\002 -\126\011\236\044\054\341\206\201\214\376\253\027\054\372\310\342 -\062\032\072\377\205\010\311\203\237\362\112\110\020\124\167\067 -\355\242\274\100\276\344\020\164\367\344\133\273\271\363\211\371 -\217\101\330\307\344\120\220\065\200\076\034\270\115\220\323\324 -\367\303\260\241\176\204\312\167\222\061\054\270\220\261\202\172 -\164\116\233\023\046\264\325\120\146\124\170\256\140 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "SSL.com TLS RSA Root CA 2022" -# Issuer: CN=SSL.com TLS RSA Root CA 2022,O=SSL Corporation,C=US -# Serial Number:6f:be:da:ad:73:bd:08:40:e2:8b:4d:be:d4:f7:5b:91 -# Subject: CN=SSL.com TLS RSA Root CA 2022,O=SSL Corporation,C=US -# Not Valid Before: Thu Aug 25 16:34:22 2022 -# Not Valid After : Sun Aug 19 16:34:21 2046 -# Fingerprint (SHA-256): 8F:AF:7D:2E:2C:B4:70:9B:B8:E0:B3:36:66:BF:75:A5:DD:45:B5:DE:48:0F:8E:A8:D4:BF:E6:BE:BC:17:F2:ED -# Fingerprint (SHA1): EC:2C:83:40:72:AF:26:95:10:FF:0E:F2:03:EE:31:70:F6:78:9D:CA -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "SSL.com TLS RSA Root CA 2022" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\354\054\203\100\162\257\046\225\020\377\016\362\003\356\061\160 -\366\170\235\312 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\330\116\306\131\060\330\376\240\326\172\132\054\054\151\170\332 -END -CKA_ISSUER MULTILINE_OCTAL -\060\116\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\030\060\026\006\003\125\004\012\014\017\123\123\114\040\103\157 -\162\160\157\162\141\164\151\157\156\061\045\060\043\006\003\125 -\004\003\014\034\123\123\114\056\143\157\155\040\124\114\123\040 -\122\123\101\040\122\157\157\164\040\103\101\040\062\060\062\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\157\276\332\255\163\275\010\100\342\213\115\276\324\367 -\133\221 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "SSL.com TLS ECC Root CA 2022" -# -# Issuer: CN=SSL.com TLS ECC Root CA 2022,O=SSL Corporation,C=US -# Serial Number:14:03:f5:ab:fb:37:8b:17:40:5b:e2:43:b2:a5:d1:c4 -# Subject: CN=SSL.com TLS ECC Root CA 2022,O=SSL Corporation,C=US -# Not Valid Before: Thu Aug 25 16:33:48 2022 -# Not Valid After : Sun Aug 19 16:33:47 2046 -# Fingerprint (SHA-256): C3:2F:FD:9F:46:F9:36:D1:6C:36:73:99:09:59:43:4B:9A:D6:0A:AF:BB:9E:7C:F3:36:54:F1:44:CC:1B:A1:43 -# Fingerprint (SHA1): 9F:5F:D9:1A:54:6D:F5:0C:71:F0:EE:7A:BD:17:49:98:84:73:E2:39 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "SSL.com TLS ECC Root CA 2022" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\116\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\030\060\026\006\003\125\004\012\014\017\123\123\114\040\103\157 -\162\160\157\162\141\164\151\157\156\061\045\060\043\006\003\125 -\004\003\014\034\123\123\114\056\143\157\155\040\124\114\123\040 -\105\103\103\040\122\157\157\164\040\103\101\040\062\060\062\062 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\116\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\030\060\026\006\003\125\004\012\014\017\123\123\114\040\103\157 -\162\160\157\162\141\164\151\157\156\061\045\060\043\006\003\125 -\004\003\014\034\123\123\114\056\143\157\155\040\124\114\123\040 -\105\103\103\040\122\157\157\164\040\103\101\040\062\060\062\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\024\003\365\253\373\067\213\027\100\133\342\103\262\245 -\321\304 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\072\060\202\001\300\240\003\002\001\002\002\020\024 -\003\365\253\373\067\213\027\100\133\342\103\262\245\321\304\060 -\012\006\010\052\206\110\316\075\004\003\003\060\116\061\013\060 -\011\006\003\125\004\006\023\002\125\123\061\030\060\026\006\003 -\125\004\012\014\017\123\123\114\040\103\157\162\160\157\162\141 -\164\151\157\156\061\045\060\043\006\003\125\004\003\014\034\123 -\123\114\056\143\157\155\040\124\114\123\040\105\103\103\040\122 -\157\157\164\040\103\101\040\062\060\062\062\060\036\027\015\062 -\062\060\070\062\065\061\066\063\063\064\070\132\027\015\064\066 -\060\070\061\071\061\066\063\063\064\067\132\060\116\061\013\060 -\011\006\003\125\004\006\023\002\125\123\061\030\060\026\006\003 -\125\004\012\014\017\123\123\114\040\103\157\162\160\157\162\141 -\164\151\157\156\061\045\060\043\006\003\125\004\003\014\034\123 -\123\114\056\143\157\155\040\124\114\123\040\105\103\103\040\122 -\157\157\164\040\103\101\040\062\060\062\062\060\166\060\020\006 -\007\052\206\110\316\075\002\001\006\005\053\201\004\000\042\003 -\142\000\004\105\051\065\163\372\302\270\043\316\024\175\250\261 -\115\240\133\066\356\052\054\123\303\140\011\065\262\044\146\046 -\151\300\263\225\326\135\222\100\031\016\306\245\023\160\364\357 -\022\121\050\135\347\314\275\371\074\205\301\317\224\220\311\053 -\316\222\102\130\131\147\375\224\047\020\144\214\117\004\261\115 -\111\344\173\117\233\365\347\010\370\003\210\367\247\303\222\113 -\031\124\201\243\143\060\141\060\017\006\003\125\035\023\001\001 -\377\004\005\060\003\001\001\377\060\037\006\003\125\035\043\004 -\030\060\026\200\024\211\217\057\243\350\053\240\024\124\173\363 -\126\270\046\137\147\070\013\234\320\060\035\006\003\125\035\016 -\004\026\004\024\211\217\057\243\350\053\240\024\124\173\363\126 -\270\046\137\147\070\013\234\320\060\016\006\003\125\035\017\001 -\001\377\004\004\003\002\001\206\060\012\006\010\052\206\110\316 -\075\004\003\003\003\150\000\060\145\002\060\125\343\042\126\351 -\327\222\044\130\117\036\224\062\017\014\002\066\302\375\254\164 -\062\116\341\373\034\200\210\243\314\373\327\353\053\377\067\175 -\360\355\327\236\165\152\065\166\122\105\340\002\061\000\307\215 -\157\102\040\217\276\266\115\131\355\167\115\051\304\040\040\105 -\144\206\072\120\306\304\255\055\223\365\030\175\162\355\251\317 -\304\254\127\066\050\010\145\337\074\171\146\176\240\352 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "SSL.com TLS ECC Root CA 2022" -# Issuer: CN=SSL.com TLS ECC Root CA 2022,O=SSL Corporation,C=US -# Serial Number:14:03:f5:ab:fb:37:8b:17:40:5b:e2:43:b2:a5:d1:c4 -# Subject: CN=SSL.com TLS ECC Root CA 2022,O=SSL Corporation,C=US -# Not Valid Before: Thu Aug 25 16:33:48 2022 -# Not Valid After : Sun Aug 19 16:33:47 2046 -# Fingerprint (SHA-256): C3:2F:FD:9F:46:F9:36:D1:6C:36:73:99:09:59:43:4B:9A:D6:0A:AF:BB:9E:7C:F3:36:54:F1:44:CC:1B:A1:43 -# Fingerprint (SHA1): 9F:5F:D9:1A:54:6D:F5:0C:71:F0:EE:7A:BD:17:49:98:84:73:E2:39 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "SSL.com TLS ECC Root CA 2022" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\237\137\331\032\124\155\365\014\161\360\356\172\275\027\111\230 -\204\163\342\071 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\231\327\134\361\121\066\314\351\316\331\031\056\167\161\126\305 -END -CKA_ISSUER MULTILINE_OCTAL -\060\116\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\030\060\026\006\003\125\004\012\014\017\123\123\114\040\103\157 -\162\160\157\162\141\164\151\157\156\061\045\060\043\006\003\125 -\004\003\014\034\123\123\114\056\143\157\155\040\124\114\123\040 -\105\103\103\040\122\157\157\164\040\103\101\040\062\060\062\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\024\003\365\253\373\067\213\027\100\133\342\103\262\245 -\321\304 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "SSL.com Client ECC Root CA 2022" -# -# Issuer: CN=SSL.com Client ECC Root CA 2022,O=SSL Corporation,C=US -# Serial Number:76:f8:48:1e:ae:f0:3c:70:1f:e0:3f:25:54:01:83:d5 -# Subject: CN=SSL.com Client ECC Root CA 2022,O=SSL Corporation,C=US -# Not Valid Before: Thu Aug 25 16:30:32 2022 -# Not Valid After : Sun Aug 19 16:30:31 2046 -# Fingerprint (SHA-256): AD:7D:D5:8D:03:AE:DB:22:A3:0B:50:84:39:49:20:CE:12:23:0C:2D:80:17:AD:9B:81:AB:04:07:9B:DD:02:6B -# Fingerprint (SHA1): 80:7B:1D:9D:65:72:3D:C7:56:F9:EC:C5:00:83:49:F6:F2:AC:F4:86 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "SSL.com Client ECC Root CA 2022" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\121\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\030\060\026\006\003\125\004\012\014\017\123\123\114\040\103\157 -\162\160\157\162\141\164\151\157\156\061\050\060\046\006\003\125 -\004\003\014\037\123\123\114\056\143\157\155\040\103\154\151\145 -\156\164\040\105\103\103\040\122\157\157\164\040\103\101\040\062 -\060\062\062 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\121\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\030\060\026\006\003\125\004\012\014\017\123\123\114\040\103\157 -\162\160\157\162\141\164\151\157\156\061\050\060\046\006\003\125 -\004\003\014\037\123\123\114\056\143\157\155\040\103\154\151\145 -\156\164\040\105\103\103\040\122\157\157\164\040\103\101\040\062 -\060\062\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\166\370\110\036\256\360\074\160\037\340\077\045\124\001 -\203\325 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\100\060\202\001\306\240\003\002\001\002\002\020\166 -\370\110\036\256\360\074\160\037\340\077\045\124\001\203\325\060 -\012\006\010\052\206\110\316\075\004\003\003\060\121\061\013\060 -\011\006\003\125\004\006\023\002\125\123\061\030\060\026\006\003 -\125\004\012\014\017\123\123\114\040\103\157\162\160\157\162\141 -\164\151\157\156\061\050\060\046\006\003\125\004\003\014\037\123 -\123\114\056\143\157\155\040\103\154\151\145\156\164\040\105\103 -\103\040\122\157\157\164\040\103\101\040\062\060\062\062\060\036 -\027\015\062\062\060\070\062\065\061\066\063\060\063\062\132\027 -\015\064\066\060\070\061\071\061\066\063\060\063\061\132\060\121 -\061\013\060\011\006\003\125\004\006\023\002\125\123\061\030\060 -\026\006\003\125\004\012\014\017\123\123\114\040\103\157\162\160 -\157\162\141\164\151\157\156\061\050\060\046\006\003\125\004\003 -\014\037\123\123\114\056\143\157\155\040\103\154\151\145\156\164 -\040\105\103\103\040\122\157\157\164\040\103\101\040\062\060\062 -\062\060\166\060\020\006\007\052\206\110\316\075\002\001\006\005 -\053\201\004\000\042\003\142\000\004\055\123\176\237\213\076\263 -\066\272\120\342\314\353\334\272\046\212\323\214\006\077\147\017 -\357\365\027\345\324\256\232\106\052\101\001\007\151\347\147\161 -\361\302\003\066\306\360\053\122\216\317\024\222\150\244\076\160 -\121\022\151\215\170\242\202\312\051\024\300\344\224\042\262\104 -\222\140\157\310\004\244\147\325\242\320\363\320\327\352\216\074 -\017\272\322\100\107\220\064\356\175\243\143\060\141\060\017\006 -\003\125\035\023\001\001\377\004\005\060\003\001\001\377\060\037 -\006\003\125\035\043\004\030\060\026\200\024\267\376\055\142\305 -\201\123\315\122\032\057\135\140\240\303\135\373\262\034\034\060 -\035\006\003\125\035\016\004\026\004\024\267\376\055\142\305\201 -\123\315\122\032\057\135\140\240\303\135\373\262\034\034\060\016 -\006\003\125\035\017\001\001\377\004\004\003\002\001\206\060\012 -\006\010\052\206\110\316\075\004\003\003\003\150\000\060\145\002 -\060\115\007\021\055\021\373\271\046\303\041\335\162\341\027\374 -\301\317\024\352\111\316\161\207\216\326\123\334\021\315\135\124 -\212\257\331\055\364\214\121\352\274\146\107\342\177\225\203\140 -\145\002\061\000\214\041\114\117\273\345\260\120\337\220\142\111 -\346\314\221\333\370\077\135\161\221\010\216\117\222\311\177\246 -\134\352\023\176\355\155\304\350\303\052\157\134\021\341\245\363 -\152\132\232\115 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "SSL.com Client ECC Root CA 2022" -# Issuer: CN=SSL.com Client ECC Root CA 2022,O=SSL Corporation,C=US -# Serial Number:76:f8:48:1e:ae:f0:3c:70:1f:e0:3f:25:54:01:83:d5 -# Subject: CN=SSL.com Client ECC Root CA 2022,O=SSL Corporation,C=US -# Not Valid Before: Thu Aug 25 16:30:32 2022 -# Not Valid After : Sun Aug 19 16:30:31 2046 -# Fingerprint (SHA-256): AD:7D:D5:8D:03:AE:DB:22:A3:0B:50:84:39:49:20:CE:12:23:0C:2D:80:17:AD:9B:81:AB:04:07:9B:DD:02:6B -# Fingerprint (SHA1): 80:7B:1D:9D:65:72:3D:C7:56:F9:EC:C5:00:83:49:F6:F2:AC:F4:86 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "SSL.com Client ECC Root CA 2022" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\200\173\035\235\145\162\075\307\126\371\354\305\000\203\111\366 -\362\254\364\206 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\063\271\151\231\022\166\125\274\337\257\101\334\042\213\167\200 -END -CKA_ISSUER MULTILINE_OCTAL -\060\121\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\030\060\026\006\003\125\004\012\014\017\123\123\114\040\103\157 -\162\160\157\162\141\164\151\157\156\061\050\060\046\006\003\125 -\004\003\014\037\123\123\114\056\143\157\155\040\103\154\151\145 -\156\164\040\105\103\103\040\122\157\157\164\040\103\101\040\062 -\060\062\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\166\370\110\036\256\360\074\160\037\340\077\045\124\001 -\203\325 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "SSL.com Client RSA Root CA 2022" -# -# Issuer: CN=SSL.com Client RSA Root CA 2022,O=SSL Corporation,C=US -# Serial Number:76:af:ee:88:93:15:45:b6:50:53:9b:80:9c:a4:df:9a -# Subject: CN=SSL.com Client RSA Root CA 2022,O=SSL Corporation,C=US -# Not Valid Before: Thu Aug 25 16:31:07 2022 -# Not Valid After : Sun Aug 19 16:31:06 2046 -# Fingerprint (SHA-256): 1D:4C:A4:A2:AB:21:D0:09:36:59:80:4F:C0:EB:21:75:A6:17:27:9B:56:A2:47:52:45:C9:51:7A:FE:B5:91:53 -# Fingerprint (SHA1): AA:59:70:E5:20:32:9F:CB:D0:D5:79:9F:FB:1B:82:1D:FD:1F:79:65 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "SSL.com Client RSA Root CA 2022" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\121\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\030\060\026\006\003\125\004\012\014\017\123\123\114\040\103\157 -\162\160\157\162\141\164\151\157\156\061\050\060\046\006\003\125 -\004\003\014\037\123\123\114\056\143\157\155\040\103\154\151\145 -\156\164\040\122\123\101\040\122\157\157\164\040\103\101\040\062 -\060\062\062 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\121\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\030\060\026\006\003\125\004\012\014\017\123\123\114\040\103\157 -\162\160\157\162\141\164\151\157\156\061\050\060\046\006\003\125 -\004\003\014\037\123\123\114\056\143\157\155\040\103\154\151\145 -\156\164\040\122\123\101\040\122\157\157\164\040\103\101\040\062 -\060\062\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\166\257\356\210\223\025\105\266\120\123\233\200\234\244 -\337\232 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\217\060\202\003\167\240\003\002\001\002\002\020\166 -\257\356\210\223\025\105\266\120\123\233\200\234\244\337\232\060 -\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060\121 -\061\013\060\011\006\003\125\004\006\023\002\125\123\061\030\060 -\026\006\003\125\004\012\014\017\123\123\114\040\103\157\162\160 -\157\162\141\164\151\157\156\061\050\060\046\006\003\125\004\003 -\014\037\123\123\114\056\143\157\155\040\103\154\151\145\156\164 -\040\122\123\101\040\122\157\157\164\040\103\101\040\062\060\062 -\062\060\036\027\015\062\062\060\070\062\065\061\066\063\061\060 -\067\132\027\015\064\066\060\070\061\071\061\066\063\061\060\066 -\132\060\121\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\030\060\026\006\003\125\004\012\014\017\123\123\114\040\103 -\157\162\160\157\162\141\164\151\157\156\061\050\060\046\006\003 -\125\004\003\014\037\123\123\114\056\143\157\155\040\103\154\151 -\145\156\164\040\122\123\101\040\122\157\157\164\040\103\101\040 -\062\060\062\062\060\202\002\042\060\015\006\011\052\206\110\206 -\367\015\001\001\001\005\000\003\202\002\017\000\060\202\002\012 -\002\202\002\001\000\270\130\333\106\060\373\311\077\343\310\360 -\001\063\064\342\332\110\250\030\351\040\156\232\327\001\341\325 -\051\217\060\264\043\152\344\313\142\260\276\342\237\040\275\076 -\124\240\071\150\307\206\067\146\164\006\006\357\164\053\332\334 -\237\204\251\122\057\220\322\356\176\174\373\245\042\255\157\160 -\106\147\226\075\051\324\243\273\126\173\024\004\131\301\041\143 -\104\036\262\037\022\134\220\207\145\015\210\366\036\210\042\342 -\143\124\273\363\066\370\326\177\334\332\377\051\065\251\306\156 -\016\151\133\077\330\276\202\207\025\160\135\260\307\134\022\017 -\143\246\070\315\317\163\271\303\016\211\046\067\033\077\142\034 -\062\151\321\233\331\377\125\220\061\336\261\143\335\317\305\164 -\167\374\357\210\041\123\277\000\061\032\046\054\000\060\245\137 -\154\343\344\366\000\212\312\230\207\234\164\003\172\213\146\354 -\176\375\243\217\065\045\134\170\245\263\244\373\075\155\251\212 -\360\154\210\202\213\375\112\320\157\344\327\243\264\216\064\111 -\070\276\316\105\345\322\034\312\136\302\067\024\213\315\146\126 -\063\067\235\345\153\354\103\222\144\240\102\332\165\157\300\025 -\354\371\151\275\064\271\212\173\372\026\373\125\376\122\040\350 -\004\004\126\126\145\365\067\104\230\310\212\106\351\267\254\270 -\350\276\142\216\124\066\133\367\073\160\277\135\356\055\272\137 -\336\102\031\206\360\177\213\353\010\313\330\276\352\016\102\102 -\240\066\163\127\027\355\062\352\320\215\350\007\033\233\231\350 -\304\232\142\004\016\110\367\074\022\272\367\130\301\232\214\351 -\307\260\043\066\126\064\035\313\154\332\272\007\204\035\375\321 -\254\237\346\302\211\357\303\271\154\030\263\151\207\127\137\265 -\014\070\133\247\041\044\052\073\247\064\221\236\264\124\352\050 -\117\323\301\243\213\344\346\053\325\362\235\277\233\141\000\042 -\335\326\113\104\037\077\135\126\376\336\234\170\314\231\133\252 -\344\275\272\333\103\113\255\114\046\114\243\115\064\212\154\164 -\066\023\333\142\374\233\262\005\201\377\256\077\014\315\366\033 -\242\364\071\347\312\365\114\134\373\124\167\065\200\132\300\022 -\241\023\001\063\147\075\235\201\241\251\365\205\044\130\210\170 -\347\364\343\150\125\002\003\001\000\001\243\143\060\141\060\017 -\006\003\125\035\023\001\001\377\004\005\060\003\001\001\377\060 -\037\006\003\125\035\043\004\030\060\026\200\024\360\070\102\224 -\064\251\074\000\177\122\356\071\245\367\113\015\274\152\175\043 -\060\035\006\003\125\035\016\004\026\004\024\360\070\102\224\064 -\251\074\000\177\122\356\071\245\367\113\015\274\152\175\043\060 -\016\006\003\125\035\017\001\001\377\004\004\003\002\001\206\060 -\015\006\011\052\206\110\206\367\015\001\001\013\005\000\003\202 -\002\001\000\231\117\333\360\352\326\021\372\052\375\310\253\155 -\344\016\163\142\322\102\237\025\376\174\160\122\077\144\207\202 -\061\077\105\100\056\341\042\237\006\146\051\374\226\323\055\215 -\266\070\307\331\363\047\301\131\051\240\214\366\163\044\017\050 -\042\327\116\141\335\023\335\333\237\062\122\223\373\117\314\352 -\070\074\230\152\003\253\026\257\041\321\102\256\175\105\053\352 -\304\317\212\131\237\202\160\166\072\370\142\046\311\020\227\130 -\100\044\244\055\271\057\051\200\047\341\211\153\162\312\111\010 -\161\067\123\005\361\200\316\323\102\002\322\374\302\321\224\006 -\356\007\342\366\203\342\177\237\347\273\126\303\133\277\335\225 -\223\011\036\044\301\317\046\315\255\244\256\302\264\151\347\252 -\265\355\067\224\351\335\321\143\205\153\232\172\112\126\166\334 -\031\205\050\324\344\306\244\330\270\226\101\167\320\264\131\361 -\106\005\207\207\002\037\151\271\202\030\320\103\331\046\332\032 -\147\250\326\165\166\352\362\155\016\102\377\210\046\242\156\204 -\376\176\142\033\360\306\075\355\300\034\152\307\221\326\270\000 -\067\111\233\271\204\005\241\315\156\061\326\104\352\123\213\272 -\123\230\035\241\220\212\351\205\370\033\362\223\130\303\310\334 -\232\046\117\076\040\317\117\103\363\020\214\177\020\141\172\066 -\312\252\013\175\314\237\107\104\131\256\245\225\306\231\123\343 -\007\153\075\111\020\260\030\377\135\016\205\103\024\113\347\153 -\323\112\265\262\140\141\334\151\111\002\043\135\350\222\161\303 -\234\237\105\147\171\036\334\062\206\272\252\125\074\144\157\062 -\265\020\100\025\336\162\100\170\340\156\160\273\156\353\011\350 -\071\331\254\272\222\165\335\103\312\272\001\225\255\032\201\053 -\072\360\343\305\057\014\030\115\020\306\256\300\355\376\005\122 -\177\031\005\313\251\257\065\010\014\070\042\344\376\126\345\123 -\076\277\344\326\263\331\010\303\075\325\063\062\201\044\305\251 -\341\145\021\270\062\063\060\161\030\111\035\032\105\306\232\024 -\212\130\071\050\156\363\313\121\271\111\046\144\170\003\307\221 -\021\203\251\271\220\064\266\157\252\005\236\205\050\127\231\276 -\177\047\006\111\142\115\241\374\011\341\053\106\011\114\024\233 -\126\217\105 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "SSL.com Client RSA Root CA 2022" -# Issuer: CN=SSL.com Client RSA Root CA 2022,O=SSL Corporation,C=US -# Serial Number:76:af:ee:88:93:15:45:b6:50:53:9b:80:9c:a4:df:9a -# Subject: CN=SSL.com Client RSA Root CA 2022,O=SSL Corporation,C=US -# Not Valid Before: Thu Aug 25 16:31:07 2022 -# Not Valid After : Sun Aug 19 16:31:06 2046 -# Fingerprint (SHA-256): 1D:4C:A4:A2:AB:21:D0:09:36:59:80:4F:C0:EB:21:75:A6:17:27:9B:56:A2:47:52:45:C9:51:7A:FE:B5:91:53 -# Fingerprint (SHA1): AA:59:70:E5:20:32:9F:CB:D0:D5:79:9F:FB:1B:82:1D:FD:1F:79:65 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "SSL.com Client RSA Root CA 2022" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\252\131\160\345\040\062\237\313\320\325\171\237\373\033\202\035 -\375\037\171\145 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\011\215\322\312\256\154\024\276\276\014\224\157\067\027\040\316 -END -CKA_ISSUER MULTILINE_OCTAL -\060\121\061\013\060\011\006\003\125\004\006\023\002\125\123\061 -\030\060\026\006\003\125\004\012\014\017\123\123\114\040\103\157 -\162\160\157\162\141\164\151\157\156\061\050\060\046\006\003\125 -\004\003\014\037\123\123\114\056\143\157\155\040\103\154\151\145 -\156\164\040\122\123\101\040\122\157\157\164\040\103\101\040\062 -\060\062\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\166\257\356\210\223\025\105\266\120\123\233\200\234\244 -\337\232 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Atos TrustedRoot Root CA ECC G2 2020" -# -# Issuer: CN=Atos TrustedRoot Root CA ECC G2 2020,O=Atos,C=DE -# Serial Number:0b:73:28:11:18:74:30:1c:ef:6f:08:84 -# Subject: CN=Atos TrustedRoot Root CA ECC G2 2020,O=Atos,C=DE -# Not Valid Before: Tue Dec 15 08:39:10 2020 -# Not Valid After : Mon Dec 10 08:39:09 2040 -# Fingerprint (SHA-256): E3:86:55:F4:B0:19:0C:84:D3:B3:89:3D:84:0A:68:7E:19:0A:25:6D:98:05:2F:15:9E:6D:4A:39:F5:89:A6:EB -# Fingerprint (SHA1): 61:25:56:DA:62:94:E5:AE:B3:3C:F8:11:BD:B1:DC:F8:A5:D8:B3:E4 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Atos TrustedRoot Root CA ECC G2 2020" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\113\061\013\060\011\006\003\125\004\006\023\002\104\105\061 -\015\060\013\006\003\125\004\012\014\004\101\164\157\163\061\055 -\060\053\006\003\125\004\003\014\044\101\164\157\163\040\124\162 -\165\163\164\145\144\122\157\157\164\040\122\157\157\164\040\103 -\101\040\105\103\103\040\107\062\040\062\060\062\060 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\113\061\013\060\011\006\003\125\004\006\023\002\104\105\061 -\015\060\013\006\003\125\004\012\014\004\101\164\157\163\061\055 -\060\053\006\003\125\004\003\014\044\101\164\157\163\040\124\162 -\165\163\164\145\144\122\157\157\164\040\122\157\157\164\040\103 -\101\040\105\103\103\040\107\062\040\062\060\062\060 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\014\013\163\050\021\030\164\060\034\357\157\010\204 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\061\060\202\001\266\240\003\002\001\002\002\014\013 -\163\050\021\030\164\060\034\357\157\010\204\060\012\006\010\052 -\206\110\316\075\004\003\003\060\113\061\013\060\011\006\003\125 -\004\006\023\002\104\105\061\015\060\013\006\003\125\004\012\014 -\004\101\164\157\163\061\055\060\053\006\003\125\004\003\014\044 -\101\164\157\163\040\124\162\165\163\164\145\144\122\157\157\164 -\040\122\157\157\164\040\103\101\040\105\103\103\040\107\062\040 -\062\060\062\060\060\036\027\015\062\060\061\062\061\065\060\070 -\063\071\061\060\132\027\015\064\060\061\062\061\060\060\070\063 -\071\060\071\132\060\113\061\013\060\011\006\003\125\004\006\023 -\002\104\105\061\015\060\013\006\003\125\004\012\014\004\101\164 -\157\163\061\055\060\053\006\003\125\004\003\014\044\101\164\157 -\163\040\124\162\165\163\164\145\144\122\157\157\164\040\122\157 -\157\164\040\103\101\040\105\103\103\040\107\062\040\062\060\062 -\060\060\166\060\020\006\007\052\206\110\316\075\002\001\006\005 -\053\201\004\000\042\003\142\000\004\310\134\200\312\116\302\050 -\037\127\277\070\346\141\043\374\320\251\133\226\026\026\303\014 -\136\025\245\220\011\377\070\050\264\172\036\012\326\123\052\301 -\273\220\100\164\067\351\201\350\215\057\150\001\065\174\122\056 -\330\364\130\263\021\034\133\331\207\030\223\221\055\354\235\332 -\154\236\155\204\110\374\302\211\005\353\230\023\002\001\154\123 -\036\016\111\143\130\107\261\257\302\243\143\060\141\060\017\006 -\003\125\035\023\001\001\377\004\005\060\003\001\001\377\060\037 -\006\003\125\035\043\004\030\060\026\200\024\133\037\304\161\154 -\262\033\237\276\134\037\214\375\263\266\373\263\016\011\207\060 -\035\006\003\125\035\016\004\026\004\024\133\037\304\161\154\262 -\033\237\276\134\037\214\375\263\266\373\263\016\011\207\060\016 -\006\003\125\035\017\001\001\377\004\004\003\002\001\206\060\012 -\006\010\052\206\110\316\075\004\003\003\003\151\000\060\146\002 -\061\000\354\340\231\375\335\344\124\301\313\037\350\076\050\327 -\025\131\112\202\312\123\060\354\353\066\245\271\310\316\223\107 -\126\310\141\246\341\155\222\123\225\217\366\343\125\123\360\335 -\172\347\002\061\000\260\207\325\033\263\140\374\221\215\200\312 -\242\033\121\113\070\124\313\252\036\173\327\345\104\225\026\057 -\074\104\170\056\045\272\352\220\344\354\122\356\127\354\003\204 -\363\136\333\026\015 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Atos TrustedRoot Root CA ECC G2 2020" -# Issuer: CN=Atos TrustedRoot Root CA ECC G2 2020,O=Atos,C=DE -# Serial Number:0b:73:28:11:18:74:30:1c:ef:6f:08:84 -# Subject: CN=Atos TrustedRoot Root CA ECC G2 2020,O=Atos,C=DE -# Not Valid Before: Tue Dec 15 08:39:10 2020 -# Not Valid After : Mon Dec 10 08:39:09 2040 -# Fingerprint (SHA-256): E3:86:55:F4:B0:19:0C:84:D3:B3:89:3D:84:0A:68:7E:19:0A:25:6D:98:05:2F:15:9E:6D:4A:39:F5:89:A6:EB -# Fingerprint (SHA1): 61:25:56:DA:62:94:E5:AE:B3:3C:F8:11:BD:B1:DC:F8:A5:D8:B3:E4 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Atos TrustedRoot Root CA ECC G2 2020" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\141\045\126\332\142\224\345\256\263\074\370\021\275\261\334\370 -\245\330\263\344 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\225\320\233\116\332\275\252\035\225\265\242\302\135\337\210\214 -END -CKA_ISSUER MULTILINE_OCTAL -\060\113\061\013\060\011\006\003\125\004\006\023\002\104\105\061 -\015\060\013\006\003\125\004\012\014\004\101\164\157\163\061\055 -\060\053\006\003\125\004\003\014\044\101\164\157\163\040\124\162 -\165\163\164\145\144\122\157\157\164\040\122\157\157\164\040\103 -\101\040\105\103\103\040\107\062\040\062\060\062\060 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\014\013\163\050\021\030\164\060\034\357\157\010\204 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Atos TrustedRoot Root CA RSA G2 2020" -# -# Issuer: CN=Atos TrustedRoot Root CA RSA G2 2020,O=Atos,C=DE -# Serial Number:47:ba:29:46:55:3e:16:92:97:b0:ab:40 -# Subject: CN=Atos TrustedRoot Root CA RSA G2 2020,O=Atos,C=DE -# Not Valid Before: Tue Dec 15 08:41:23 2020 -# Not Valid After : Mon Dec 10 08:41:22 2040 -# Fingerprint (SHA-256): 78:83:3A:78:3B:B2:98:6C:25:4B:93:70:D3:C2:0E:5E:BA:8F:A7:84:0C:BF:63:FE:17:29:7A:0B:01:19:68:5E -# Fingerprint (SHA1): 32:D1:27:FA:93:B1:C1:4C:99:E2:4A:40:BC:7F:94:41:1B:5A:AC:A4 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Atos TrustedRoot Root CA RSA G2 2020" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\113\061\013\060\011\006\003\125\004\006\023\002\104\105\061 -\015\060\013\006\003\125\004\012\014\004\101\164\157\163\061\055 -\060\053\006\003\125\004\003\014\044\101\164\157\163\040\124\162 -\165\163\164\145\144\122\157\157\164\040\122\157\157\164\040\103 -\101\040\122\123\101\040\107\062\040\062\060\062\060 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\113\061\013\060\011\006\003\125\004\006\023\002\104\105\061 -\015\060\013\006\003\125\004\012\014\004\101\164\157\163\061\055 -\060\053\006\003\125\004\003\014\044\101\164\157\163\040\124\162 -\165\163\164\145\144\122\157\157\164\040\122\157\157\164\040\103 -\101\040\122\123\101\040\107\062\040\062\060\062\060 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\014\107\272\051\106\125\076\026\222\227\260\253\100 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\177\060\202\003\147\240\003\002\001\002\002\014\107 -\272\051\106\125\076\026\222\227\260\253\100\060\015\006\011\052 -\206\110\206\367\015\001\001\014\005\000\060\113\061\013\060\011 -\006\003\125\004\006\023\002\104\105\061\015\060\013\006\003\125 -\004\012\014\004\101\164\157\163\061\055\060\053\006\003\125\004 -\003\014\044\101\164\157\163\040\124\162\165\163\164\145\144\122 -\157\157\164\040\122\157\157\164\040\103\101\040\122\123\101\040 -\107\062\040\062\060\062\060\060\036\027\015\062\060\061\062\061 -\065\060\070\064\061\062\063\132\027\015\064\060\061\062\061\060 -\060\070\064\061\062\062\132\060\113\061\013\060\011\006\003\125 -\004\006\023\002\104\105\061\015\060\013\006\003\125\004\012\014 -\004\101\164\157\163\061\055\060\053\006\003\125\004\003\014\044 -\101\164\157\163\040\124\162\165\163\164\145\144\122\157\157\164 -\040\122\157\157\164\040\103\101\040\122\123\101\040\107\062\040 -\062\060\062\060\060\202\002\042\060\015\006\011\052\206\110\206 -\367\015\001\001\001\005\000\003\202\002\017\000\060\202\002\012 -\002\202\002\001\000\226\061\205\112\252\017\062\376\171\341\103 -\207\234\373\043\267\216\177\015\124\275\307\142\223\167\344\034 -\065\004\166\243\003\213\042\356\304\204\335\245\223\156\156\262 -\216\011\003\353\121\026\061\027\252\151\025\030\016\147\164\043 -\136\352\232\175\265\071\076\075\202\251\153\341\376\251\034\260 -\255\132\115\114\170\203\101\213\317\362\035\142\232\230\004\234 -\143\351\253\145\376\110\035\044\145\007\107\076\271\221\056\351 -\235\233\177\032\065\251\064\260\267\345\160\063\357\112\162\121 -\266\007\277\140\077\052\237\235\124\337\363\327\224\111\121\003 -\132\100\251\150\335\021\131\134\370\166\246\274\120\122\020\355 -\254\354\225\340\324\203\153\111\332\012\117\231\203\336\062\203 -\110\203\147\225\262\176\347\201\205\075\315\202\367\312\002\355 -\155\210\135\010\215\270\065\277\052\151\060\231\273\113\321\101 -\333\105\240\223\231\121\201\220\066\010\252\212\266\350\217\263 -\313\356\345\106\015\162\165\365\111\154\341\242\177\057\274\355 -\204\246\067\356\336\302\117\071\116\366\236\360\311\321\233\060 -\235\111\155\341\332\377\022\020\214\326\345\231\173\005\266\175 -\260\011\307\244\370\262\034\071\225\071\063\364\065\316\045\142 -\173\260\137\040\363\313\155\370\154\122\024\144\104\217\323\310 -\251\166\007\345\257\161\231\055\055\004\045\110\166\257\303\347 -\314\103\362\007\274\112\044\044\067\335\372\156\224\011\157\114 -\136\001\264\376\124\354\043\226\245\136\335\206\377\351\106\052 -\361\350\334\354\245\075\257\157\252\016\017\264\165\372\076\010 -\271\046\105\117\146\206\114\274\031\270\341\325\065\356\202\204 -\310\323\253\022\347\315\163\063\142\167\364\027\313\275\064\166 -\052\005\316\225\345\170\171\113\236\260\215\371\074\130\070\221 -\352\136\207\070\300\267\102\375\252\114\207\043\255\004\040\261 -\176\166\102\332\273\266\026\272\127\310\216\023\372\165\325\010 -\114\257\070\221\252\357\217\372\237\111\056\124\174\012\126\261 -\172\372\304\116\057\324\243\372\026\212\320\225\345\227\246\377 -\303\374\174\016\107\130\363\177\007\173\022\334\127\077\055\343 -\241\115\133\122\114\063\207\231\250\011\173\154\176\016\362\317 -\126\102\236\353\005\002\003\001\000\001\243\143\060\141\060\017 -\006\003\125\035\023\001\001\377\004\005\060\003\001\001\377\060 -\037\006\003\125\035\043\004\030\060\026\200\024\040\045\363\007 -\375\247\157\361\226\356\221\020\151\314\232\357\175\310\150\170 -\060\035\006\003\125\035\016\004\026\004\024\040\045\363\007\375 -\247\157\361\226\356\221\020\151\314\232\357\175\310\150\170\060 -\016\006\003\125\035\017\001\001\377\004\004\003\002\001\206\060 -\015\006\011\052\206\110\206\367\015\001\001\014\005\000\003\202 -\002\001\000\044\053\116\230\362\035\027\355\331\166\046\266\060 -\063\350\151\105\241\121\113\122\330\172\072\060\266\344\022\352 -\277\237\114\340\004\244\366\065\306\376\241\060\367\123\205\222 -\255\124\005\127\137\222\345\052\336\066\047\236\173\023\107\311 -\152\165\257\374\363\067\347\014\365\075\001\163\265\151\121\370 -\275\131\321\272\013\370\272\272\144\047\103\263\174\203\225\212 -\347\236\023\226\327\157\112\226\101\111\213\016\040\255\026\306 -\367\246\207\133\210\022\211\213\211\312\022\322\126\257\042\001 -\041\106\351\253\230\077\247\210\336\344\313\052\232\165\031\372 -\071\136\011\005\327\003\062\032\270\027\121\010\307\000\100\175 -\364\276\370\014\131\364\151\166\156\323\244\130\133\136\046\163 -\344\102\125\006\136\170\100\017\323\070\237\357\046\121\160\164 -\221\361\167\142\001\350\331\313\353\241\337\071\062\035\273\153 -\375\161\376\353\317\245\346\024\375\000\200\023\306\232\000\110 -\260\231\005\351\256\200\110\373\011\077\121\024\265\271\347\140 -\115\115\312\057\201\041\356\122\014\145\172\334\365\211\111\114 -\060\222\064\130\200\062\131\261\015\377\044\141\017\347\012\102 -\320\173\274\370\216\047\107\077\160\235\047\331\266\006\075\245 -\273\313\136\217\256\016\123\307\234\152\157\073\114\017\243\100 -\160\250\232\007\316\324\156\133\007\242\322\342\124\266\275\157 -\063\162\143\255\121\230\341\217\166\361\152\007\070\045\376\366 -\142\316\137\333\143\302\156\231\357\006\334\271\336\031\032\350 -\124\075\175\322\166\165\331\136\076\062\110\247\214\362\236\162 -\014\370\270\130\270\027\043\245\024\207\165\130\172\000\201\007 -\042\071\152\114\224\240\265\242\333\247\054\301\260\361\243\233 -\300\114\367\155\160\352\061\237\361\256\175\076\163\050\331\241 -\337\372\223\360\233\260\360\342\315\045\040\165\357\342\175\062 -\005\311\233\166\356\313\275\061\036\371\224\230\113\044\130\126 -\110\300\336\006\114\275\246\064\135\355\026\141\143\163\373\031 -\342\372\133\330\227\165\324\155\236\140\071\136\224\213\002\054 -\353\231\316\140\052\156\033\214\247\113\274\375\066\346\230\037 -\145\362\177\361\343\217\114\200\106\066\130\266\241\145\313\316 -\034\104\165 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Atos TrustedRoot Root CA RSA G2 2020" -# Issuer: CN=Atos TrustedRoot Root CA RSA G2 2020,O=Atos,C=DE -# Serial Number:47:ba:29:46:55:3e:16:92:97:b0:ab:40 -# Subject: CN=Atos TrustedRoot Root CA RSA G2 2020,O=Atos,C=DE -# Not Valid Before: Tue Dec 15 08:41:23 2020 -# Not Valid After : Mon Dec 10 08:41:22 2040 -# Fingerprint (SHA-256): 78:83:3A:78:3B:B2:98:6C:25:4B:93:70:D3:C2:0E:5E:BA:8F:A7:84:0C:BF:63:FE:17:29:7A:0B:01:19:68:5E -# Fingerprint (SHA1): 32:D1:27:FA:93:B1:C1:4C:99:E2:4A:40:BC:7F:94:41:1B:5A:AC:A4 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Atos TrustedRoot Root CA RSA G2 2020" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\062\321\047\372\223\261\301\114\231\342\112\100\274\177\224\101 -\033\132\254\244 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\333\077\351\043\365\264\214\335\350\263\076\250\265\137\146\066 -END -CKA_ISSUER MULTILINE_OCTAL -\060\113\061\013\060\011\006\003\125\004\006\023\002\104\105\061 -\015\060\013\006\003\125\004\012\014\004\101\164\157\163\061\055 -\060\053\006\003\125\004\003\014\044\101\164\157\163\040\124\162 -\165\163\164\145\144\122\157\157\164\040\122\157\157\164\040\103 -\101\040\122\123\101\040\107\062\040\062\060\062\060 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\014\107\272\051\106\125\076\026\222\227\260\253\100 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Atos TrustedRoot Root CA ECC TLS 2021" -# -# Issuer: C=DE,O=Atos,CN=Atos TrustedRoot Root CA ECC TLS 2021 -# Serial Number:3d:98:3b:a6:66:3d:90:63:f7:7e:26:57:38:04:ef:00 -# Subject: C=DE,O=Atos,CN=Atos TrustedRoot Root CA ECC TLS 2021 -# Not Valid Before: Thu Apr 22 09:26:23 2021 -# Not Valid After : Wed Apr 17 09:26:22 2041 -# Fingerprint (SHA-256): B2:FA:E5:3E:14:CC:D7:AB:92:12:06:47:01:AE:27:9C:1D:89:88:FA:CB:77:5F:A8:A0:08:91:4E:66:39:88:A8 -# Fingerprint (SHA1): 9E:BC:75:10:42:B3:02:F3:81:F4:F7:30:62:D4:8F:C3:A7:51:B2:DD -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Atos TrustedRoot Root CA ECC TLS 2021" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\114\061\056\060\054\006\003\125\004\003\014\045\101\164\157 -\163\040\124\162\165\163\164\145\144\122\157\157\164\040\122\157 -\157\164\040\103\101\040\105\103\103\040\124\114\123\040\062\060 -\062\061\061\015\060\013\006\003\125\004\012\014\004\101\164\157 -\163\061\013\060\011\006\003\125\004\006\023\002\104\105 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\114\061\056\060\054\006\003\125\004\003\014\045\101\164\157 -\163\040\124\162\165\163\164\145\144\122\157\157\164\040\122\157 -\157\164\040\103\101\040\105\103\103\040\124\114\123\040\062\060 -\062\061\061\015\060\013\006\003\125\004\012\014\004\101\164\157 -\163\061\013\060\011\006\003\125\004\006\023\002\104\105 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\075\230\073\246\146\075\220\143\367\176\046\127\070\004 -\357\000 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\025\060\202\001\233\240\003\002\001\002\002\020\075 -\230\073\246\146\075\220\143\367\176\046\127\070\004\357\000\060 -\012\006\010\052\206\110\316\075\004\003\003\060\114\061\056\060 -\054\006\003\125\004\003\014\045\101\164\157\163\040\124\162\165 -\163\164\145\144\122\157\157\164\040\122\157\157\164\040\103\101 -\040\105\103\103\040\124\114\123\040\062\060\062\061\061\015\060 -\013\006\003\125\004\012\014\004\101\164\157\163\061\013\060\011 -\006\003\125\004\006\023\002\104\105\060\036\027\015\062\061\060 -\064\062\062\060\071\062\066\062\063\132\027\015\064\061\060\064 -\061\067\060\071\062\066\062\062\132\060\114\061\056\060\054\006 -\003\125\004\003\014\045\101\164\157\163\040\124\162\165\163\164 -\145\144\122\157\157\164\040\122\157\157\164\040\103\101\040\105 -\103\103\040\124\114\123\040\062\060\062\061\061\015\060\013\006 -\003\125\004\012\014\004\101\164\157\163\061\013\060\011\006\003 -\125\004\006\023\002\104\105\060\166\060\020\006\007\052\206\110 -\316\075\002\001\006\005\053\201\004\000\042\003\142\000\004\226 -\206\130\050\067\012\147\320\240\336\044\031\031\341\344\005\007 -\037\227\355\350\144\202\271\366\304\161\120\316\212\014\377\327 -\265\166\273\241\154\223\154\203\242\150\156\245\331\276\054\210 -\225\101\315\135\335\261\312\203\143\203\314\300\276\164\331\340 -\235\244\356\112\116\126\340\230\051\101\223\122\020\325\044\070 -\002\062\147\361\224\022\157\357\327\305\336\056\375\031\200\243 -\102\060\100\060\017\006\003\125\035\023\001\001\377\004\005\060 -\003\001\001\377\060\035\006\003\125\035\016\004\026\004\024\166 -\050\045\326\175\340\146\232\172\011\262\152\073\216\063\327\066 -\323\117\242\060\016\006\003\125\035\017\001\001\377\004\004\003 -\002\001\206\060\012\006\010\052\206\110\316\075\004\003\003\003 -\150\000\060\145\002\060\133\231\051\363\234\061\266\211\153\154 -\326\275\167\341\174\347\121\176\270\072\315\243\066\137\174\367 -\074\167\076\344\120\255\250\347\322\131\014\046\216\060\073\156 -\010\052\302\247\132\310\002\061\000\231\343\014\347\243\303\257 -\323\111\056\106\202\043\146\135\311\000\024\022\375\070\364\341 -\230\153\167\051\172\333\044\317\145\100\277\322\334\214\021\350 -\364\175\177\040\204\251\102\344\050 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Atos TrustedRoot Root CA ECC TLS 2021" -# Issuer: C=DE,O=Atos,CN=Atos TrustedRoot Root CA ECC TLS 2021 -# Serial Number:3d:98:3b:a6:66:3d:90:63:f7:7e:26:57:38:04:ef:00 -# Subject: C=DE,O=Atos,CN=Atos TrustedRoot Root CA ECC TLS 2021 -# Not Valid Before: Thu Apr 22 09:26:23 2021 -# Not Valid After : Wed Apr 17 09:26:22 2041 -# Fingerprint (SHA-256): B2:FA:E5:3E:14:CC:D7:AB:92:12:06:47:01:AE:27:9C:1D:89:88:FA:CB:77:5F:A8:A0:08:91:4E:66:39:88:A8 -# Fingerprint (SHA1): 9E:BC:75:10:42:B3:02:F3:81:F4:F7:30:62:D4:8F:C3:A7:51:B2:DD -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Atos TrustedRoot Root CA ECC TLS 2021" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\236\274\165\020\102\263\002\363\201\364\367\060\142\324\217\303 -\247\121\262\335 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\026\237\255\361\160\255\171\326\355\051\264\321\305\171\160\250 -END -CKA_ISSUER MULTILINE_OCTAL -\060\114\061\056\060\054\006\003\125\004\003\014\045\101\164\157 -\163\040\124\162\165\163\164\145\144\122\157\157\164\040\122\157 -\157\164\040\103\101\040\105\103\103\040\124\114\123\040\062\060 -\062\061\061\015\060\013\006\003\125\004\012\014\004\101\164\157 -\163\061\013\060\011\006\003\125\004\006\023\002\104\105 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\075\230\073\246\146\075\220\143\367\176\046\127\070\004 -\357\000 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Atos TrustedRoot Root CA RSA TLS 2021" -# -# Issuer: C=DE,O=Atos,CN=Atos TrustedRoot Root CA RSA TLS 2021 -# Serial Number:53:d5:cf:e6:19:93:0b:fb:2b:05:12:d8:c2:2a:a2:a4 -# Subject: C=DE,O=Atos,CN=Atos TrustedRoot Root CA RSA TLS 2021 -# Not Valid Before: Thu Apr 22 09:21:10 2021 -# Not Valid After : Wed Apr 17 09:21:09 2041 -# Fingerprint (SHA-256): 81:A9:08:8E:A5:9F:B3:64:C5:48:A6:F8:55:59:09:9B:6F:04:05:EF:BF:18:E5:32:4E:C9:F4:57:BA:00:11:2F -# Fingerprint (SHA1): 18:52:3B:0D:06:37:E4:D6:3A:DF:23:E4:98:FB:5B:16:FB:86:74:48 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Atos TrustedRoot Root CA RSA TLS 2021" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\114\061\056\060\054\006\003\125\004\003\014\045\101\164\157 -\163\040\124\162\165\163\164\145\144\122\157\157\164\040\122\157 -\157\164\040\103\101\040\122\123\101\040\124\114\123\040\062\060 -\062\061\061\015\060\013\006\003\125\004\012\014\004\101\164\157 -\163\061\013\060\011\006\003\125\004\006\023\002\104\105 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\114\061\056\060\054\006\003\125\004\003\014\045\101\164\157 -\163\040\124\162\165\163\164\145\144\122\157\157\164\040\122\157 -\157\164\040\103\101\040\122\123\101\040\124\114\123\040\062\060 -\062\061\061\015\060\013\006\003\125\004\012\014\004\101\164\157 -\163\061\013\060\011\006\003\125\004\006\023\002\104\105 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\123\325\317\346\031\223\013\373\053\005\022\330\302\052 -\242\244 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\144\060\202\003\114\240\003\002\001\002\002\020\123 -\325\317\346\031\223\013\373\053\005\022\330\302\052\242\244\060 -\015\006\011\052\206\110\206\367\015\001\001\014\005\000\060\114 -\061\056\060\054\006\003\125\004\003\014\045\101\164\157\163\040 -\124\162\165\163\164\145\144\122\157\157\164\040\122\157\157\164 -\040\103\101\040\122\123\101\040\124\114\123\040\062\060\062\061 -\061\015\060\013\006\003\125\004\012\014\004\101\164\157\163\061 -\013\060\011\006\003\125\004\006\023\002\104\105\060\036\027\015 -\062\061\060\064\062\062\060\071\062\061\061\060\132\027\015\064 -\061\060\064\061\067\060\071\062\061\060\071\132\060\114\061\056 -\060\054\006\003\125\004\003\014\045\101\164\157\163\040\124\162 -\165\163\164\145\144\122\157\157\164\040\122\157\157\164\040\103 -\101\040\122\123\101\040\124\114\123\040\062\060\062\061\061\015 -\060\013\006\003\125\004\012\014\004\101\164\157\163\061\013\060 -\011\006\003\125\004\006\023\002\104\105\060\202\002\042\060\015 -\006\011\052\206\110\206\367\015\001\001\001\005\000\003\202\002 -\017\000\060\202\002\012\002\202\002\001\000\266\200\016\304\171 -\275\005\214\175\260\243\235\115\042\115\313\360\101\227\115\131 -\340\321\376\126\214\227\362\327\275\217\154\267\043\217\137\325 -\304\330\101\313\362\002\036\161\345\351\366\136\313\010\052\136 -\060\362\055\146\307\204\033\144\127\070\235\165\055\126\306\057 -\141\357\226\374\040\106\275\353\324\173\077\077\174\107\070\004 -\251\033\252\122\337\023\067\323\025\025\116\275\137\174\257\255 -\143\307\171\334\010\173\325\240\345\367\133\165\254\200\125\231 -\222\141\233\315\052\027\175\333\217\364\265\152\352\027\112\144 -\050\146\025\051\154\002\361\153\325\272\243\063\334\132\147\247 -\005\342\277\145\266\026\260\020\355\315\120\063\311\160\120\354 -\031\216\260\307\362\164\133\153\104\306\175\226\271\230\010\131 -\146\336\051\001\233\364\052\155\323\025\072\220\152\147\361\264 -\153\146\331\041\353\312\331\142\174\106\020\134\336\165\111\147 -\236\102\371\376\165\251\243\255\377\166\012\147\100\343\305\367 -\215\307\205\232\131\236\142\232\152\355\105\207\230\147\262\325 -\112\074\327\264\073\000\015\300\217\037\341\100\304\256\154\041 -\334\111\176\176\312\262\215\155\266\277\223\057\241\134\076\217 -\312\355\200\216\130\341\333\127\317\205\066\070\262\161\244\011 -\214\222\211\010\210\110\361\100\143\030\262\133\214\132\343\303 -\323\027\252\253\031\243\054\033\344\325\306\342\146\172\327\202 -\031\246\073\026\054\057\161\207\137\105\236\225\163\223\302\102 -\201\041\023\226\327\235\273\223\150\025\372\235\244\035\214\362 -\201\340\130\006\275\311\266\343\366\211\135\211\371\254\104\241 -\313\153\372\026\361\307\120\075\044\332\367\303\344\207\325\126 -\361\117\220\060\372\105\011\131\332\064\316\340\023\034\004\174 -\000\324\233\206\244\100\274\331\334\114\127\176\256\267\063\266 -\136\166\341\145\213\146\337\215\312\327\230\257\316\066\230\214 -\234\203\231\003\160\363\257\164\355\306\016\066\347\275\354\301 -\163\247\224\132\313\222\144\202\246\000\301\160\241\156\054\051 -\341\130\127\354\132\174\231\153\045\244\220\072\200\364\040\235 -\232\316\307\055\371\262\113\051\225\203\351\065\215\247\111\110 -\247\017\114\031\221\320\365\277\020\340\161\002\003\001\000\001 -\243\102\060\100\060\017\006\003\125\035\023\001\001\377\004\005 -\060\003\001\001\377\060\035\006\003\125\035\016\004\026\004\024 -\164\111\231\321\377\264\172\150\105\165\303\176\264\334\314\316 -\071\063\332\010\060\016\006\003\125\035\017\001\001\377\004\004 -\003\002\001\206\060\015\006\011\052\206\110\206\367\015\001\001 -\014\005\000\003\202\002\001\000\043\103\123\044\142\134\155\375 -\076\302\317\125\000\154\305\126\210\271\016\335\072\342\045\015 -\225\112\227\312\200\211\356\052\315\145\370\333\026\340\011\222 -\340\030\307\170\230\273\363\354\102\122\373\251\244\202\327\115 -\330\212\374\344\116\375\253\220\304\070\165\062\204\237\377\263 -\260\053\002\063\066\300\020\220\157\035\234\257\341\151\223\354 -\243\105\057\024\237\365\114\052\145\103\162\014\367\303\370\225 -\213\024\363\205\040\142\335\124\123\335\054\334\030\225\151\117 -\203\107\160\100\063\130\167\022\014\242\353\122\061\036\114\311 -\250\316\305\357\303\321\255\340\153\003\000\064\046\264\124\041 -\065\227\001\334\137\033\361\174\347\125\372\055\150\167\173\323 -\151\314\323\016\153\272\115\166\104\326\302\025\232\046\354\260 -\305\365\273\321\172\164\302\154\315\305\265\136\366\114\346\133 -\055\201\333\263\267\072\227\236\355\317\106\262\120\075\204\140 -\231\161\265\063\265\127\105\346\102\107\165\152\016\260\010\014 -\256\275\336\367\273\017\130\075\217\003\061\350\075\202\120\312 -\057\136\014\135\264\227\276\040\064\007\364\304\022\341\356\327 -\260\331\131\055\151\367\061\004\364\362\371\253\371\023\061\370 -\001\167\016\075\102\043\046\314\232\162\147\121\041\172\314\074 -\205\250\352\041\152\073\333\132\074\245\064\236\232\300\054\337 -\200\234\051\340\337\167\224\321\242\200\102\377\152\114\133\021 -\320\365\315\242\276\256\314\121\134\303\325\124\173\014\256\326 -\271\006\167\200\342\357\007\032\150\314\131\121\255\176\134\147 -\153\271\333\342\007\102\133\270\001\005\130\071\115\344\273\230 -\243\261\062\354\331\243\326\157\224\043\377\073\267\051\145\346 -\007\351\357\266\031\352\347\302\070\035\062\210\220\074\023\053 -\156\314\357\253\167\006\064\167\204\117\162\344\201\204\371\271 -\164\064\336\166\117\222\052\123\261\045\071\333\074\377\345\076 -\246\016\345\153\236\377\333\354\057\164\203\337\216\264\263\251 -\336\024\115\377\061\243\105\163\044\372\225\051\314\022\227\004 -\242\070\266\215\260\360\067\374\310\041\177\077\263\044\033\075 -\213\156\314\115\260\026\015\226\035\203\037\106\300\233\275\103 -\231\347\304\226\056\316\137\311 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Atos TrustedRoot Root CA RSA TLS 2021" -# Issuer: C=DE,O=Atos,CN=Atos TrustedRoot Root CA RSA TLS 2021 -# Serial Number:53:d5:cf:e6:19:93:0b:fb:2b:05:12:d8:c2:2a:a2:a4 -# Subject: C=DE,O=Atos,CN=Atos TrustedRoot Root CA RSA TLS 2021 -# Not Valid Before: Thu Apr 22 09:21:10 2021 -# Not Valid After : Wed Apr 17 09:21:09 2041 -# Fingerprint (SHA-256): 81:A9:08:8E:A5:9F:B3:64:C5:48:A6:F8:55:59:09:9B:6F:04:05:EF:BF:18:E5:32:4E:C9:F4:57:BA:00:11:2F -# Fingerprint (SHA1): 18:52:3B:0D:06:37:E4:D6:3A:DF:23:E4:98:FB:5B:16:FB:86:74:48 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Atos TrustedRoot Root CA RSA TLS 2021" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\030\122\073\015\006\067\344\326\072\337\043\344\230\373\133\026 -\373\206\164\110 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\324\323\106\270\232\300\234\166\135\236\072\303\271\231\061\322 -END -CKA_ISSUER MULTILINE_OCTAL -\060\114\061\056\060\054\006\003\125\004\003\014\045\101\164\157 -\163\040\124\162\165\163\164\145\144\122\157\157\164\040\122\157 -\157\164\040\103\101\040\122\123\101\040\124\114\123\040\062\060 -\062\061\061\015\060\013\006\003\125\004\012\014\004\101\164\157 -\163\061\013\060\011\006\003\125\004\006\023\002\104\105 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\123\325\317\346\031\223\013\373\053\005\022\330\302\052 -\242\244 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "TrustAsia Global Root CA G3" -# -# Issuer: CN=TrustAsia Global Root CA G3,O="TrustAsia Technologies, Inc.",C=CN -# Serial Number:64:f6:0e:65:77:61:6a:ab:3b:b4:ea:85:84:bb:b1:89:b8:71:93:0f -# Subject: CN=TrustAsia Global Root CA G3,O="TrustAsia Technologies, Inc.",C=CN -# Not Valid Before: Thu May 20 02:10:19 2021 -# Not Valid After : Sat May 19 02:10:19 2046 -# Fingerprint (SHA-256): E0:D3:22:6A:EB:11:63:C2:E4:8F:F9:BE:3B:50:B4:C6:43:1B:E7:BB:1E:AC:C5:C3:6B:5D:5E:C5:09:03:9A:08 -# Fingerprint (SHA1): 63:CF:B6:C1:27:2B:56:E4:88:8E:1C:23:9A:B6:2E:81:47:24:C3:C7 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "TrustAsia Global Root CA G3" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\132\061\013\060\011\006\003\125\004\006\023\002\103\116\061 -\045\060\043\006\003\125\004\012\014\034\124\162\165\163\164\101 -\163\151\141\040\124\145\143\150\156\157\154\157\147\151\145\163 -\054\040\111\156\143\056\061\044\060\042\006\003\125\004\003\014 -\033\124\162\165\163\164\101\163\151\141\040\107\154\157\142\141 -\154\040\122\157\157\164\040\103\101\040\107\063 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\132\061\013\060\011\006\003\125\004\006\023\002\103\116\061 -\045\060\043\006\003\125\004\012\014\034\124\162\165\163\164\101 -\163\151\141\040\124\145\143\150\156\157\154\157\147\151\145\163 -\054\040\111\156\143\056\061\044\060\042\006\003\125\004\003\014 -\033\124\162\165\163\164\101\163\151\141\040\107\154\157\142\141 -\154\040\122\157\157\164\040\103\101\040\107\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\144\366\016\145\167\141\152\253\073\264\352\205\204\273 -\261\211\270\161\223\017 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\245\060\202\003\215\240\003\002\001\002\002\024\144 -\366\016\145\167\141\152\253\073\264\352\205\204\273\261\211\270 -\161\223\017\060\015\006\011\052\206\110\206\367\015\001\001\014 -\005\000\060\132\061\013\060\011\006\003\125\004\006\023\002\103 -\116\061\045\060\043\006\003\125\004\012\014\034\124\162\165\163 -\164\101\163\151\141\040\124\145\143\150\156\157\154\157\147\151 -\145\163\054\040\111\156\143\056\061\044\060\042\006\003\125\004 -\003\014\033\124\162\165\163\164\101\163\151\141\040\107\154\157 -\142\141\154\040\122\157\157\164\040\103\101\040\107\063\060\036 -\027\015\062\061\060\065\062\060\060\062\061\060\061\071\132\027 -\015\064\066\060\065\061\071\060\062\061\060\061\071\132\060\132 -\061\013\060\011\006\003\125\004\006\023\002\103\116\061\045\060 -\043\006\003\125\004\012\014\034\124\162\165\163\164\101\163\151 -\141\040\124\145\143\150\156\157\154\157\147\151\145\163\054\040 -\111\156\143\056\061\044\060\042\006\003\125\004\003\014\033\124 -\162\165\163\164\101\163\151\141\040\107\154\157\142\141\154\040 -\122\157\157\164\040\103\101\040\107\063\060\202\002\042\060\015 -\006\011\052\206\110\206\367\015\001\001\001\005\000\003\202\002 -\017\000\060\202\002\012\002\202\002\001\000\300\061\202\141\222 -\344\224\033\012\052\145\320\276\006\251\207\073\121\022\352\160 -\101\256\342\373\164\352\012\215\271\263\114\334\217\267\023\122 -\117\124\030\341\054\163\225\221\305\146\073\152\317\254\143\155 -\207\123\360\367\361\071\267\240\103\143\260\304\003\135\127\251 -\347\104\316\304\241\203\145\366\120\076\261\176\026\270\072\212 -\002\320\226\037\000\315\005\041\357\006\155\335\041\234\031\103 -\105\241\305\350\200\312\302\255\100\142\027\006\306\252\274\363 -\326\346\374\120\176\146\102\037\074\213\246\171\171\206\100\065 -\237\040\357\077\353\213\107\037\217\216\305\324\216\266\054\311 -\104\004\343\324\103\165\077\325\077\257\034\314\176\106\137\254 -\337\144\020\212\357\106\360\220\360\017\055\364\210\013\261\051 -\252\257\205\252\111\130\250\277\143\240\070\221\346\263\346\167 -\150\304\371\052\031\204\273\016\341\365\257\211\354\245\057\120 -\040\164\036\022\101\163\036\044\331\312\316\054\241\131\065\300 -\310\035\106\047\141\132\217\371\115\323\162\171\146\036\237\025 -\220\041\055\375\355\213\126\160\003\112\111\076\177\151\061\022 -\151\307\036\134\312\172\023\213\350\346\365\140\017\314\223\054 -\204\177\361\374\152\374\233\107\235\333\255\210\075\363\166\165 -\063\327\113\244\310\213\371\365\103\130\117\313\310\003\124\217 -\245\205\170\004\032\363\163\362\327\207\035\101\237\347\330\027 -\316\032\234\017\112\374\334\104\150\124\150\342\101\074\376\054 -\204\206\067\074\315\077\057\242\333\347\367\124\003\137\131\323 -\367\221\170\307\213\167\152\026\345\111\205\220\105\162\160\057 -\221\135\370\076\145\100\013\031\231\311\046\040\132\150\301\065 -\277\117\247\121\361\330\021\053\133\340\232\236\050\073\012\072 -\012\037\301\201\345\056\360\246\271\151\245\210\224\346\153\023 -\177\321\144\077\075\234\160\106\345\242\205\173\130\204\047\334 -\304\200\076\147\232\232\307\232\061\016\060\354\346\027\100\225 -\331\105\355\001\226\252\277\014\363\113\321\143\367\023\130\300 -\270\363\372\147\335\233\175\155\112\377\062\114\265\045\073\377 -\034\147\017\205\042\131\005\221\221\101\167\201\320\205\114\207 -\020\161\377\236\103\033\256\225\165\055\201\002\003\001\000\001 -\243\143\060\141\060\017\006\003\125\035\023\001\001\377\004\005 -\060\003\001\001\377\060\037\006\003\125\035\043\004\030\060\026 -\200\024\100\344\344\362\043\357\070\312\260\256\127\177\362\041 -\060\026\064\333\274\222\060\035\006\003\125\035\016\004\026\004 -\024\100\344\344\362\043\357\070\312\260\256\127\177\362\041\060 -\026\064\333\274\222\060\016\006\003\125\035\017\001\001\377\004 -\004\003\002\001\006\060\015\006\011\052\206\110\206\367\015\001 -\001\014\005\000\003\202\002\001\000\046\073\121\341\115\070\363 -\062\030\264\264\136\341\145\136\304\224\117\324\247\141\243\370 -\300\317\063\001\002\351\303\252\065\017\361\224\023\167\167\065 -\236\055\126\121\104\156\341\306\056\050\036\377\332\354\107\315 -\227\104\027\367\340\114\302\341\174\174\062\172\146\310\132\266 -\134\123\105\127\132\105\324\005\231\057\056\043\125\356\143\150 -\337\323\033\170\247\022\224\006\000\165\015\162\204\351\056\274 -\132\152\325\336\057\131\307\243\354\322\207\146\333\267\124\265 -\044\253\364\103\170\333\113\004\304\157\335\346\076\146\076\051 -\362\113\150\161\042\207\240\370\261\063\143\166\343\015\205\162 -\104\042\125\077\034\174\351\374\270\025\350\122\372\252\076\243 -\041\071\065\164\211\246\152\302\071\372\170\317\266\254\347\347 -\326\126\377\043\222\056\120\013\251\265\007\063\364\070\137\244 -\111\246\313\145\160\166\350\012\205\200\113\066\075\063\367\225 -\124\165\045\332\254\304\163\202\145\351\122\365\134\375\070\225 -\002\152\151\060\305\034\012\127\007\256\042\244\054\371\305\101 -\267\270\354\237\117\110\000\371\001\004\125\314\254\371\062\061 -\304\165\225\006\240\177\321\215\047\335\263\251\244\162\207\376 -\131\213\232\172\164\026\335\026\245\142\051\353\072\226\334\213 -\247\150\131\323\353\167\221\071\370\327\313\331\217\137\132\047 -\001\175\135\150\031\142\330\310\315\364\267\162\107\276\133\227 -\316\362\255\242\231\223\255\224\313\223\366\022\011\225\266\253 -\327\073\320\077\021\313\060\026\056\171\200\344\147\201\055\135 -\355\160\170\266\140\131\254\341\135\105\143\217\310\337\162\150 -\133\352\035\270\001\361\176\373\347\212\263\343\124\240\070\011 -\340\074\336\102\362\302\355\056\233\363\037\065\266\066\330\343 -\200\241\213\315\231\144\017\302\252\253\261\312\365\157\236\103 -\215\204\124\231\263\156\300\022\146\330\160\020\361\006\065\063 -\103\250\234\056\272\024\061\316\020\177\034\206\343\217\322\325 -\370\167\354\233\253\361\057\143\331\102\137\340\147\201\144\221 -\361\227\057\374\156\046\366\063\370\323\265\370\304\142\253\061 -\121\045\002\172\370\335\153\145\325\155\115\060\310\145\272\150 -\024\145\254\047\013\164\212\362\207 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "TrustAsia Global Root CA G3" -# Issuer: CN=TrustAsia Global Root CA G3,O="TrustAsia Technologies, Inc.",C=CN -# Serial Number:64:f6:0e:65:77:61:6a:ab:3b:b4:ea:85:84:bb:b1:89:b8:71:93:0f -# Subject: CN=TrustAsia Global Root CA G3,O="TrustAsia Technologies, Inc.",C=CN -# Not Valid Before: Thu May 20 02:10:19 2021 -# Not Valid After : Sat May 19 02:10:19 2046 -# Fingerprint (SHA-256): E0:D3:22:6A:EB:11:63:C2:E4:8F:F9:BE:3B:50:B4:C6:43:1B:E7:BB:1E:AC:C5:C3:6B:5D:5E:C5:09:03:9A:08 -# Fingerprint (SHA1): 63:CF:B6:C1:27:2B:56:E4:88:8E:1C:23:9A:B6:2E:81:47:24:C3:C7 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "TrustAsia Global Root CA G3" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\143\317\266\301\047\053\126\344\210\216\034\043\232\266\056\201 -\107\044\303\307 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\060\102\033\267\273\201\165\065\344\026\117\123\322\224\336\004 -END -CKA_ISSUER MULTILINE_OCTAL -\060\132\061\013\060\011\006\003\125\004\006\023\002\103\116\061 -\045\060\043\006\003\125\004\012\014\034\124\162\165\163\164\101 -\163\151\141\040\124\145\143\150\156\157\154\157\147\151\145\163 -\054\040\111\156\143\056\061\044\060\042\006\003\125\004\003\014 -\033\124\162\165\163\164\101\163\151\141\040\107\154\157\142\141 -\154\040\122\157\157\164\040\103\101\040\107\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\144\366\016\145\167\141\152\253\073\264\352\205\204\273 -\261\211\270\161\223\017 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "TrustAsia Global Root CA G4" -# -# Issuer: CN=TrustAsia Global Root CA G4,O="TrustAsia Technologies, Inc.",C=CN -# Serial Number:4f:23:64:b8:8e:97:63:9e:c6:53:81:c1:76:4e:cb:2a:74:15:d6:d7 -# Subject: CN=TrustAsia Global Root CA G4,O="TrustAsia Technologies, Inc.",C=CN -# Not Valid Before: Thu May 20 02:10:22 2021 -# Not Valid After : Sat May 19 02:10:22 2046 -# Fingerprint (SHA-256): BE:4B:56:CB:50:56:C0:13:6A:52:6D:F4:44:50:8D:AA:36:A0:B5:4F:42:E4:AC:38:F7:2A:F4:70:E4:79:65:4C -# Fingerprint (SHA1): 57:73:A5:61:5D:80:B2:E6:AC:38:82:FC:68:07:31:AC:9F:B5:92:5A -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "TrustAsia Global Root CA G4" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\132\061\013\060\011\006\003\125\004\006\023\002\103\116\061 -\045\060\043\006\003\125\004\012\014\034\124\162\165\163\164\101 -\163\151\141\040\124\145\143\150\156\157\154\157\147\151\145\163 -\054\040\111\156\143\056\061\044\060\042\006\003\125\004\003\014 -\033\124\162\165\163\164\101\163\151\141\040\107\154\157\142\141 -\154\040\122\157\157\164\040\103\101\040\107\064 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\132\061\013\060\011\006\003\125\004\006\023\002\103\116\061 -\045\060\043\006\003\125\004\012\014\034\124\162\165\163\164\101 -\163\151\141\040\124\145\143\150\156\157\154\157\147\151\145\163 -\054\040\111\156\143\056\061\044\060\042\006\003\125\004\003\014 -\033\124\162\165\163\164\101\163\151\141\040\107\154\157\142\141 -\154\040\122\157\157\164\040\103\101\040\107\064 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\117\043\144\270\216\227\143\236\306\123\201\301\166\116 -\313\052\164\025\326\327 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\125\060\202\001\334\240\003\002\001\002\002\024\117 -\043\144\270\216\227\143\236\306\123\201\301\166\116\313\052\164 -\025\326\327\060\012\006\010\052\206\110\316\075\004\003\003\060 -\132\061\013\060\011\006\003\125\004\006\023\002\103\116\061\045 -\060\043\006\003\125\004\012\014\034\124\162\165\163\164\101\163 -\151\141\040\124\145\143\150\156\157\154\157\147\151\145\163\054 -\040\111\156\143\056\061\044\060\042\006\003\125\004\003\014\033 -\124\162\165\163\164\101\163\151\141\040\107\154\157\142\141\154 -\040\122\157\157\164\040\103\101\040\107\064\060\036\027\015\062 -\061\060\065\062\060\060\062\061\060\062\062\132\027\015\064\066 -\060\065\061\071\060\062\061\060\062\062\132\060\132\061\013\060 -\011\006\003\125\004\006\023\002\103\116\061\045\060\043\006\003 -\125\004\012\014\034\124\162\165\163\164\101\163\151\141\040\124 -\145\143\150\156\157\154\157\147\151\145\163\054\040\111\156\143 -\056\061\044\060\042\006\003\125\004\003\014\033\124\162\165\163 -\164\101\163\151\141\040\107\154\157\142\141\154\040\122\157\157 -\164\040\103\101\040\107\064\060\166\060\020\006\007\052\206\110 -\316\075\002\001\006\005\053\201\004\000\042\003\142\000\004\361 -\263\315\070\344\045\103\345\336\031\011\273\201\171\242\025\137 -\025\143\001\336\302\253\335\263\246\033\147\113\200\203\257\231 -\313\254\027\333\053\226\312\174\122\125\342\032\341\075\126\360 -\057\026\010\372\025\274\233\273\107\346\077\356\250\341\114\214 -\365\323\066\371\070\135\253\160\232\107\015\342\201\101\006\353 -\111\371\260\051\335\063\354\120\245\177\171\051\270\040\230\243 -\143\060\141\060\017\006\003\125\035\023\001\001\377\004\005\060 -\003\001\001\377\060\037\006\003\125\035\043\004\030\060\026\200 -\024\245\273\112\227\316\263\053\177\244\061\336\227\203\131\203 -\246\157\161\313\336\060\035\006\003\125\035\016\004\026\004\024 -\245\273\112\227\316\263\053\177\244\061\336\227\203\131\203\246 -\157\161\313\336\060\016\006\003\125\035\017\001\001\377\004\004 -\003\002\001\006\060\012\006\010\052\206\110\316\075\004\003\003 -\003\147\000\060\144\002\060\136\362\353\006\314\111\061\237\100 -\000\155\267\176\066\360\115\021\117\363\313\211\072\054\170\221 -\120\243\133\300\312\165\046\362\277\220\135\013\202\214\140\050 -\237\306\160\232\150\344\361\002\060\134\130\016\126\166\317\130 -\303\327\020\214\272\216\256\343\274\144\165\107\305\125\220\343 -\375\272\125\353\007\304\123\253\067\251\356\041\262\041\133\140 -\217\075\062\361\325\043\224\326\130 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "TrustAsia Global Root CA G4" -# Issuer: CN=TrustAsia Global Root CA G4,O="TrustAsia Technologies, Inc.",C=CN -# Serial Number:4f:23:64:b8:8e:97:63:9e:c6:53:81:c1:76:4e:cb:2a:74:15:d6:d7 -# Subject: CN=TrustAsia Global Root CA G4,O="TrustAsia Technologies, Inc.",C=CN -# Not Valid Before: Thu May 20 02:10:22 2021 -# Not Valid After : Sat May 19 02:10:22 2046 -# Fingerprint (SHA-256): BE:4B:56:CB:50:56:C0:13:6A:52:6D:F4:44:50:8D:AA:36:A0:B5:4F:42:E4:AC:38:F7:2A:F4:70:E4:79:65:4C -# Fingerprint (SHA1): 57:73:A5:61:5D:80:B2:E6:AC:38:82:FC:68:07:31:AC:9F:B5:92:5A -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "TrustAsia Global Root CA G4" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\127\163\245\141\135\200\262\346\254\070\202\374\150\007\061\254 -\237\265\222\132 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\124\335\262\327\137\330\076\355\174\340\013\056\314\355\353\353 -END -CKA_ISSUER MULTILINE_OCTAL -\060\132\061\013\060\011\006\003\125\004\006\023\002\103\116\061 -\045\060\043\006\003\125\004\012\014\034\124\162\165\163\164\101 -\163\151\141\040\124\145\143\150\156\157\154\157\147\151\145\163 -\054\040\111\156\143\056\061\044\060\042\006\003\125\004\003\014 -\033\124\162\165\163\164\101\163\151\141\040\107\154\157\142\141 -\154\040\122\157\157\164\040\103\101\040\107\064 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\117\043\144\270\216\227\143\236\306\123\201\301\166\116 -\313\052\164\025\326\327 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "D-Trust SBR Root CA 1 2022" -# -# Issuer: CN=D-Trust SBR Root CA 1 2022,O=D-Trust GmbH,C=DE -# Serial Number:52:cf:e4:8c:6d:a0:4a:f7:3f:82:97:0c:80:09:8c:95 -# Subject: CN=D-Trust SBR Root CA 1 2022,O=D-Trust GmbH,C=DE -# Not Valid Before: Wed Jul 06 11:30:00 2022 -# Not Valid After : Mon Jul 06 11:29:59 2037 -# Fingerprint (SHA-256): D9:2C:17:1F:5C:F8:90:BA:42:80:19:29:29:27:FE:22:F3:20:7F:D2:B5:44:49:CB:6F:67:5A:F4:92:21:46:E2 -# Fingerprint (SHA1): 0F:52:3A:6B:4E:7D:1D:18:05:A5:48:F9:4D:CD:E4:C3:1E:1B:E9:E6 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "D-Trust SBR Root CA 1 2022" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\111\061\013\060\011\006\003\125\004\006\023\002\104\105\061 -\025\060\023\006\003\125\004\012\023\014\104\055\124\162\165\163 -\164\040\107\155\142\110\061\043\060\041\006\003\125\004\003\023 -\032\104\055\124\162\165\163\164\040\123\102\122\040\122\157\157 -\164\040\103\101\040\061\040\062\060\062\062 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\111\061\013\060\011\006\003\125\004\006\023\002\104\105\061 -\025\060\023\006\003\125\004\012\023\014\104\055\124\162\165\163 -\164\040\107\155\142\110\061\043\060\041\006\003\125\004\003\023 -\032\104\055\124\162\165\163\164\040\123\102\122\040\122\157\157 -\164\040\103\101\040\061\040\062\060\062\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\122\317\344\214\155\240\112\367\077\202\227\014\200\011 -\214\225 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\136\060\202\001\343\240\003\002\001\002\002\020\122 -\317\344\214\155\240\112\367\077\202\227\014\200\011\214\225\060 -\012\006\010\052\206\110\316\075\004\003\003\060\111\061\013\060 -\011\006\003\125\004\006\023\002\104\105\061\025\060\023\006\003 -\125\004\012\023\014\104\055\124\162\165\163\164\040\107\155\142 -\110\061\043\060\041\006\003\125\004\003\023\032\104\055\124\162 -\165\163\164\040\123\102\122\040\122\157\157\164\040\103\101\040 -\061\040\062\060\062\062\060\036\027\015\062\062\060\067\060\066 -\061\061\063\060\060\060\132\027\015\063\067\060\067\060\066\061 -\061\062\071\065\071\132\060\111\061\013\060\011\006\003\125\004 -\006\023\002\104\105\061\025\060\023\006\003\125\004\012\023\014 -\104\055\124\162\165\163\164\040\107\155\142\110\061\043\060\041 -\006\003\125\004\003\023\032\104\055\124\162\165\163\164\040\123 -\102\122\040\122\157\157\164\040\103\101\040\061\040\062\060\062 -\062\060\166\060\020\006\007\052\206\110\316\075\002\001\006\005 -\053\201\004\000\042\003\142\000\004\131\223\071\366\214\111\146 -\050\327\141\014\310\253\177\014\243\055\337\242\244\174\222\053 -\150\325\056\176\036\100\313\264\150\111\177\022\241\253\177\127 -\237\031\056\143\056\133\376\146\161\014\063\017\271\336\153\304 -\210\303\261\357\354\071\100\343\226\253\333\345\173\256\037\334 -\371\257\106\232\152\106\006\057\307\067\144\213\027\142\376\226 -\303\242\356\204\340\260\227\071\274\243\201\217\060\201\214\060 -\017\006\003\125\035\023\001\001\377\004\005\060\003\001\001\377 -\060\035\006\003\125\035\016\004\026\004\024\361\051\243\036\001 -\022\035\075\165\126\115\307\120\174\305\031\252\017\030\267\060 -\016\006\003\125\035\017\001\001\377\004\004\003\002\001\006\060 -\112\006\003\125\035\037\004\103\060\101\060\077\240\075\240\073 -\206\071\150\164\164\160\072\057\057\143\162\154\056\144\055\164 -\162\165\163\164\056\156\145\164\057\143\162\154\057\144\055\164 -\162\165\163\164\137\163\142\162\137\162\157\157\164\137\143\141 -\137\061\137\062\060\062\062\056\143\162\154\060\012\006\010\052 -\206\110\316\075\004\003\003\003\151\000\060\146\002\061\000\227 -\371\336\256\113\217\230\265\036\100\177\062\175\115\124\103\332 -\211\315\302\252\222\074\321\202\036\163\317\372\114\222\040\373 -\143\047\305\365\163\075\011\075\367\247\141\206\214\363\152\002 -\061\000\347\057\174\270\365\045\214\073\071\037\066\253\215\365 -\206\242\056\341\172\144\332\147\071\002\376\376\063\077\331\163 -\266\130\133\072\374\262\244\331\140\170\167\314\171\247\246\256 -\125\275 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "D-Trust SBR Root CA 1 2022" -# Issuer: CN=D-Trust SBR Root CA 1 2022,O=D-Trust GmbH,C=DE -# Serial Number:52:cf:e4:8c:6d:a0:4a:f7:3f:82:97:0c:80:09:8c:95 -# Subject: CN=D-Trust SBR Root CA 1 2022,O=D-Trust GmbH,C=DE -# Not Valid Before: Wed Jul 06 11:30:00 2022 -# Not Valid After : Mon Jul 06 11:29:59 2037 -# Fingerprint (SHA-256): D9:2C:17:1F:5C:F8:90:BA:42:80:19:29:29:27:FE:22:F3:20:7F:D2:B5:44:49:CB:6F:67:5A:F4:92:21:46:E2 -# Fingerprint (SHA1): 0F:52:3A:6B:4E:7D:1D:18:05:A5:48:F9:4D:CD:E4:C3:1E:1B:E9:E6 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "D-Trust SBR Root CA 1 2022" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\017\122\072\153\116\175\035\030\005\245\110\371\115\315\344\303 -\036\033\351\346 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\023\074\033\202\352\156\352\355\144\142\351\132\171\005\151\004 -END -CKA_ISSUER MULTILINE_OCTAL -\060\111\061\013\060\011\006\003\125\004\006\023\002\104\105\061 -\025\060\023\006\003\125\004\012\023\014\104\055\124\162\165\163 -\164\040\107\155\142\110\061\043\060\041\006\003\125\004\003\023 -\032\104\055\124\162\165\163\164\040\123\102\122\040\122\157\157 -\164\040\103\101\040\061\040\062\060\062\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\122\317\344\214\155\240\112\367\077\202\227\014\200\011 -\214\225 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "D-Trust SBR Root CA 2 2022" -# -# Issuer: CN=D-Trust SBR Root CA 2 2022,O=D-Trust GmbH,C=DE -# Serial Number:54:d5:a3:95:1e:3d:95:ba:72:1b:9a:d0:31:21:4a:ba -# Subject: CN=D-Trust SBR Root CA 2 2022,O=D-Trust GmbH,C=DE -# Not Valid Before: Thu Jul 07 07:30:00 2022 -# Not Valid After : Tue Jul 07 07:29:59 2037 -# Fingerprint (SHA-256): DB:A8:4D:D7:EF:62:2D:48:54:63:A9:01:37:EA:4D:57:4D:F8:55:09:28:F6:AF:A0:3B:4D:8B:11:41:E6:36:CC -# Fingerprint (SHA1): 27:FF:63:B9:EF:34:29:31:03:38:1A:D8:60:60:DA:CC:60:28:35:E1 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "D-Trust SBR Root CA 2 2022" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\111\061\013\060\011\006\003\125\004\006\023\002\104\105\061 -\025\060\023\006\003\125\004\012\023\014\104\055\124\162\165\163 -\164\040\107\155\142\110\061\043\060\041\006\003\125\004\003\023 -\032\104\055\124\162\165\163\164\040\123\102\122\040\122\157\157 -\164\040\103\101\040\062\040\062\060\062\062 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\111\061\013\060\011\006\003\125\004\006\023\002\104\105\061 -\025\060\023\006\003\125\004\012\023\014\104\055\124\162\165\163 -\164\040\107\155\142\110\061\043\060\041\006\003\125\004\003\023 -\032\104\055\124\162\165\163\164\040\123\102\122\040\122\157\157 -\164\040\103\101\040\062\040\062\060\062\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\124\325\243\225\036\075\225\272\162\033\232\320\061\041 -\112\272 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\254\060\202\003\224\240\003\002\001\002\002\020\124 -\325\243\225\036\075\225\272\162\033\232\320\061\041\112\272\060 -\015\006\011\052\206\110\206\367\015\001\001\015\005\000\060\111 -\061\013\060\011\006\003\125\004\006\023\002\104\105\061\025\060 -\023\006\003\125\004\012\023\014\104\055\124\162\165\163\164\040 -\107\155\142\110\061\043\060\041\006\003\125\004\003\023\032\104 -\055\124\162\165\163\164\040\123\102\122\040\122\157\157\164\040 -\103\101\040\062\040\062\060\062\062\060\036\027\015\062\062\060 -\067\060\067\060\067\063\060\060\060\132\027\015\063\067\060\067 -\060\067\060\067\062\071\065\071\132\060\111\061\013\060\011\006 -\003\125\004\006\023\002\104\105\061\025\060\023\006\003\125\004 -\012\023\014\104\055\124\162\165\163\164\040\107\155\142\110\061 -\043\060\041\006\003\125\004\003\023\032\104\055\124\162\165\163 -\164\040\123\102\122\040\122\157\157\164\040\103\101\040\062\040 -\062\060\062\062\060\202\002\042\060\015\006\011\052\206\110\206 -\367\015\001\001\001\005\000\003\202\002\017\000\060\202\002\012 -\002\202\002\001\000\257\054\274\216\066\214\353\144\257\121\152 -\326\156\074\136\221\072\352\232\303\312\154\373\252\047\236\144 -\042\251\100\337\271\050\105\132\354\123\141\026\050\230\302\212 -\244\165\170\120\204\335\372\040\110\222\007\145\101\065\146\121 -\022\164\141\235\007\006\205\071\061\127\173\050\077\325\234\245 -\354\132\351\034\113\047\237\316\047\006\363\067\365\122\330\021 -\063\026\101\072\037\365\143\170\145\143\206\311\277\310\001\004 -\037\156\356\342\354\254\014\356\202\222\342\366\032\015\077\071 -\371\235\145\223\255\370\271\005\301\075\370\067\201\126\303\240 -\376\005\354\340\224\026\072\043\026\004\332\246\012\223\205\162 -\155\141\073\241\215\105\326\343\177\276\025\275\066\204\010\366 -\013\203\153\046\252\242\275\340\260\347\252\340\256\147\304\323 -\202\245\014\251\244\360\063\171\015\120\077\360\357\220\075\044 -\271\177\322\040\154\352\227\363\277\234\334\107\336\011\141\275 -\224\171\225\132\002\166\065\140\304\107\042\015\367\166\143\003 -\323\306\373\203\306\135\253\255\355\151\045\053\003\133\115\045 -\000\101\343\214\207\027\122\250\340\005\053\103\115\024\023\312 -\347\077\103\042\274\067\244\165\361\366\277\072\357\062\036\256 -\356\130\206\220\162\272\004\254\100\110\357\134\304\170\247\251 -\217\047\132\313\172\354\130\362\302\010\130\220\155\115\003\205 -\171\161\025\005\016\116\076\371\337\017\005\367\137\024\110\126 -\041\015\063\222\261\254\214\345\030\376\277\017\356\340\004\252 -\275\041\362\130\266\134\211\012\213\030\011\042\032\263\065\306 -\146\302\365\063\025\231\200\340\010\371\226\057\023\214\356\332 -\267\210\304\351\067\265\327\152\327\072\204\115\253\160\214\323 -\116\024\125\240\242\020\374\144\332\147\350\361\313\063\335\311 -\232\212\217\226\057\130\201\331\370\232\000\103\314\220\373\125 -\166\373\206\343\067\001\050\014\157\364\351\131\115\025\167\121 -\102\112\314\064\270\200\103\120\201\357\127\245\023\333\247\224 -\171\017\113\312\176\027\175\257\243\041\144\350\161\125\126\217 -\006\260\107\354\131\017\135\160\133\054\026\102\360\206\236\165 -\336\153\115\110\230\204\342\127\030\266\234\202\231\145\072\213 -\200\170\127\014\111\002\003\001\000\001\243\201\217\060\201\214 -\060\017\006\003\125\035\023\001\001\377\004\005\060\003\001\001 -\377\060\035\006\003\125\035\016\004\026\004\024\135\263\200\224 -\033\345\206\277\150\272\024\064\244\366\356\155\362\335\337\347 -\060\016\006\003\125\035\017\001\001\377\004\004\003\002\001\006 -\060\112\006\003\125\035\037\004\103\060\101\060\077\240\075\240 -\073\206\071\150\164\164\160\072\057\057\143\162\154\056\144\055 -\164\162\165\163\164\056\156\145\164\057\143\162\154\057\144\055 -\164\162\165\163\164\137\163\142\162\137\162\157\157\164\137\143 -\141\137\062\137\062\060\062\062\056\143\162\154\060\015\006\011 -\052\206\110\206\367\015\001\001\015\005\000\003\202\002\001\000 -\064\124\056\130\030\126\315\112\275\227\323\365\175\053\334\257 -\017\121\341\115\274\041\113\223\364\000\104\023\007\020\013\045 -\030\076\110\131\226\367\241\341\223\220\170\146\032\075\043\353 -\042\253\001\246\216\014\121\063\346\155\214\061\356\254\244\001 -\160\071\110\336\307\146\054\153\015\313\163\237\207\222\351\076 -\107\037\270\357\057\356\267\126\214\110\211\360\070\247\025\071 -\262\356\300\077\027\244\163\002\010\234\274\006\212\244\302\267 -\141\141\371\303\333\304\320\172\174\141\336\261\130\221\365\335 -\145\114\057\013\370\353\075\265\355\212\276\167\034\272\131\002 -\022\146\161\345\230\047\316\016\075\257\121\242\105\371\202\373 -\132\245\224\160\367\213\204\303\114\145\045\233\173\342\037\060 -\160\263\100\216\072\356\275\364\347\150\305\235\311\051\107\161 -\016\223\310\265\110\116\365\146\273\007\210\161\151\153\173\110 -\216\157\360\021\304\264\311\160\024\230\040\275\355\247\352\001 -\332\156\245\233\022\376\076\104\060\263\360\353\165\122\300\364 -\303\372\167\046\244\167\202\055\157\363\050\036\116\225\360\060 -\367\211\370\054\242\120\133\362\276\062\176\154\124\333\162\311 -\052\132\340\034\266\013\330\122\232\131\241\343\260\001\047\305 -\240\026\120\146\334\353\256\155\364\233\133\075\204\155\133\207 -\347\251\211\273\156\270\340\233\123\211\300\377\056\100\032\211 -\104\056\030\103\147\070\344\174\162\137\331\243\051\045\101\101 -\075\034\167\033\144\250\303\125\356\143\161\146\142\203\364\177 -\046\231\240\124\073\241\022\155\160\142\316\323\371\270\275\042 -\374\324\232\324\273\342\070\026\057\267\175\071\302\260\251\003 -\351\234\317\176\030\215\166\334\137\021\273\353\102\354\120\011 -\076\134\354\220\061\330\032\162\272\077\151\007\356\230\064\302 -\064\244\326\332\023\326\251\204\362\000\206\300\124\272\036\021 -\260\342\271\304\007\264\221\347\252\346\061\126\157\261\104\304 -\052\142\274\311\260\145\234\064\374\014\032\123\337\041\027\273 -\302\155\241\012\346\361\260\252\104\011\120\111\070\172\135\161 -\342\061\056\031\260\337\225\102\004\175\204\210\316\012\043\147 -\153\070\235\026\336\006\376\050\160\070\245\132\256\374\203\355 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "D-Trust SBR Root CA 2 2022" -# Issuer: CN=D-Trust SBR Root CA 2 2022,O=D-Trust GmbH,C=DE -# Serial Number:54:d5:a3:95:1e:3d:95:ba:72:1b:9a:d0:31:21:4a:ba -# Subject: CN=D-Trust SBR Root CA 2 2022,O=D-Trust GmbH,C=DE -# Not Valid Before: Thu Jul 07 07:30:00 2022 -# Not Valid After : Tue Jul 07 07:29:59 2037 -# Fingerprint (SHA-256): DB:A8:4D:D7:EF:62:2D:48:54:63:A9:01:37:EA:4D:57:4D:F8:55:09:28:F6:AF:A0:3B:4D:8B:11:41:E6:36:CC -# Fingerprint (SHA1): 27:FF:63:B9:EF:34:29:31:03:38:1A:D8:60:60:DA:CC:60:28:35:E1 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "D-Trust SBR Root CA 2 2022" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\047\377\143\271\357\064\051\061\003\070\032\330\140\140\332\314 -\140\050\065\341 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\220\361\364\053\074\247\312\112\210\073\005\053\010\124\205\336 -END -CKA_ISSUER MULTILINE_OCTAL -\060\111\061\013\060\011\006\003\125\004\006\023\002\104\105\061 -\025\060\023\006\003\125\004\012\023\014\104\055\124\162\165\163 -\164\040\107\155\142\110\061\043\060\041\006\003\125\004\003\023 -\032\104\055\124\162\165\163\164\040\123\102\122\040\122\157\157 -\164\040\103\101\040\062\040\062\060\062\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\124\325\243\225\036\075\225\272\162\033\232\320\061\041 -\112\272 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Telekom Security SMIME ECC Root 2021" -# -# Issuer: CN=Telekom Security SMIME ECC Root 2021,O=Deutsche Telekom Security GmbH,C=DE -# Serial Number:15:2a:dd:14:c9:18:d1:a4:56:40:86:a6:25:af:07:5f -# Subject: CN=Telekom Security SMIME ECC Root 2021,O=Deutsche Telekom Security GmbH,C=DE -# Not Valid Before: Thu Mar 18 11:08:30 2021 -# Not Valid After : Sat Mar 17 23:59:59 2046 -# Fingerprint (SHA-256): 3A:E6:DF:7E:0D:63:7A:65:A8:C8:16:12:EC:6F:9A:14:2F:85:A1:68:34:C1:02:80:D8:8E:70:70:28:51:87:55 -# Fingerprint (SHA1): B7:F9:1D:98:EC:25:93:F3:50:14:84:9A:A8:7E:22:10:3C:C4:39:27 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Telekom Security SMIME ECC Root 2021" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\145\061\013\060\011\006\003\125\004\006\023\002\104\105\061 -\047\060\045\006\003\125\004\012\014\036\104\145\165\164\163\143 -\150\145\040\124\145\154\145\153\157\155\040\123\145\143\165\162 -\151\164\171\040\107\155\142\110\061\055\060\053\006\003\125\004 -\003\014\044\124\145\154\145\153\157\155\040\123\145\143\165\162 -\151\164\171\040\123\115\111\115\105\040\105\103\103\040\122\157 -\157\164\040\062\060\062\061 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\145\061\013\060\011\006\003\125\004\006\023\002\104\105\061 -\047\060\045\006\003\125\004\012\014\036\104\145\165\164\163\143 -\150\145\040\124\145\154\145\153\157\155\040\123\145\143\165\162 -\151\164\171\040\107\155\142\110\061\055\060\053\006\003\125\004 -\003\014\044\124\145\154\145\153\157\155\040\123\145\143\165\162 -\151\164\171\040\123\115\111\115\105\040\105\103\103\040\122\157 -\157\164\040\062\060\062\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\025\052\335\024\311\030\321\244\126\100\206\246\045\257 -\007\137 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\107\060\202\001\315\240\003\002\001\002\002\020\025 -\052\335\024\311\030\321\244\126\100\206\246\045\257\007\137\060 -\012\006\010\052\206\110\316\075\004\003\003\060\145\061\013\060 -\011\006\003\125\004\006\023\002\104\105\061\047\060\045\006\003 -\125\004\012\014\036\104\145\165\164\163\143\150\145\040\124\145 -\154\145\153\157\155\040\123\145\143\165\162\151\164\171\040\107 -\155\142\110\061\055\060\053\006\003\125\004\003\014\044\124\145 -\154\145\153\157\155\040\123\145\143\165\162\151\164\171\040\123 -\115\111\115\105\040\105\103\103\040\122\157\157\164\040\062\060 -\062\061\060\036\027\015\062\061\060\063\061\070\061\061\060\070 -\063\060\132\027\015\064\066\060\063\061\067\062\063\065\071\065 -\071\132\060\145\061\013\060\011\006\003\125\004\006\023\002\104 -\105\061\047\060\045\006\003\125\004\012\014\036\104\145\165\164 -\163\143\150\145\040\124\145\154\145\153\157\155\040\123\145\143 -\165\162\151\164\171\040\107\155\142\110\061\055\060\053\006\003 -\125\004\003\014\044\124\145\154\145\153\157\155\040\123\145\143 -\165\162\151\164\171\040\123\115\111\115\105\040\105\103\103\040 -\122\157\157\164\040\062\060\062\061\060\166\060\020\006\007\052 -\206\110\316\075\002\001\006\005\053\201\004\000\042\003\142\000 -\004\260\031\217\242\153\265\307\315\017\060\231\067\014\303\140 -\133\361\361\047\040\125\075\300\222\213\253\127\241\157\163\203 -\041\302\103\023\014\136\211\252\307\005\065\171\223\142\220\326 -\135\023\037\321\172\240\274\236\020\247\146\174\106\012\260\127 -\154\277\346\124\071\070\041\154\022\134\161\314\323\132\137\155 -\267\247\206\337\263\337\356\302\347\211\101\226\065\366\057\112 -\265\243\102\060\100\060\035\006\003\125\035\016\004\026\004\024 -\053\313\001\014\143\303\123\022\245\250\127\257\320\234\203\373 -\275\220\072\113\060\017\006\003\125\035\023\001\001\377\004\005 -\060\003\001\001\377\060\016\006\003\125\035\017\001\001\377\004 -\004\003\002\001\006\060\012\006\010\052\206\110\316\075\004\003 -\003\003\150\000\060\145\002\061\000\326\274\110\222\207\107\003 -\307\160\073\045\266\037\256\106\147\163\164\000\047\113\344\245 -\004\242\003\337\136\050\255\156\136\003\310\335\150\234\266\277 -\224\020\110\225\057\017\377\030\213\002\060\001\100\063\236\227 -\227\115\005\362\164\124\014\315\071\375\152\153\011\301\044\077 -\141\216\070\241\267\350\327\104\025\021\142\377\016\141\067\107 -\113\100\177\112\137\262\147\132\163\165\302 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Telekom Security SMIME ECC Root 2021" -# Issuer: CN=Telekom Security SMIME ECC Root 2021,O=Deutsche Telekom Security GmbH,C=DE -# Serial Number:15:2a:dd:14:c9:18:d1:a4:56:40:86:a6:25:af:07:5f -# Subject: CN=Telekom Security SMIME ECC Root 2021,O=Deutsche Telekom Security GmbH,C=DE -# Not Valid Before: Thu Mar 18 11:08:30 2021 -# Not Valid After : Sat Mar 17 23:59:59 2046 -# Fingerprint (SHA-256): 3A:E6:DF:7E:0D:63:7A:65:A8:C8:16:12:EC:6F:9A:14:2F:85:A1:68:34:C1:02:80:D8:8E:70:70:28:51:87:55 -# Fingerprint (SHA1): B7:F9:1D:98:EC:25:93:F3:50:14:84:9A:A8:7E:22:10:3C:C4:39:27 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Telekom Security SMIME ECC Root 2021" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\267\371\035\230\354\045\223\363\120\024\204\232\250\176\042\020 -\074\304\071\047 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\165\275\136\355\174\015\146\076\007\244\233\274\002\007\330\264 -END -CKA_ISSUER MULTILINE_OCTAL -\060\145\061\013\060\011\006\003\125\004\006\023\002\104\105\061 -\047\060\045\006\003\125\004\012\014\036\104\145\165\164\163\143 -\150\145\040\124\145\154\145\153\157\155\040\123\145\143\165\162 -\151\164\171\040\107\155\142\110\061\055\060\053\006\003\125\004 -\003\014\044\124\145\154\145\153\157\155\040\123\145\143\165\162 -\151\164\171\040\123\115\111\115\105\040\105\103\103\040\122\157 -\157\164\040\062\060\062\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\025\052\335\024\311\030\321\244\126\100\206\246\045\257 -\007\137 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Telekom Security TLS ECC Root 2020" -# -# Issuer: CN=Telekom Security TLS ECC Root 2020,O=Deutsche Telekom Security GmbH,C=DE -# Serial Number:36:3a:96:8c:c9:5c:b2:58:cd:d0:01:5d:c5:e5:57:00 -# Subject: CN=Telekom Security TLS ECC Root 2020,O=Deutsche Telekom Security GmbH,C=DE -# Not Valid Before: Tue Aug 25 07:48:20 2020 -# Not Valid After : Fri Aug 25 23:59:59 2045 -# Fingerprint (SHA-256): 57:8A:F4:DE:D0:85:3F:4E:59:98:DB:4A:EA:F9:CB:EA:8D:94:5F:60:B6:20:A3:8D:1A:3C:13:B2:BC:7B:A8:E1 -# Fingerprint (SHA1): C0:F8:96:C5:A9:3B:01:06:21:07:DA:18:42:48:BC:E9:9D:88:D5:EC -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Telekom Security TLS ECC Root 2020" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\143\061\013\060\011\006\003\125\004\006\023\002\104\105\061 -\047\060\045\006\003\125\004\012\014\036\104\145\165\164\163\143 -\150\145\040\124\145\154\145\153\157\155\040\123\145\143\165\162 -\151\164\171\040\107\155\142\110\061\053\060\051\006\003\125\004 -\003\014\042\124\145\154\145\153\157\155\040\123\145\143\165\162 -\151\164\171\040\124\114\123\040\105\103\103\040\122\157\157\164 -\040\062\060\062\060 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\143\061\013\060\011\006\003\125\004\006\023\002\104\105\061 -\047\060\045\006\003\125\004\012\014\036\104\145\165\164\163\143 -\150\145\040\124\145\154\145\153\157\155\040\123\145\143\165\162 -\151\164\171\040\107\155\142\110\061\053\060\051\006\003\125\004 -\003\014\042\124\145\154\145\153\157\155\040\123\145\143\165\162 -\151\164\171\040\124\114\123\040\105\103\103\040\122\157\157\164 -\040\062\060\062\060 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\066\072\226\214\311\134\262\130\315\320\001\135\305\345 -\127\000 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\102\060\202\001\311\240\003\002\001\002\002\020\066 -\072\226\214\311\134\262\130\315\320\001\135\305\345\127\000\060 -\012\006\010\052\206\110\316\075\004\003\003\060\143\061\013\060 -\011\006\003\125\004\006\023\002\104\105\061\047\060\045\006\003 -\125\004\012\014\036\104\145\165\164\163\143\150\145\040\124\145 -\154\145\153\157\155\040\123\145\143\165\162\151\164\171\040\107 -\155\142\110\061\053\060\051\006\003\125\004\003\014\042\124\145 -\154\145\153\157\155\040\123\145\143\165\162\151\164\171\040\124 -\114\123\040\105\103\103\040\122\157\157\164\040\062\060\062\060 -\060\036\027\015\062\060\060\070\062\065\060\067\064\070\062\060 -\132\027\015\064\065\060\070\062\065\062\063\065\071\065\071\132 -\060\143\061\013\060\011\006\003\125\004\006\023\002\104\105\061 -\047\060\045\006\003\125\004\012\014\036\104\145\165\164\163\143 -\150\145\040\124\145\154\145\153\157\155\040\123\145\143\165\162 -\151\164\171\040\107\155\142\110\061\053\060\051\006\003\125\004 -\003\014\042\124\145\154\145\153\157\155\040\123\145\143\165\162 -\151\164\171\040\124\114\123\040\105\103\103\040\122\157\157\164 -\040\062\060\062\060\060\166\060\020\006\007\052\206\110\316\075 -\002\001\006\005\053\201\004\000\042\003\142\000\004\316\277\376 -\127\250\277\325\252\367\020\232\315\274\321\021\242\275\147\102 -\314\220\353\025\030\220\331\242\315\014\052\045\353\076\117\316 -\265\322\217\017\363\065\332\103\213\002\200\276\157\121\044\035 -\017\153\053\312\237\302\157\120\062\345\067\040\266\040\377\210 -\015\017\155\111\273\333\006\244\207\220\222\224\364\011\320\317 -\177\310\200\013\301\227\263\273\065\047\311\302\033\243\102\060 -\100\060\035\006\003\125\035\016\004\026\004\024\343\162\314\156 -\225\231\107\261\346\263\141\114\321\313\253\343\272\315\336\237 -\060\017\006\003\125\035\023\001\001\377\004\005\060\003\001\001 -\377\060\016\006\003\125\035\017\001\001\377\004\004\003\002\001 -\006\060\012\006\010\052\206\110\316\075\004\003\003\003\147\000 -\060\144\002\060\165\122\213\267\244\020\117\256\112\020\213\262 -\204\133\102\341\346\052\066\002\332\240\156\031\077\045\277\332 -\131\062\216\344\373\220\334\223\144\316\255\264\101\107\140\342 -\317\247\313\036\002\060\067\101\214\146\337\101\153\326\203\000 -\101\375\057\132\367\120\264\147\321\054\250\161\327\103\312\234 -\047\044\221\203\110\015\317\315\367\124\201\257\354\177\344\147 -\333\270\220\356\335\045 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Telekom Security TLS ECC Root 2020" -# Issuer: CN=Telekom Security TLS ECC Root 2020,O=Deutsche Telekom Security GmbH,C=DE -# Serial Number:36:3a:96:8c:c9:5c:b2:58:cd:d0:01:5d:c5:e5:57:00 -# Subject: CN=Telekom Security TLS ECC Root 2020,O=Deutsche Telekom Security GmbH,C=DE -# Not Valid Before: Tue Aug 25 07:48:20 2020 -# Not Valid After : Fri Aug 25 23:59:59 2045 -# Fingerprint (SHA-256): 57:8A:F4:DE:D0:85:3F:4E:59:98:DB:4A:EA:F9:CB:EA:8D:94:5F:60:B6:20:A3:8D:1A:3C:13:B2:BC:7B:A8:E1 -# Fingerprint (SHA1): C0:F8:96:C5:A9:3B:01:06:21:07:DA:18:42:48:BC:E9:9D:88:D5:EC -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Telekom Security TLS ECC Root 2020" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\300\370\226\305\251\073\001\006\041\007\332\030\102\110\274\351 -\235\210\325\354 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\301\253\376\152\020\054\003\215\274\034\042\062\300\205\247\375 -END -CKA_ISSUER MULTILINE_OCTAL -\060\143\061\013\060\011\006\003\125\004\006\023\002\104\105\061 -\047\060\045\006\003\125\004\012\014\036\104\145\165\164\163\143 -\150\145\040\124\145\154\145\153\157\155\040\123\145\143\165\162 -\151\164\171\040\107\155\142\110\061\053\060\051\006\003\125\004 -\003\014\042\124\145\154\145\153\157\155\040\123\145\143\165\162 -\151\164\171\040\124\114\123\040\105\103\103\040\122\157\157\164 -\040\062\060\062\060 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\066\072\226\214\311\134\262\130\315\320\001\135\305\345 -\127\000 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Telekom Security SMIME RSA Root 2023" -# -# Issuer: CN=Telekom Security SMIME RSA Root 2023,O=Deutsche Telekom Security GmbH,C=DE -# Serial Number:0c:7e:62:f5:79:73:3b:9d:43:8e:8b:63:ed:91:95:b8 -# Subject: CN=Telekom Security SMIME RSA Root 2023,O=Deutsche Telekom Security GmbH,C=DE -# Not Valid Before: Tue Mar 28 12:09:22 2023 -# Not Valid After : Fri Mar 27 23:59:59 2048 -# Fingerprint (SHA-256): 78:A6:56:34:4F:94:7E:9C:C0:F7:34:D9:05:3D:32:F6:74:20:86:B6:B9:CD:2C:AE:4F:AE:1A:2E:4E:FD:E0:48 -# Fingerprint (SHA1): 89:3F:6F:1C:E2:4D:7F:FB:C3:D3:14:7A:05:80:A7:DE:E1:0A:5E:4D -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Telekom Security SMIME RSA Root 2023" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\145\061\013\060\011\006\003\125\004\006\023\002\104\105\061 -\047\060\045\006\003\125\004\012\014\036\104\145\165\164\163\143 -\150\145\040\124\145\154\145\153\157\155\040\123\145\143\165\162 -\151\164\171\040\107\155\142\110\061\055\060\053\006\003\125\004 -\003\014\044\124\145\154\145\153\157\155\040\123\145\143\165\162 -\151\164\171\040\123\115\111\115\105\040\122\123\101\040\122\157 -\157\164\040\062\060\062\063 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\145\061\013\060\011\006\003\125\004\006\023\002\104\105\061 -\047\060\045\006\003\125\004\012\014\036\104\145\165\164\163\143 -\150\145\040\124\145\154\145\153\157\155\040\123\145\143\165\162 -\151\164\171\040\107\155\142\110\061\055\060\053\006\003\125\004 -\003\014\044\124\145\154\145\153\157\155\040\123\145\143\165\162 -\151\164\171\040\123\115\111\115\105\040\122\123\101\040\122\157 -\157\164\040\062\060\062\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\014\176\142\365\171\163\073\235\103\216\213\143\355\221 -\225\270 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\267\060\202\003\237\240\003\002\001\002\002\020\014 -\176\142\365\171\163\073\235\103\216\213\143\355\221\225\270\060 -\015\006\011\052\206\110\206\367\015\001\001\014\005\000\060\145 -\061\013\060\011\006\003\125\004\006\023\002\104\105\061\047\060 -\045\006\003\125\004\012\014\036\104\145\165\164\163\143\150\145 -\040\124\145\154\145\153\157\155\040\123\145\143\165\162\151\164 -\171\040\107\155\142\110\061\055\060\053\006\003\125\004\003\014 -\044\124\145\154\145\153\157\155\040\123\145\143\165\162\151\164 -\171\040\123\115\111\115\105\040\122\123\101\040\122\157\157\164 -\040\062\060\062\063\060\036\027\015\062\063\060\063\062\070\061 -\062\060\071\062\062\132\027\015\064\070\060\063\062\067\062\063 -\065\071\065\071\132\060\145\061\013\060\011\006\003\125\004\006 -\023\002\104\105\061\047\060\045\006\003\125\004\012\014\036\104 -\145\165\164\163\143\150\145\040\124\145\154\145\153\157\155\040 -\123\145\143\165\162\151\164\171\040\107\155\142\110\061\055\060 -\053\006\003\125\004\003\014\044\124\145\154\145\153\157\155\040 -\123\145\143\165\162\151\164\171\040\123\115\111\115\105\040\122 -\123\101\040\122\157\157\164\040\062\060\062\063\060\202\002\042 -\060\015\006\011\052\206\110\206\367\015\001\001\001\005\000\003 -\202\002\017\000\060\202\002\012\002\202\002\001\000\357\305\016 -\213\276\062\322\147\107\377\012\114\147\263\052\277\310\303\305 -\221\353\265\307\036\221\341\146\250\210\213\125\040\200\037\121 -\136\167\227\236\031\012\134\307\153\067\041\174\003\066\001\364 -\210\045\331\250\056\101\252\374\330\046\340\226\100\142\171\256 -\127\236\003\070\032\034\262\167\024\076\351\241\162\320\344\340 -\067\321\027\106\355\120\134\172\130\305\370\053\367\165\057\317 -\201\236\132\054\267\072\254\240\131\230\004\121\014\377\111\305 -\120\375\036\323\107\205\113\063\117\242\067\265\257\004\232\047 -\062\235\126\325\077\125\141\343\213\157\256\121\376\227\376\151 -\007\372\142\133\046\346\024\171\025\245\023\070\256\137\067\276 -\224\112\326\015\200\026\151\244\221\262\072\111\230\165\235\106 -\020\212\134\172\177\204\245\350\257\036\307\253\263\132\106\265 -\243\113\365\246\043\066\000\106\261\333\005\266\033\316\236\172 -\062\134\232\325\162\303\235\206\115\053\204\323\036\265\210\332 -\020\170\234\042\303\073\043\265\353\023\007\275\157\123\354\233 -\354\233\323\145\365\007\011\343\135\247\231\265\176\206\216\325 -\002\377\267\205\011\343\107\024\335\226\146\030\064\336\010\325 -\337\313\030\231\142\013\053\354\000\135\122\104\323\306\226\374 -\062\126\045\221\317\315\031\073\225\071\076\002\207\231\143\266 -\325\076\064\172\017\021\165\201\274\175\004\312\140\264\050\165 -\327\002\121\335\122\000\056\307\375\211\361\134\363\313\244\047 -\022\070\217\273\373\211\360\344\304\070\054\276\202\240\161\141 -\142\221\217\110\014\057\053\251\260\361\313\020\004\347\164\277 -\067\220\357\117\052\103\065\227\022\306\052\160\015\336\054\125 -\107\171\143\051\365\312\037\152\006\122\034\256\055\044\042\203 -\042\257\320\252\060\267\052\037\377\145\043\130\145\223\310\216 -\175\100\020\061\206\170\331\125\313\074\060\360\336\121\052\000 -\066\322\047\105\137\330\350\241\041\075\176\106\126\073\051\105 -\361\035\005\011\316\266\103\060\334\105\220\020\060\114\244\153 -\206\213\077\075\057\061\221\161\357\046\271\366\276\235\260\154 -\337\021\356\130\077\103\171\206\071\200\361\046\027\007\230\360 -\231\252\060\054\103\131\024\316\355\342\100\023\205\002\003\001 -\000\001\243\143\060\141\060\016\006\003\125\035\017\001\001\377 -\004\004\003\002\001\006\060\035\006\003\125\035\016\004\026\004 -\024\232\316\254\052\354\001\372\145\160\336\227\235\361\322\000 -\214\245\243\144\273\060\017\006\003\125\035\023\001\001\377\004 -\005\060\003\001\001\377\060\037\006\003\125\035\043\004\030\060 -\026\200\024\232\316\254\052\354\001\372\145\160\336\227\235\361 -\322\000\214\245\243\144\273\060\015\006\011\052\206\110\206\367 -\015\001\001\014\005\000\003\202\002\001\000\343\120\375\365\100 -\026\042\011\226\072\015\251\357\201\347\056\062\360\241\361\111 -\136\173\210\015\004\162\327\276\147\250\272\035\356\120\273\162 -\156\172\321\273\014\162\060\106\310\325\327\002\022\026\231\116 -\036\337\132\226\356\217\221\276\256\206\370\020\167\245\304\156 -\107\141\300\362\046\331\117\141\150\005\110\165\010\025\245\241 -\173\325\270\263\211\171\346\355\361\363\141\000\206\173\056\061 -\376\243\134\370\171\075\264\133\210\173\340\043\273\015\241\027 -\372\313\150\015\230\167\161\010\342\155\103\164\153\304\066\305 -\224\101\244\000\326\127\055\231\212\213\040\022\025\002\062\016 -\322\111\354\201\110\305\152\047\122\327\262\163\125\123\226\074 -\236\117\114\265\240\320\117\127\320\147\050\110\144\276\306\270 -\272\354\144\317\310\173\305\152\347\052\346\131\127\266\326\324 -\326\300\147\134\331\236\050\011\100\277\363\251\065\061\145\140 -\003\313\031\154\202\225\003\036\137\077\341\275\352\111\161\345 -\133\267\013\107\026\033\040\211\155\224\231\014\176\210\154\035 -\015\364\267\041\032\131\227\254\313\350\276\027\037\225\174\123 -\233\257\120\122\252\215\013\056\257\132\327\140\362\052\151\052 -\271\356\124\160\030\252\275\365\241\077\322\335\241\143\031\000 -\370\247\014\353\243\171\362\160\131\243\370\242\022\003\354\023 -\377\344\002\206\066\327\301\303\244\265\324\244\302\067\105\266 -\224\160\075\305\275\353\243\025\035\343\066\172\025\151\052\126 -\064\071\317\245\232\066\252\310\355\171\274\317\366\316\004\123 -\013\332\262\120\043\174\274\076\046\255\360\016\103\273\046\313 -\256\302\100\336\067\037\012\240\121\315\143\235\266\117\330\306 -\107\174\274\330\264\355\236\213\363\021\342\250\265\076\354\256 -\160\076\176\042\273\065\110\027\140\142\024\221\060\243\166\075 -\246\121\066\213\037\015\335\152\061\034\245\355\335\226\243\156 -\162\017\023\115\252\247\251\134\170\371\003\022\030\223\067\105 -\022\211\075\370\276\312\275\331\276\014\331\030\144\247\310\101 -\076\165\202\041\070\175\145\364\240\324\023\113\007\170\051\371 -\235\176\314\207\077\304\332\056\210\335\343\013\334\132\121\132 -\351\331\022\117\236\002\333\367\005\045\121 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Telekom Security SMIME RSA Root 2023" -# Issuer: CN=Telekom Security SMIME RSA Root 2023,O=Deutsche Telekom Security GmbH,C=DE -# Serial Number:0c:7e:62:f5:79:73:3b:9d:43:8e:8b:63:ed:91:95:b8 -# Subject: CN=Telekom Security SMIME RSA Root 2023,O=Deutsche Telekom Security GmbH,C=DE -# Not Valid Before: Tue Mar 28 12:09:22 2023 -# Not Valid After : Fri Mar 27 23:59:59 2048 -# Fingerprint (SHA-256): 78:A6:56:34:4F:94:7E:9C:C0:F7:34:D9:05:3D:32:F6:74:20:86:B6:B9:CD:2C:AE:4F:AE:1A:2E:4E:FD:E0:48 -# Fingerprint (SHA1): 89:3F:6F:1C:E2:4D:7F:FB:C3:D3:14:7A:05:80:A7:DE:E1:0A:5E:4D -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Telekom Security SMIME RSA Root 2023" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\211\077\157\034\342\115\177\373\303\323\024\172\005\200\247\336 -\341\012\136\115 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\353\335\044\371\050\017\243\302\303\156\012\077\320\303\015\033 -END -CKA_ISSUER MULTILINE_OCTAL -\060\145\061\013\060\011\006\003\125\004\006\023\002\104\105\061 -\047\060\045\006\003\125\004\012\014\036\104\145\165\164\163\143 -\150\145\040\124\145\154\145\153\157\155\040\123\145\143\165\162 -\151\164\171\040\107\155\142\110\061\055\060\053\006\003\125\004 -\003\014\044\124\145\154\145\153\157\155\040\123\145\143\165\162 -\151\164\171\040\123\115\111\115\105\040\122\123\101\040\122\157 -\157\164\040\062\060\062\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\014\176\142\365\171\163\073\235\103\216\213\143\355\221 -\225\270 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Telekom Security TLS RSA Root 2023" -# -# Issuer: CN=Telekom Security TLS RSA Root 2023,O=Deutsche Telekom Security GmbH,C=DE -# Serial Number:21:9c:54:2d:e8:f6:ec:71:77:fa:4e:e8:c3:70:57:97 -# Subject: CN=Telekom Security TLS RSA Root 2023,O=Deutsche Telekom Security GmbH,C=DE -# Not Valid Before: Tue Mar 28 12:16:45 2023 -# Not Valid After : Fri Mar 27 23:59:59 2048 -# Fingerprint (SHA-256): EF:C6:5C:AD:BB:59:AD:B6:EF:E8:4D:A2:23:11:B3:56:24:B7:1B:3B:1E:A0:DA:8B:66:55:17:4E:C8:97:86:46 -# Fingerprint (SHA1): 54:D3:AC:B3:BD:57:56:F6:85:9D:CE:E5:C3:21:E2:D4:AD:83:D0:93 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Telekom Security TLS RSA Root 2023" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\143\061\013\060\011\006\003\125\004\006\023\002\104\105\061 -\047\060\045\006\003\125\004\012\014\036\104\145\165\164\163\143 -\150\145\040\124\145\154\145\153\157\155\040\123\145\143\165\162 -\151\164\171\040\107\155\142\110\061\053\060\051\006\003\125\004 -\003\014\042\124\145\154\145\153\157\155\040\123\145\143\165\162 -\151\164\171\040\124\114\123\040\122\123\101\040\122\157\157\164 -\040\062\060\062\063 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\143\061\013\060\011\006\003\125\004\006\023\002\104\105\061 -\047\060\045\006\003\125\004\012\014\036\104\145\165\164\163\143 -\150\145\040\124\145\154\145\153\157\155\040\123\145\143\165\162 -\151\164\171\040\107\155\142\110\061\053\060\051\006\003\125\004 -\003\014\042\124\145\154\145\153\157\155\040\123\145\143\165\162 -\151\164\171\040\124\114\123\040\122\123\101\040\122\157\157\164 -\040\062\060\062\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\041\234\124\055\350\366\354\161\167\372\116\350\303\160 -\127\227 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\263\060\202\003\233\240\003\002\001\002\002\020\041 -\234\124\055\350\366\354\161\167\372\116\350\303\160\127\227\060 -\015\006\011\052\206\110\206\367\015\001\001\014\005\000\060\143 -\061\013\060\011\006\003\125\004\006\023\002\104\105\061\047\060 -\045\006\003\125\004\012\014\036\104\145\165\164\163\143\150\145 -\040\124\145\154\145\153\157\155\040\123\145\143\165\162\151\164 -\171\040\107\155\142\110\061\053\060\051\006\003\125\004\003\014 -\042\124\145\154\145\153\157\155\040\123\145\143\165\162\151\164 -\171\040\124\114\123\040\122\123\101\040\122\157\157\164\040\062 -\060\062\063\060\036\027\015\062\063\060\063\062\070\061\062\061 -\066\064\065\132\027\015\064\070\060\063\062\067\062\063\065\071 -\065\071\132\060\143\061\013\060\011\006\003\125\004\006\023\002 -\104\105\061\047\060\045\006\003\125\004\012\014\036\104\145\165 -\164\163\143\150\145\040\124\145\154\145\153\157\155\040\123\145 -\143\165\162\151\164\171\040\107\155\142\110\061\053\060\051\006 -\003\125\004\003\014\042\124\145\154\145\153\157\155\040\123\145 -\143\165\162\151\164\171\040\124\114\123\040\122\123\101\040\122 -\157\157\164\040\062\060\062\063\060\202\002\042\060\015\006\011 -\052\206\110\206\367\015\001\001\001\005\000\003\202\002\017\000 -\060\202\002\012\002\202\002\001\000\355\065\241\201\200\363\313 -\112\151\133\302\373\121\203\256\046\375\341\156\363\201\022\175 -\161\100\377\207\165\102\051\041\355\201\122\054\337\022\301\031 -\204\211\301\275\305\050\325\325\113\154\104\326\114\333\007\226 -\112\125\172\312\066\202\004\066\250\245\374\047\366\111\361\325 -\162\236\221\371\043\326\160\173\273\365\233\301\354\223\317\031 -\352\145\176\210\160\240\163\374\366\377\265\126\142\341\163\152 -\064\230\076\202\270\254\225\123\364\001\240\047\007\162\243\000 -\123\240\344\262\253\203\070\127\063\045\224\237\276\110\035\230 -\341\243\272\236\134\315\004\161\121\175\165\170\253\363\131\252 -\304\340\140\276\217\203\122\270\165\032\101\065\355\274\363\072 -\143\351\251\024\105\327\346\122\321\156\322\336\274\343\365\013 -\073\346\340\304\275\103\144\023\246\316\364\230\067\154\212\225 -\250\227\310\107\017\360\136\020\213\347\035\034\376\261\073\240 -\005\063\150\005\101\202\301\003\053\001\310\347\217\115\253\350 -\265\366\315\153\104\265\347\335\213\354\352\045\264\000\042\127 -\115\260\261\262\061\301\026\316\377\375\024\204\267\107\372\262 -\361\160\336\333\213\154\066\130\244\174\263\021\321\303\167\177 -\137\266\045\340\015\305\322\263\371\270\270\167\333\067\161\161 -\107\343\140\030\117\044\266\165\067\170\271\243\142\257\275\311 -\162\216\057\314\273\256\333\344\025\122\031\007\063\373\152\267 -\055\113\220\050\202\163\376\030\213\065\215\333\247\004\152\276 -\352\301\115\066\073\026\066\221\062\357\266\100\211\221\103\340 -\362\242\253\004\056\346\362\114\016\026\064\040\254\207\301\055 -\176\311\146\107\027\024\021\244\363\367\241\044\211\253\330\032 -\310\241\134\261\243\367\214\155\310\001\311\117\311\354\304\374 -\254\121\063\321\310\203\321\311\237\035\324\107\064\051\076\313 -\260\016\372\203\013\050\130\345\051\334\077\174\250\237\311\266 -\012\273\246\350\106\026\017\226\345\173\344\152\172\110\155\166 -\230\005\245\334\155\036\102\036\102\332\032\340\122\367\265\203 -\300\032\173\170\065\054\070\365\037\375\111\243\056\322\131\143 -\277\200\260\214\223\163\313\065\246\231\225\042\141\145\003\140 -\373\057\223\113\372\232\234\200\073\002\003\001\000\001\243\143 -\060\141\060\016\006\003\125\035\017\001\001\377\004\004\003\002 -\001\006\060\035\006\003\125\035\016\004\026\004\024\266\247\227 -\202\075\164\205\233\367\074\237\223\232\225\171\165\122\214\155 -\107\060\017\006\003\125\035\023\001\001\377\004\005\060\003\001 -\001\377\060\037\006\003\125\035\043\004\030\060\026\200\024\266 -\247\227\202\075\164\205\233\367\074\237\223\232\225\171\165\122 -\214\155\107\060\015\006\011\052\206\110\206\367\015\001\001\014 -\005\000\003\202\002\001\000\250\314\141\246\276\165\236\025\120 -\244\153\373\250\160\105\174\272\176\261\132\374\133\043\372\012 -\167\370\230\161\202\014\155\340\136\106\252\223\364\036\240\303 -\341\223\333\113\255\262\246\135\253\260\324\142\313\136\273\146 -\365\055\356\227\100\074\142\353\136\326\024\326\214\342\226\213 -\101\151\223\065\346\271\231\153\142\264\241\027\146\064\246\153 -\143\306\271\116\362\042\351\130\015\126\101\321\372\014\112\360 -\063\315\073\273\155\041\072\256\216\162\265\303\112\373\351\175 -\345\261\233\206\356\342\340\175\264\367\062\375\042\204\361\205 -\311\067\171\351\265\077\277\134\344\164\262\217\021\142\000\335 -\030\146\241\331\173\043\137\361\216\325\147\350\124\332\133\072 -\153\066\157\371\201\261\063\107\063\167\100\371\122\252\335\324 -\203\317\205\170\231\232\223\271\163\147\102\106\021\041\352\376 -\012\251\033\032\145\151\263\217\256\026\266\366\113\126\262\055 -\371\245\310\354\073\142\243\355\153\320\116\325\100\011\244\037 -\230\327\072\245\222\131\040\344\260\175\315\133\163\150\275\155 -\304\242\023\016\147\031\270\215\102\176\154\014\232\156\240\044 -\055\325\105\033\334\304\002\024\376\205\133\145\227\312\116\220 -\120\010\172\102\065\371\352\302\146\324\370\001\256\036\264\276 -\303\250\357\376\166\232\242\246\037\106\366\204\355\374\333\316 -\304\002\316\167\110\054\214\262\354\303\000\243\354\054\125\030 -\301\176\031\356\341\057\362\255\203\233\236\253\031\337\306\212 -\057\214\167\345\267\005\354\073\301\354\276\206\263\206\274\300 -\367\334\347\352\133\256\262\314\265\065\206\113\320\342\077\266 -\330\370\016\000\356\135\343\367\215\130\377\317\213\067\351\143 -\137\156\367\011\161\066\302\022\135\127\362\310\264\315\363\356 -\002\337\021\334\152\271\127\204\035\131\115\214\316\310\016\043 -\302\267\046\232\020\024\161\376\223\262\212\270\200\360\016\020 -\236\323\250\120\014\067\202\057\352\340\212\235\341\054\071\377 -\265\264\163\000\344\367\110\246\163\254\277\262\336\167\004\207 -\264\243\315\233\065\044\067\372\220\223\023\201\102\306\230\046 -\165\067\146\101\020\254\273\365\224\343\302\061\053\255\347\043 -\126\314\065\045\222\263\120 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Telekom Security TLS RSA Root 2023" -# Issuer: CN=Telekom Security TLS RSA Root 2023,O=Deutsche Telekom Security GmbH,C=DE -# Serial Number:21:9c:54:2d:e8:f6:ec:71:77:fa:4e:e8:c3:70:57:97 -# Subject: CN=Telekom Security TLS RSA Root 2023,O=Deutsche Telekom Security GmbH,C=DE -# Not Valid Before: Tue Mar 28 12:16:45 2023 -# Not Valid After : Fri Mar 27 23:59:59 2048 -# Fingerprint (SHA-256): EF:C6:5C:AD:BB:59:AD:B6:EF:E8:4D:A2:23:11:B3:56:24:B7:1B:3B:1E:A0:DA:8B:66:55:17:4E:C8:97:86:46 -# Fingerprint (SHA1): 54:D3:AC:B3:BD:57:56:F6:85:9D:CE:E5:C3:21:E2:D4:AD:83:D0:93 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Telekom Security TLS RSA Root 2023" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\124\323\254\263\275\127\126\366\205\235\316\345\303\041\342\324 -\255\203\320\223 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\277\133\353\124\100\315\110\161\304\040\215\175\336\012\102\362 -END -CKA_ISSUER MULTILINE_OCTAL -\060\143\061\013\060\011\006\003\125\004\006\023\002\104\105\061 -\047\060\045\006\003\125\004\012\014\036\104\145\165\164\163\143 -\150\145\040\124\145\154\145\153\157\155\040\123\145\143\165\162 -\151\164\171\040\107\155\142\110\061\053\060\051\006\003\125\004 -\003\014\042\124\145\154\145\153\157\155\040\123\145\143\165\162 -\151\164\171\040\124\114\123\040\122\123\101\040\122\157\157\164 -\040\062\060\062\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\041\234\124\055\350\366\354\161\167\372\116\350\303\160 -\127\227 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "TWCA CYBER Root CA" -# -# Issuer: CN=TWCA CYBER Root CA,OU=Root CA,O=TAIWAN-CA,C=TW -# Serial Number:40:01:34:8c:c2:00:00:00:00:00:00:00:01:3c:f2:c6 -# Subject: CN=TWCA CYBER Root CA,OU=Root CA,O=TAIWAN-CA,C=TW -# Not Valid Before: Tue Nov 22 06:54:29 2022 -# Not Valid After : Fri Nov 22 15:59:59 2047 -# Fingerprint (SHA-256): 3F:63:BB:28:14:BE:17:4E:C8:B6:43:9C:F0:8D:6D:56:F0:B7:C4:05:88:3A:56:48:A3:34:42:4D:6B:3E:C5:58 -# Fingerprint (SHA1): F6:B1:1C:1A:83:38:E9:7B:DB:B3:A8:C8:33:24:E0:2D:9C:7F:26:66 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "TWCA CYBER Root CA" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\120\061\013\060\011\006\003\125\004\006\023\002\124\127\061 -\022\060\020\006\003\125\004\012\023\011\124\101\111\127\101\116 -\055\103\101\061\020\060\016\006\003\125\004\013\023\007\122\157 -\157\164\040\103\101\061\033\060\031\006\003\125\004\003\023\022 -\124\127\103\101\040\103\131\102\105\122\040\122\157\157\164\040 -\103\101 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\120\061\013\060\011\006\003\125\004\006\023\002\124\127\061 -\022\060\020\006\003\125\004\012\023\011\124\101\111\127\101\116 -\055\103\101\061\020\060\016\006\003\125\004\013\023\007\122\157 -\157\164\040\103\101\061\033\060\031\006\003\125\004\003\023\022 -\124\127\103\101\040\103\131\102\105\122\040\122\157\157\164\040 -\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\100\001\064\214\302\000\000\000\000\000\000\000\001\074 -\362\306 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\215\060\202\003\165\240\003\002\001\002\002\020\100 -\001\064\214\302\000\000\000\000\000\000\000\001\074\362\306\060 -\015\006\011\052\206\110\206\367\015\001\001\014\005\000\060\120 -\061\013\060\011\006\003\125\004\006\023\002\124\127\061\022\060 -\020\006\003\125\004\012\023\011\124\101\111\127\101\116\055\103 -\101\061\020\060\016\006\003\125\004\013\023\007\122\157\157\164 -\040\103\101\061\033\060\031\006\003\125\004\003\023\022\124\127 -\103\101\040\103\131\102\105\122\040\122\157\157\164\040\103\101 -\060\036\027\015\062\062\061\061\062\062\060\066\065\064\062\071 -\132\027\015\064\067\061\061\062\062\061\065\065\071\065\071\132 -\060\120\061\013\060\011\006\003\125\004\006\023\002\124\127\061 -\022\060\020\006\003\125\004\012\023\011\124\101\111\127\101\116 -\055\103\101\061\020\060\016\006\003\125\004\013\023\007\122\157 -\157\164\040\103\101\061\033\060\031\006\003\125\004\003\023\022 -\124\127\103\101\040\103\131\102\105\122\040\122\157\157\164\040 -\103\101\060\202\002\042\060\015\006\011\052\206\110\206\367\015 -\001\001\001\005\000\003\202\002\017\000\060\202\002\012\002\202 -\002\001\000\306\370\312\036\331\011\040\176\035\154\116\316\217 -\343\107\063\104\234\307\311\151\252\072\133\170\356\160\322\222 -\370\004\263\122\122\035\147\162\050\241\337\213\135\225\012\376 -\352\315\355\367\051\316\360\157\177\254\315\075\357\263\034\105 -\152\367\050\220\361\141\127\305\014\304\243\120\135\336\324\265 -\313\031\312\200\271\165\316\051\316\322\205\042\354\002\143\314 -\104\060\040\332\352\221\133\126\346\035\034\325\235\146\307\077 -\337\206\312\113\123\304\331\215\262\035\352\370\334\047\123\243 -\107\341\141\314\175\265\260\370\356\163\221\305\316\163\157\316 -\356\020\037\032\006\317\351\047\140\305\117\031\344\353\316\042 -\046\105\327\140\231\335\316\117\067\340\177\347\143\255\260\270 -\131\270\320\006\150\065\140\323\066\256\161\103\004\361\151\145 -\170\174\363\037\363\312\050\237\132\040\225\146\264\315\267\356 -\217\170\244\105\030\351\046\057\215\233\051\050\261\244\267\072 -\155\271\324\034\070\162\105\130\261\136\353\360\050\233\267\202 -\312\375\317\326\063\017\237\373\227\236\261\034\234\236\352\137 -\136\333\252\335\124\351\060\041\050\155\216\171\363\165\222\214 -\046\376\334\305\366\303\260\337\104\131\103\243\266\003\050\366 -\010\060\252\015\063\341\357\234\251\007\042\343\131\133\100\217 -\332\210\267\151\010\250\267\043\056\104\011\131\067\133\307\343 -\027\362\042\353\156\071\122\305\336\124\247\230\311\113\040\225 -\334\106\211\137\264\022\371\205\051\216\353\310\047\025\040\300 -\113\324\314\174\014\154\064\014\046\233\046\061\246\074\247\366 -\331\320\113\242\144\377\073\231\101\162\301\340\160\227\361\044 -\273\053\304\164\042\261\254\153\042\062\044\323\170\052\300\300 -\241\057\361\122\005\311\077\357\166\146\342\105\330\015\075\255 -\225\310\307\211\046\310\017\256\247\003\056\373\301\137\372\040 -\341\160\255\260\145\040\067\063\140\260\325\257\327\014\034\302 -\220\160\327\112\030\274\176\001\260\260\353\025\036\104\006\315 -\244\117\350\014\321\303\040\020\341\124\145\236\266\121\320\032 -\166\153\102\132\130\166\064\352\267\067\031\256\056\165\371\226 -\345\301\131\367\224\127\051\045\215\072\114\253\115\232\101\320 -\137\046\003\002\003\001\000\001\243\143\060\141\060\016\006\003 -\125\035\017\001\001\377\004\004\003\002\001\006\060\017\006\003 -\125\035\023\001\001\377\004\005\060\003\001\001\377\060\037\006 -\003\125\035\043\004\030\060\026\200\024\235\205\141\024\174\301 -\142\157\227\150\344\117\067\100\341\255\340\015\126\067\060\035 -\006\003\125\035\016\004\026\004\024\235\205\141\024\174\301\142 -\157\227\150\344\117\067\100\341\255\340\015\126\067\060\015\006 -\011\052\206\110\206\367\015\001\001\014\005\000\003\202\002\001 -\000\144\217\172\304\142\016\265\210\314\270\307\206\016\241\112 -\026\315\160\013\267\247\205\013\263\166\266\017\247\377\010\213 -\013\045\317\250\324\203\165\052\270\226\210\266\373\337\055\055 -\264\151\123\041\065\127\326\211\115\163\277\151\217\160\243\141 -\314\232\333\036\232\340\040\370\154\273\233\042\235\135\204\061 -\232\054\212\335\152\241\327\050\151\312\376\166\125\172\106\147 -\353\314\103\210\026\242\003\326\271\027\370\031\154\155\043\002 -\177\361\137\320\012\051\043\073\321\252\012\355\251\027\046\124 -\012\115\302\245\115\370\305\375\270\201\317\053\054\170\243\147 -\114\251\007\232\363\337\136\373\174\365\211\315\164\227\141\020 -\152\007\053\201\132\322\216\267\347\040\321\040\156\044\250\204 -\047\241\127\254\252\125\130\057\334\331\312\372\150\004\236\355 -\104\044\371\164\100\073\043\063\253\203\132\030\046\102\266\155 -\124\265\026\140\060\154\261\240\370\270\101\240\135\111\111\322 -\145\005\072\352\376\235\141\274\206\331\277\336\323\272\072\261 -\177\176\222\064\216\311\000\156\334\230\275\334\354\200\005\255 -\002\075\337\145\355\013\003\367\367\026\204\004\061\272\223\224 -\330\362\022\370\212\343\277\102\257\247\324\315\021\027\026\310 -\102\035\024\250\102\366\322\100\206\240\117\043\312\226\105\126 -\140\006\315\267\125\001\246\001\224\145\376\156\005\011\272\264 -\244\252\342\357\130\276\275\047\126\330\357\163\161\133\104\063 -\362\232\162\352\260\136\076\156\251\122\133\354\160\155\265\207 -\217\067\136\074\214\234\316\344\360\316\014\147\101\314\316\366 -\200\253\116\314\114\126\365\301\141\131\223\264\076\246\332\270 -\067\022\237\052\062\343\213\270\041\354\303\053\145\014\357\042 -\336\210\051\073\114\327\372\376\267\341\107\276\234\076\076\203 -\373\121\135\365\150\367\056\041\205\334\277\361\132\342\174\327 -\305\344\203\301\152\353\272\200\132\336\134\055\160\166\370\310 -\345\207\207\312\240\235\241\345\042\022\047\017\104\075\035\154 -\352\324\302\213\057\157\171\253\177\120\246\304\031\247\241\172 -\267\226\371\301\037\142\132\242\103\007\100\136\046\306\254\355 -\256\160\026\305\252\312\162\212\115\260\317\001\213\003\077\156 -\327 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "TWCA CYBER Root CA" -# Issuer: CN=TWCA CYBER Root CA,OU=Root CA,O=TAIWAN-CA,C=TW -# Serial Number:40:01:34:8c:c2:00:00:00:00:00:00:00:01:3c:f2:c6 -# Subject: CN=TWCA CYBER Root CA,OU=Root CA,O=TAIWAN-CA,C=TW -# Not Valid Before: Tue Nov 22 06:54:29 2022 -# Not Valid After : Fri Nov 22 15:59:59 2047 -# Fingerprint (SHA-256): 3F:63:BB:28:14:BE:17:4E:C8:B6:43:9C:F0:8D:6D:56:F0:B7:C4:05:88:3A:56:48:A3:34:42:4D:6B:3E:C5:58 -# Fingerprint (SHA1): F6:B1:1C:1A:83:38:E9:7B:DB:B3:A8:C8:33:24:E0:2D:9C:7F:26:66 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "TWCA CYBER Root CA" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\366\261\034\032\203\070\351\173\333\263\250\310\063\044\340\055 -\234\177\046\146 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\013\063\240\227\122\225\324\251\375\273\333\156\243\125\133\121 -END -CKA_ISSUER MULTILINE_OCTAL -\060\120\061\013\060\011\006\003\125\004\006\023\002\124\127\061 -\022\060\020\006\003\125\004\012\023\011\124\101\111\127\101\116 -\055\103\101\061\020\060\016\006\003\125\004\013\023\007\122\157 -\157\164\040\103\101\061\033\060\031\006\003\125\004\003\023\022 -\124\127\103\101\040\103\131\102\105\122\040\122\157\157\164\040 -\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\100\001\064\214\302\000\000\000\000\000\000\000\001\074 -\362\306 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "TWCA Global Root CA G2" -# -# Issuer: CN=TWCA Global Root CA G2,OU=Root CA,O=TAIWAN-CA,C=TW -# Serial Number:40:01:34:8c:c2:00:00:00:00:00:00:00:01:97:58:f4 -# Subject: CN=TWCA Global Root CA G2,OU=Root CA,O=TAIWAN-CA,C=TW -# Not Valid Before: Tue Nov 22 06:42:21 2022 -# Not Valid After : Fri Nov 22 15:59:59 2047 -# Fingerprint (SHA-256): 3A:00:72:D4:9F:FC:04:E9:96:C5:9A:EB:75:99:1D:3C:34:0F:36:15:D6:FD:4D:CE:90:AC:0B:3D:88:EA:D4:F4 -# Fingerprint (SHA1): 73:FE:92:2F:83:63:91:FF:C8:C6:C4:DA:D6:20:2F:6B:07:2E:7F:1B -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "TWCA Global Root CA G2" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\124\061\013\060\011\006\003\125\004\006\023\002\124\127\061 -\022\060\020\006\003\125\004\012\023\011\124\101\111\127\101\116 -\055\103\101\061\020\060\016\006\003\125\004\013\023\007\122\157 -\157\164\040\103\101\061\037\060\035\006\003\125\004\003\023\026 -\124\127\103\101\040\107\154\157\142\141\154\040\122\157\157\164 -\040\103\101\040\107\062 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\124\061\013\060\011\006\003\125\004\006\023\002\124\127\061 -\022\060\020\006\003\125\004\012\023\011\124\101\111\127\101\116 -\055\103\101\061\020\060\016\006\003\125\004\013\023\007\122\157 -\157\164\040\103\101\061\037\060\035\006\003\125\004\003\023\026 -\124\127\103\101\040\107\154\157\142\141\154\040\122\157\157\164 -\040\103\101\040\107\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\100\001\064\214\302\000\000\000\000\000\000\000\001\227 -\130\364 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\225\060\202\003\175\240\003\002\001\002\002\020\100 -\001\064\214\302\000\000\000\000\000\000\000\001\227\130\364\060 -\015\006\011\052\206\110\206\367\015\001\001\014\005\000\060\124 -\061\013\060\011\006\003\125\004\006\023\002\124\127\061\022\060 -\020\006\003\125\004\012\023\011\124\101\111\127\101\116\055\103 -\101\061\020\060\016\006\003\125\004\013\023\007\122\157\157\164 -\040\103\101\061\037\060\035\006\003\125\004\003\023\026\124\127 -\103\101\040\107\154\157\142\141\154\040\122\157\157\164\040\103 -\101\040\107\062\060\036\027\015\062\062\061\061\062\062\060\066 -\064\062\062\061\132\027\015\064\067\061\061\062\062\061\065\065 -\071\065\071\132\060\124\061\013\060\011\006\003\125\004\006\023 -\002\124\127\061\022\060\020\006\003\125\004\012\023\011\124\101 -\111\127\101\116\055\103\101\061\020\060\016\006\003\125\004\013 -\023\007\122\157\157\164\040\103\101\061\037\060\035\006\003\125 -\004\003\023\026\124\127\103\101\040\107\154\157\142\141\154\040 -\122\157\157\164\040\103\101\040\107\062\060\202\002\042\060\015 -\006\011\052\206\110\206\367\015\001\001\001\005\000\003\202\002 -\017\000\060\202\002\012\002\202\002\001\000\252\016\325\040\222 -\001\255\202\371\014\010\221\064\153\212\026\320\106\026\377\003 -\270\330\215\352\223\064\373\377\053\275\375\156\252\334\233\362 -\206\201\125\365\211\034\304\215\165\152\130\170\221\023\036\002 -\023\160\075\357\276\012\347\000\217\270\061\345\164\305\060\276 -\377\175\326\231\345\302\102\243\317\041\326\263\010\177\221\325 -\141\346\242\225\020\015\357\136\227\013\111\070\325\042\260\327 -\213\131\157\237\065\233\177\322\221\314\172\177\273\240\237\336 -\125\063\366\113\215\012\352\175\011\300\171\334\275\104\342\376 -\034\347\144\041\050\317\004\112\342\264\277\206\171\052\273\016 -\223\311\217\136\254\060\071\122\220\007\271\352\234\046\102\024 -\304\147\106\376\321\032\150\241\076\120\031\243\046\012\047\051 -\220\302\366\264\353\163\232\170\036\341\230\364\145\014\065\041 -\006\370\013\336\142\345\115\301\263\135\331\271\372\141\227\052 -\343\352\307\104\125\044\222\376\022\247\077\304\167\340\055\002 -\201\007\325\373\175\346\020\236\072\264\250\357\354\373\120\352 -\065\317\314\176\273\102\271\104\154\122\351\277\052\162\037\077 -\336\233\160\351\334\132\305\073\273\277\360\131\205\257\057\301 -\260\024\171\005\254\165\237\045\365\021\047\006\140\041\307\155 -\145\276\250\211\234\345\254\106\337\370\135\104\003\215\140\275 -\367\261\015\314\057\357\101\124\057\356\153\225\271\116\174\064 -\337\073\371\167\235\175\315\007\075\034\006\063\022\200\354\162 -\234\362\055\202\332\325\073\304\307\371\004\303\144\002\174\365 -\065\140\247\264\106\051\056\033\357\245\130\200\056\172\211\121 -\070\066\074\375\241\167\270\200\060\320\212\336\215\247\064\046 -\354\043\273\030\125\030\066\105\356\355\001\006\252\115\277\144 -\014\312\230\227\032\061\002\146\370\170\150\133\210\337\011\250 -\347\233\372\064\155\160\034\041\255\010\213\362\241\266\254\166 -\152\277\361\200\045\000\276\074\036\115\256\271\074\266\225\143 -\275\153\176\107\022\220\125\105\021\215\354\027\037\301\276\047 -\201\223\127\143\151\000\046\167\213\303\131\345\173\321\015\104 -\362\250\360\367\205\232\005\367\302\056\160\232\223\205\330\225 -\220\061\220\124\246\354\013\237\067\105\017\002\003\001\000\001 -\243\143\060\141\060\016\006\003\125\035\017\001\001\377\004\004 -\003\002\001\006\060\017\006\003\125\035\023\001\001\377\004\005 -\060\003\001\001\377\060\037\006\003\125\035\043\004\030\060\026 -\200\024\222\214\324\066\321\133\107\123\304\161\015\204\335\144 -\052\365\066\144\100\347\060\035\006\003\125\035\016\004\026\004 -\024\222\214\324\066\321\133\107\123\304\161\015\204\335\144\052 -\365\066\144\100\347\060\015\006\011\052\206\110\206\367\015\001 -\001\014\005\000\003\202\002\001\000\045\374\113\332\220\264\332 -\165\347\101\072\201\321\246\376\240\152\363\030\161\142\152\044 -\010\213\251\172\115\311\125\316\317\020\050\056\004\031\226\005 -\317\135\002\040\052\073\263\125\077\001\315\102\315\262\167\355 -\377\165\363\174\167\333\226\245\317\214\147\006\364\244\233\162 -\366\041\111\011\230\243\062\136\167\132\143\011\357\142\103\227 -\002\070\265\352\074\030\120\150\374\131\133\331\171\324\361\344 -\126\110\023\126\330\323\161\013\136\170\224\070\021\105\372\005 -\027\365\016\165\036\142\122\141\106\272\056\031\255\206\264\210 -\017\261\120\346\100\000\064\032\225\235\223\340\121\371\324\125 -\106\351\225\074\045\206\056\227\327\001\061\030\104\354\034\140 -\351\175\151\257\062\370\227\100\045\044\266\215\032\125\074\305 -\267\367\274\006\122\073\161\060\160\076\161\027\176\361\146\004 -\136\135\274\212\061\103\246\222\035\173\124\322\245\066\213\157 -\215\326\136\332\324\303\056\035\337\071\125\140\202\060\236\047 -\377\216\200\335\143\114\246\125\065\330\320\063\251\200\155\076 -\136\235\314\250\147\200\146\372\231\127\014\122\312\031\165\260 -\070\065\125\052\201\305\214\036\126\327\137\220\362\040\330\332 -\340\146\161\351\262\170\253\147\271\044\156\153\066\162\374\157 -\215\375\177\162\071\050\147\122\221\005\037\127\145\322\243\247 -\015\141\372\241\347\325\065\106\225\311\006\207\366\060\354\062 -\121\251\254\126\300\041\116\243\024\164\005\072\274\343\277\155 -\075\116\077\136\245\244\155\051\277\204\121\165\123\216\206\032 -\365\121\160\052\015\034\116\100\341\375\243\343\245\053\147\220 -\222\307\154\256\205\277\072\233\027\025\312\234\052\223\324\115 -\071\015\274\040\010\243\215\210\154\011\015\214\256\104\041\115 -\311\161\354\330\046\327\027\236\055\021\030\074\243\042\175\270 -\047\124\277\150\310\073\102\314\217\136\116\347\334\302\305\372 -\152\104\017\215\126\210\172\337\211\204\154\240\263\076\075\361 -\145\000\011\210\352\052\353\100\316\263\135\254\062\027\256\301 -\233\351\320\301\365\111\224\335\247\316\174\132\007\353\256\040 -\234\027\060\222\151\223\162\363\232\133\161\233\376\152\337\172 -\060\151\216\263\056\333\017\054\335 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "TWCA Global Root CA G2" -# Issuer: CN=TWCA Global Root CA G2,OU=Root CA,O=TAIWAN-CA,C=TW -# Serial Number:40:01:34:8c:c2:00:00:00:00:00:00:00:01:97:58:f4 -# Subject: CN=TWCA Global Root CA G2,OU=Root CA,O=TAIWAN-CA,C=TW -# Not Valid Before: Tue Nov 22 06:42:21 2022 -# Not Valid After : Fri Nov 22 15:59:59 2047 -# Fingerprint (SHA-256): 3A:00:72:D4:9F:FC:04:E9:96:C5:9A:EB:75:99:1D:3C:34:0F:36:15:D6:FD:4D:CE:90:AC:0B:3D:88:EA:D4:F4 -# Fingerprint (SHA1): 73:FE:92:2F:83:63:91:FF:C8:C6:C4:DA:D6:20:2F:6B:07:2E:7F:1B -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "TWCA Global Root CA G2" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\163\376\222\057\203\143\221\377\310\306\304\332\326\040\057\153 -\007\056\177\033 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\023\215\135\372\031\265\346\253\144\173\020\164\160\032\043\056 -END -CKA_ISSUER MULTILINE_OCTAL -\060\124\061\013\060\011\006\003\125\004\006\023\002\124\127\061 -\022\060\020\006\003\125\004\012\023\011\124\101\111\127\101\116 -\055\103\101\061\020\060\016\006\003\125\004\013\023\007\122\157 -\157\164\040\103\101\061\037\060\035\006\003\125\004\003\023\026 -\124\127\103\101\040\107\154\157\142\141\154\040\122\157\157\164 -\040\103\101\040\107\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\100\001\064\214\302\000\000\000\000\000\000\000\001\227 -\130\364 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "SecureSign Root CA14" -# -# Issuer: CN=SecureSign Root CA14,O="Cybertrust Japan Co., Ltd.",C=JP -# Serial Number:64:db:5a:0c:20:4e:e8:d7:29:77:c8:50:27:a2:5a:27:dd:2d:f2:cb -# Subject: CN=SecureSign Root CA14,O="Cybertrust Japan Co., Ltd.",C=JP -# Not Valid Before: Wed Apr 08 07:06:19 2020 -# Not Valid After : Sat Apr 08 07:06:19 2045 -# Fingerprint (SHA-256): 4B:00:9C:10:34:49:4F:9A:B5:6B:BA:3B:A1:D6:27:31:FC:4D:20:D8:95:5A:DC:EC:10:A9:25:60:72:61:E3:38 -# Fingerprint (SHA1): DD:50:C0:F7:79:B3:64:2E:74:A2:B8:9D:9F:D3:40:DD:BB:F0:F2:4F -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "SecureSign Root CA14" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\121\061\013\060\011\006\003\125\004\006\023\002\112\120\061 -\043\060\041\006\003\125\004\012\023\032\103\171\142\145\162\164 -\162\165\163\164\040\112\141\160\141\156\040\103\157\056\054\040 -\114\164\144\056\061\035\060\033\006\003\125\004\003\023\024\123 -\145\143\165\162\145\123\151\147\156\040\122\157\157\164\040\103 -\101\061\064 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\121\061\013\060\011\006\003\125\004\006\023\002\112\120\061 -\043\060\041\006\003\125\004\012\023\032\103\171\142\145\162\164 -\162\165\163\164\040\112\141\160\141\156\040\103\157\056\054\040 -\114\164\144\056\061\035\060\033\006\003\125\004\003\023\024\123 -\145\143\165\162\145\123\151\147\156\040\122\157\157\164\040\103 -\101\061\064 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\144\333\132\014\040\116\350\327\051\167\310\120\047\242 -\132\047\335\055\362\313 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\162\060\202\003\132\240\003\002\001\002\002\024\144 -\333\132\014\040\116\350\327\051\167\310\120\047\242\132\047\335 -\055\362\313\060\015\006\011\052\206\110\206\367\015\001\001\014 -\005\000\060\121\061\013\060\011\006\003\125\004\006\023\002\112 -\120\061\043\060\041\006\003\125\004\012\023\032\103\171\142\145 -\162\164\162\165\163\164\040\112\141\160\141\156\040\103\157\056 -\054\040\114\164\144\056\061\035\060\033\006\003\125\004\003\023 -\024\123\145\143\165\162\145\123\151\147\156\040\122\157\157\164 -\040\103\101\061\064\060\036\027\015\062\060\060\064\060\070\060 -\067\060\066\061\071\132\027\015\064\065\060\064\060\070\060\067 -\060\066\061\071\132\060\121\061\013\060\011\006\003\125\004\006 -\023\002\112\120\061\043\060\041\006\003\125\004\012\023\032\103 -\171\142\145\162\164\162\165\163\164\040\112\141\160\141\156\040 -\103\157\056\054\040\114\164\144\056\061\035\060\033\006\003\125 -\004\003\023\024\123\145\143\165\162\145\123\151\147\156\040\122 -\157\157\164\040\103\101\061\064\060\202\002\042\060\015\006\011 -\052\206\110\206\367\015\001\001\001\005\000\003\202\002\017\000 -\060\202\002\012\002\202\002\001\000\305\322\172\241\326\212\277 -\026\061\320\230\321\072\224\374\132\270\156\042\301\142\367\247 -\012\047\357\120\366\056\261\236\150\022\360\154\044\143\071\361 -\360\337\020\306\336\267\122\040\325\122\133\102\231\236\363\240 -\276\122\037\137\314\147\155\247\056\120\242\301\227\215\266\370 -\225\365\260\272\334\235\340\276\313\337\367\070\362\107\365\246 -\232\222\225\052\142\131\120\013\242\261\065\347\145\262\141\262 -\352\222\161\151\344\051\360\117\201\201\004\074\262\245\133\324 -\305\250\131\147\173\125\034\111\253\172\235\302\347\163\115\357 -\315\011\302\304\127\022\333\001\016\043\171\011\007\073\242\350 -\374\212\317\217\300\106\044\234\070\047\340\203\235\033\240\277 -\170\025\020\353\206\116\012\132\375\337\332\054\202\176\356\312 -\366\051\341\372\161\241\367\210\150\234\234\360\215\276\017\111 -\221\330\352\072\371\375\320\150\161\333\351\265\053\116\202\222 -\157\146\037\340\360\334\114\354\312\321\352\272\164\006\371\263 -\204\220\224\321\137\216\163\031\020\135\002\345\160\245\300\020 -\320\020\174\157\305\130\111\264\260\156\232\332\175\225\365\314 -\332\002\257\270\054\175\171\217\276\103\361\371\050\050\215\011 -\103\370\010\335\153\310\213\054\044\261\215\122\007\275\170\233 -\313\312\150\262\244\335\014\114\171\140\306\231\321\223\361\060 -\032\007\323\256\042\302\352\316\361\204\011\314\340\024\156\177 -\077\176\322\202\205\254\334\251\026\116\205\240\140\313\366\234 -\327\310\263\216\355\306\233\230\165\015\125\350\137\345\225\213 -\002\244\256\103\051\050\021\244\346\022\060\001\113\165\153\036 -\146\235\171\057\245\166\057\035\100\264\155\311\175\171\010\354 -\321\152\266\135\052\262\245\146\275\153\205\364\164\126\303\365 -\347\165\122\050\054\245\377\146\107\245\324\376\376\236\124\277 -\145\176\001\326\060\217\245\066\234\242\120\034\356\070\200\001 -\110\306\307\164\364\306\254\303\100\111\026\141\164\054\257\214 -\157\065\355\173\030\000\133\066\074\234\120\015\312\222\063\020 -\361\046\111\155\337\165\044\067\202\042\327\350\226\375\025\113 -\002\226\076\007\162\225\176\253\075\114\056\327\312\360\337\340 -\130\077\055\057\004\232\070\243\001\002\003\001\000\001\243\102 -\060\100\060\017\006\003\125\035\023\001\001\377\004\005\060\003 -\001\001\377\060\016\006\003\125\035\017\001\001\377\004\004\003 -\002\001\006\060\035\006\003\125\035\016\004\026\004\024\006\223 -\243\012\136\050\151\067\252\141\035\353\353\374\055\157\043\344 -\363\240\060\015\006\011\052\206\110\206\367\015\001\001\014\005 -\000\003\202\002\001\000\226\200\162\011\006\176\234\314\223\004 -\026\273\240\072\215\222\116\267\021\032\012\161\161\020\315\004 -\255\177\245\105\120\020\146\116\112\101\242\003\331\021\117\172 -\067\271\113\342\306\217\062\146\165\045\373\353\316\077\003\051 -\046\215\270\026\035\366\037\063\156\110\346\350\370\127\262\033 -\171\337\073\207\012\342\144\272\000\312\154\357\176\320\043\353 -\170\217\377\144\233\064\067\237\065\145\242\244\000\075\022\043 -\226\130\135\312\143\207\306\243\007\210\115\347\151\166\212\123 -\315\361\117\354\102\362\223\343\231\244\067\074\207\270\142\333 -\360\354\037\067\077\067\137\103\314\121\235\265\360\227\302\267 -\205\152\150\013\104\036\345\121\356\223\316\113\156\206\301\322 -\014\044\131\066\032\237\054\221\217\343\030\333\224\225\012\355 -\221\252\016\231\334\226\123\343\141\203\306\026\272\043\272\334 -\335\176\032\306\173\102\266\331\132\005\334\232\137\325\337\270 -\332\107\175\332\070\333\254\071\325\036\153\154\052\027\214\141 -\315\261\155\162\001\303\303\040\000\142\150\026\061\325\166\252 -\206\273\016\252\236\306\371\360\331\370\015\041\002\344\305\050 -\026\131\021\271\331\151\163\052\222\170\270\222\127\233\010\362 -\072\345\057\225\260\130\267\153\040\024\155\024\357\012\274\176 -\330\125\330\210\332\057\372\031\245\373\213\340\177\071\365\162 -\053\205\304\054\254\357\031\105\222\114\263\141\007\334\115\037 -\156\322\201\023\134\232\363\022\147\203\317\233\077\213\237\235 -\244\271\250\226\003\172\305\356\040\336\063\332\057\236\032\172 -\164\036\341\356\314\132\072\004\335\263\032\004\250\024\143\254 -\267\107\022\203\232\154\365\346\351\025\025\221\032\204\031\016 -\224\104\347\022\216\045\133\200\147\031\334\143\223\020\013\145 -\056\212\372\011\232\116\332\206\050\175\252\141\065\330\016\247 -\050\032\273\122\340\170\370\154\272\154\260\156\271\207\136\351 -\231\065\067\361\075\144\053\251\240\064\223\317\143\057\325\201 -\337\256\143\047\245\036\116\215\334\051\170\131\370\371\241\040 -\214\247\046\100\156\202\162\315\170\262\310\217\074\036\163\347 -\301\037\277\317\316\245\052\233\333\104\144\062\240\273\177\134 -\045\023\110\265\177\222 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "SecureSign Root CA14" -# Issuer: CN=SecureSign Root CA14,O="Cybertrust Japan Co., Ltd.",C=JP -# Serial Number:64:db:5a:0c:20:4e:e8:d7:29:77:c8:50:27:a2:5a:27:dd:2d:f2:cb -# Subject: CN=SecureSign Root CA14,O="Cybertrust Japan Co., Ltd.",C=JP -# Not Valid Before: Wed Apr 08 07:06:19 2020 -# Not Valid After : Sat Apr 08 07:06:19 2045 -# Fingerprint (SHA-256): 4B:00:9C:10:34:49:4F:9A:B5:6B:BA:3B:A1:D6:27:31:FC:4D:20:D8:95:5A:DC:EC:10:A9:25:60:72:61:E3:38 -# Fingerprint (SHA1): DD:50:C0:F7:79:B3:64:2E:74:A2:B8:9D:9F:D3:40:DD:BB:F0:F2:4F -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "SecureSign Root CA14" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\335\120\300\367\171\263\144\056\164\242\270\235\237\323\100\335 -\273\360\362\117 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\161\015\162\372\222\031\145\136\211\004\254\026\063\360\274\325 -END -CKA_ISSUER MULTILINE_OCTAL -\060\121\061\013\060\011\006\003\125\004\006\023\002\112\120\061 -\043\060\041\006\003\125\004\012\023\032\103\171\142\145\162\164 -\162\165\163\164\040\112\141\160\141\156\040\103\157\056\054\040 -\114\164\144\056\061\035\060\033\006\003\125\004\003\023\024\123 -\145\143\165\162\145\123\151\147\156\040\122\157\157\164\040\103 -\101\061\064 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\144\333\132\014\040\116\350\327\051\167\310\120\047\242 -\132\047\335\055\362\313 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "SecureSign Root CA15" -# -# Issuer: CN=SecureSign Root CA15,O="Cybertrust Japan Co., Ltd.",C=JP -# Serial Number:16:15:c7:c3:d8:49:a7:be:69:0c:8a:88:ed:f0:70:f9:dd:b7:3e:87 -# Subject: CN=SecureSign Root CA15,O="Cybertrust Japan Co., Ltd.",C=JP -# Not Valid Before: Wed Apr 08 08:32:56 2020 -# Not Valid After : Sat Apr 08 08:32:56 2045 -# Fingerprint (SHA-256): E7:78:F0:F0:95:FE:84:37:29:CD:1A:00:82:17:9E:53:14:A9:C2:91:44:28:05:E1:FB:1D:8F:B6:B8:88:6C:3A -# Fingerprint (SHA1): CB:BA:83:C8:C1:5A:5D:F1:F9:73:6F:CA:D7:EF:28:13:06:4A:07:7D -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "SecureSign Root CA15" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\121\061\013\060\011\006\003\125\004\006\023\002\112\120\061 -\043\060\041\006\003\125\004\012\023\032\103\171\142\145\162\164 -\162\165\163\164\040\112\141\160\141\156\040\103\157\056\054\040 -\114\164\144\056\061\035\060\033\006\003\125\004\003\023\024\123 -\145\143\165\162\145\123\151\147\156\040\122\157\157\164\040\103 -\101\061\065 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\121\061\013\060\011\006\003\125\004\006\023\002\112\120\061 -\043\060\041\006\003\125\004\012\023\032\103\171\142\145\162\164 -\162\165\163\164\040\112\141\160\141\156\040\103\157\056\054\040 -\114\164\144\056\061\035\060\033\006\003\125\004\003\023\024\123 -\145\143\165\162\145\123\151\147\156\040\122\157\157\164\040\103 -\101\061\065 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\026\025\307\303\330\111\247\276\151\014\212\210\355\360 -\160\371\335\267\076\207 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\043\060\202\001\251\240\003\002\001\002\002\024\026 -\025\307\303\330\111\247\276\151\014\212\210\355\360\160\371\335 -\267\076\207\060\012\006\010\052\206\110\316\075\004\003\003\060 -\121\061\013\060\011\006\003\125\004\006\023\002\112\120\061\043 -\060\041\006\003\125\004\012\023\032\103\171\142\145\162\164\162 -\165\163\164\040\112\141\160\141\156\040\103\157\056\054\040\114 -\164\144\056\061\035\060\033\006\003\125\004\003\023\024\123\145 -\143\165\162\145\123\151\147\156\040\122\157\157\164\040\103\101 -\061\065\060\036\027\015\062\060\060\064\060\070\060\070\063\062 -\065\066\132\027\015\064\065\060\064\060\070\060\070\063\062\065 -\066\132\060\121\061\013\060\011\006\003\125\004\006\023\002\112 -\120\061\043\060\041\006\003\125\004\012\023\032\103\171\142\145 -\162\164\162\165\163\164\040\112\141\160\141\156\040\103\157\056 -\054\040\114\164\144\056\061\035\060\033\006\003\125\004\003\023 -\024\123\145\143\165\162\145\123\151\147\156\040\122\157\157\164 -\040\103\101\061\065\060\166\060\020\006\007\052\206\110\316\075 -\002\001\006\005\053\201\004\000\042\003\142\000\004\013\120\164 -\215\144\062\231\231\263\322\140\010\270\042\216\106\164\054\170 -\300\053\104\055\155\137\035\311\256\113\122\040\203\075\270\024 -\155\123\207\140\236\137\154\205\333\006\024\225\340\307\050\377 -\235\137\344\252\361\263\213\155\355\117\057\113\311\112\224\221 -\144\165\376\001\354\301\330\353\172\224\170\126\030\103\137\153 -\201\313\366\274\332\264\014\266\051\223\010\151\217\243\102\060 -\100\060\017\006\003\125\035\023\001\001\377\004\005\060\003\001 -\001\377\060\016\006\003\125\035\017\001\001\377\004\004\003\002 -\001\006\060\035\006\003\125\035\016\004\026\004\024\353\101\310 -\256\374\325\236\121\110\365\275\213\364\207\040\223\101\053\323 -\364\060\012\006\010\052\206\110\316\075\004\003\003\003\150\000 -\060\145\002\061\000\331\056\211\176\136\116\244\021\007\275\131 -\302\007\336\253\062\070\123\052\106\104\006\027\172\316\121\351 -\340\377\146\055\011\116\340\117\364\005\321\205\366\065\140\334 -\365\162\263\106\175\002\060\104\230\106\032\202\205\036\141\151 -\211\113\007\113\146\265\236\252\272\240\036\101\331\001\164\072 -\156\105\072\211\200\031\173\062\230\125\143\253\353\143\156\223 -\155\253\033\011\140\061\116 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "SecureSign Root CA15" -# Issuer: CN=SecureSign Root CA15,O="Cybertrust Japan Co., Ltd.",C=JP -# Serial Number:16:15:c7:c3:d8:49:a7:be:69:0c:8a:88:ed:f0:70:f9:dd:b7:3e:87 -# Subject: CN=SecureSign Root CA15,O="Cybertrust Japan Co., Ltd.",C=JP -# Not Valid Before: Wed Apr 08 08:32:56 2020 -# Not Valid After : Sat Apr 08 08:32:56 2045 -# Fingerprint (SHA-256): E7:78:F0:F0:95:FE:84:37:29:CD:1A:00:82:17:9E:53:14:A9:C2:91:44:28:05:E1:FB:1D:8F:B6:B8:88:6C:3A -# Fingerprint (SHA1): CB:BA:83:C8:C1:5A:5D:F1:F9:73:6F:CA:D7:EF:28:13:06:4A:07:7D -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "SecureSign Root CA15" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\313\272\203\310\301\132\135\361\371\163\157\312\327\357\050\023 -\006\112\007\175 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\023\060\374\304\142\246\251\336\265\301\150\257\265\322\061\107 -END -CKA_ISSUER MULTILINE_OCTAL -\060\121\061\013\060\011\006\003\125\004\006\023\002\112\120\061 -\043\060\041\006\003\125\004\012\023\032\103\171\142\145\162\164 -\162\165\163\164\040\112\141\160\141\156\040\103\157\056\054\040 -\114\164\144\056\061\035\060\033\006\003\125\004\003\023\024\123 -\145\143\165\162\145\123\151\147\156\040\122\157\157\164\040\103 -\101\061\065 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\026\025\307\303\330\111\247\276\151\014\212\210\355\360 -\160\371\335\267\076\207 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "D-TRUST BR Root CA 2 2023" -# -# Issuer: CN=D-TRUST BR Root CA 2 2023,O=D-Trust GmbH,C=DE -# Serial Number:73:3b:30:04:48:5b:d9:4d:78:2e:73:4b:c9:a1:dc:66 -# Subject: CN=D-TRUST BR Root CA 2 2023,O=D-Trust GmbH,C=DE -# Not Valid Before: Tue May 09 08:56:31 2023 -# Not Valid After : Sun May 09 08:56:30 2038 -# Fingerprint (SHA-256): 05:52:E6:F8:3F:DF:65:E8:FA:96:70:E6:66:DF:28:A4:E2:13:40:B5:10:CB:E5:25:66:F9:7C:4F:B9:4B:2B:D1 -# Fingerprint (SHA1): 2D:B0:70:EE:71:94:AF:69:68:17:DB:79:CE:58:9F:A0:6B:96:F7:87 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "D-TRUST BR Root CA 2 2023" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\110\061\013\060\011\006\003\125\004\006\023\002\104\105\061 -\025\060\023\006\003\125\004\012\023\014\104\055\124\162\165\163 -\164\040\107\155\142\110\061\042\060\040\006\003\125\004\003\023 -\031\104\055\124\122\125\123\124\040\102\122\040\122\157\157\164 -\040\103\101\040\062\040\062\060\062\063 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\110\061\013\060\011\006\003\125\004\006\023\002\104\105\061 -\025\060\023\006\003\125\004\012\023\014\104\055\124\162\165\163 -\164\040\107\155\142\110\061\042\060\040\006\003\125\004\003\023 -\031\104\055\124\122\125\123\124\040\102\122\040\122\157\157\164 -\040\103\101\040\062\040\062\060\062\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\163\073\060\004\110\133\331\115\170\056\163\113\311\241 -\334\146 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\251\060\202\003\221\240\003\002\001\002\002\020\163 -\073\060\004\110\133\331\115\170\056\163\113\311\241\334\146\060 -\015\006\011\052\206\110\206\367\015\001\001\015\005\000\060\110 -\061\013\060\011\006\003\125\004\006\023\002\104\105\061\025\060 -\023\006\003\125\004\012\023\014\104\055\124\162\165\163\164\040 -\107\155\142\110\061\042\060\040\006\003\125\004\003\023\031\104 -\055\124\122\125\123\124\040\102\122\040\122\157\157\164\040\103 -\101\040\062\040\062\060\062\063\060\036\027\015\062\063\060\065 -\060\071\060\070\065\066\063\061\132\027\015\063\070\060\065\060 -\071\060\070\065\066\063\060\132\060\110\061\013\060\011\006\003 -\125\004\006\023\002\104\105\061\025\060\023\006\003\125\004\012 -\023\014\104\055\124\162\165\163\164\040\107\155\142\110\061\042 -\060\040\006\003\125\004\003\023\031\104\055\124\122\125\123\124 -\040\102\122\040\122\157\157\164\040\103\101\040\062\040\062\060 -\062\063\060\202\002\042\060\015\006\011\052\206\110\206\367\015 -\001\001\001\005\000\003\202\002\017\000\060\202\002\012\002\202 -\002\001\000\256\377\011\131\221\200\012\112\150\346\044\077\270 -\247\344\310\072\012\072\026\315\311\043\141\240\223\161\362\253 -\213\163\217\240\147\145\140\322\124\153\143\121\157\111\063\340 -\162\007\023\175\070\315\006\222\007\051\122\153\116\167\154\004 -\323\225\372\335\114\214\331\135\301\141\175\113\347\050\263\104 -\201\173\121\257\335\063\261\150\174\326\116\114\376\053\150\271 -\312\146\151\304\354\136\127\177\367\015\307\234\066\066\345\007 -\140\254\300\114\352\010\154\357\006\174\117\133\050\172\010\374 -\223\135\233\366\234\264\213\206\272\041\271\364\360\350\131\132 -\050\241\064\204\032\045\221\266\265\217\357\262\371\200\372\371 -\075\074\021\162\330\343\057\206\166\305\171\054\301\251\220\223 -\106\230\147\313\203\152\240\120\043\247\073\366\201\071\340\355 -\360\271\277\145\361\330\313\172\373\357\163\003\316\000\364\175 -\327\340\135\073\146\270\334\216\272\203\313\207\166\003\374\045 -\331\347\043\157\006\375\147\363\340\377\204\274\107\277\265\026 -\030\106\151\024\314\005\367\333\323\111\254\153\314\253\344\265 -\013\103\044\136\113\153\115\147\337\326\265\076\117\170\037\224 -\161\044\352\336\160\374\361\223\376\236\223\132\344\224\132\227 -\124\014\065\173\137\154\356\000\037\044\354\003\272\002\365\166 -\364\237\324\232\355\205\054\070\042\057\307\330\057\166\021\117 -\375\154\134\350\365\216\047\207\177\031\112\041\107\220\035\171 -\215\034\133\370\317\112\205\344\355\263\133\215\276\304\144\050 -\135\101\304\156\254\070\132\117\043\164\164\251\022\303\366\322 -\271\021\025\063\007\221\330\073\067\072\143\060\006\321\305\042 -\066\050\142\043\020\340\106\314\227\254\326\053\135\144\044\325 -\356\034\016\336\373\010\132\165\052\366\143\155\316\013\102\276 -\321\272\160\034\234\041\345\017\061\151\027\327\374\012\264\336 -\355\200\234\313\222\264\213\365\336\131\242\130\011\245\143\107 -\013\341\101\062\064\101\331\232\261\331\250\260\033\132\336\015 -\015\364\342\262\135\065\200\271\201\324\204\151\221\002\313\165 -\320\215\305\265\075\011\221\011\217\024\241\024\164\171\076\326 -\311\025\035\244\131\131\042\334\366\212\105\075\074\022\326\076 -\135\062\057\002\003\001\000\001\243\201\216\060\201\213\060\017 -\006\003\125\035\023\001\001\377\004\005\060\003\001\001\377\060 -\035\006\003\125\035\016\004\026\004\024\147\220\360\326\336\265 -\030\325\106\051\176\134\253\370\236\010\274\144\225\020\060\016 -\006\003\125\035\017\001\001\377\004\004\003\002\001\006\060\111 -\006\003\125\035\037\004\102\060\100\060\076\240\074\240\072\206 -\070\150\164\164\160\072\057\057\143\162\154\056\144\055\164\162 -\165\163\164\056\156\145\164\057\143\162\154\057\144\055\164\162 -\165\163\164\137\142\162\137\162\157\157\164\137\143\141\137\062 -\137\062\060\062\063\056\143\162\154\060\015\006\011\052\206\110 -\206\367\015\001\001\015\005\000\003\202\002\001\000\064\367\263 -\167\123\333\060\026\271\055\245\041\361\100\041\165\353\353\110 -\026\201\075\163\340\236\047\052\353\167\251\023\244\152\012\132 -\132\024\063\075\150\037\201\256\151\375\214\237\145\154\064\102 -\331\055\320\177\170\026\261\072\254\043\061\255\136\177\256\347 -\256\053\372\272\374\074\227\225\100\223\137\303\055\003\243\355 -\244\157\123\327\372\100\016\060\365\000\040\054\000\114\214\073 -\264\243\037\266\277\221\062\253\257\222\230\323\026\346\324\321 -\124\134\103\133\056\256\357\127\052\250\264\157\244\357\015\126 -\024\332\041\253\040\166\236\003\374\046\270\236\077\076\003\046 -\346\114\333\235\137\102\204\075\105\003\003\034\131\210\312\334 -\056\141\044\132\244\352\047\013\163\022\276\122\263\012\317\062 -\027\342\036\207\032\026\225\110\155\132\340\320\317\011\222\046 -\146\221\330\243\141\016\252\201\201\177\350\122\202\321\102\347 -\340\035\030\372\244\205\066\347\206\340\015\353\274\324\311\326 -\074\103\361\135\111\156\176\201\233\151\265\211\142\217\210\122 -\330\327\376\047\301\043\305\313\053\002\273\261\137\376\373\103 -\205\003\106\276\135\306\312\041\046\377\327\002\236\164\112\334 -\370\023\025\261\201\127\066\313\145\134\321\035\061\167\351\045 -\303\303\262\062\067\325\361\230\011\344\155\143\200\010\253\006 -\222\201\324\351\160\217\247\077\262\355\206\214\202\152\065\310 -\102\132\202\321\122\032\105\017\025\245\000\360\224\173\145\047 -\127\071\103\317\174\177\346\275\065\263\173\361\031\114\336\072 -\226\317\351\166\356\003\347\302\103\122\074\152\201\350\301\132 -\200\275\021\135\223\153\373\307\346\144\077\273\151\034\351\335 -\045\213\257\164\311\124\100\312\313\223\023\012\355\373\146\222 -\021\312\365\300\372\330\203\125\003\174\323\305\042\106\165\160 -\153\171\110\006\052\202\232\277\346\353\026\016\042\105\001\274 -\335\066\224\064\251\065\046\212\327\227\271\356\010\162\277\064 -\222\160\203\200\253\070\252\131\150\335\100\244\030\220\262\363 -\325\003\312\046\312\357\325\307\340\217\123\216\360\000\343\250 -\355\237\371\255\167\340\053\143\117\236\303\356\067\273\170\011 -\204\236\271\156\373\051\231\220\350\200\323\237\044 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "D-TRUST BR Root CA 2 2023" -# Issuer: CN=D-TRUST BR Root CA 2 2023,O=D-Trust GmbH,C=DE -# Serial Number:73:3b:30:04:48:5b:d9:4d:78:2e:73:4b:c9:a1:dc:66 -# Subject: CN=D-TRUST BR Root CA 2 2023,O=D-Trust GmbH,C=DE -# Not Valid Before: Tue May 09 08:56:31 2023 -# Not Valid After : Sun May 09 08:56:30 2038 -# Fingerprint (SHA-256): 05:52:E6:F8:3F:DF:65:E8:FA:96:70:E6:66:DF:28:A4:E2:13:40:B5:10:CB:E5:25:66:F9:7C:4F:B9:4B:2B:D1 -# Fingerprint (SHA1): 2D:B0:70:EE:71:94:AF:69:68:17:DB:79:CE:58:9F:A0:6B:96:F7:87 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "D-TRUST BR Root CA 2 2023" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\055\260\160\356\161\224\257\151\150\027\333\171\316\130\237\240 -\153\226\367\207 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\341\011\355\323\140\324\126\033\107\037\267\014\137\033\137\205 -END -CKA_ISSUER MULTILINE_OCTAL -\060\110\061\013\060\011\006\003\125\004\006\023\002\104\105\061 -\025\060\023\006\003\125\004\012\023\014\104\055\124\162\165\163 -\164\040\107\155\142\110\061\042\060\040\006\003\125\004\003\023 -\031\104\055\124\122\125\123\124\040\102\122\040\122\157\157\164 -\040\103\101\040\062\040\062\060\062\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\163\073\060\004\110\133\331\115\170\056\163\113\311\241 -\334\146 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "TrustAsia SMIME ECC Root CA" -# -# Issuer: CN=TrustAsia SMIME ECC Root CA,O="TrustAsia Technologies, Inc.",C=CN -# Serial Number:5a:c2:f8:29:4f:e3:7d:c5:5e:1d:18:6f:3b:93:20:1f:ff:7b:ba:2d -# Subject: CN=TrustAsia SMIME ECC Root CA,O="TrustAsia Technologies, Inc.",C=CN -# Not Valid Before: Wed May 15 05:41:59 2024 -# Not Valid After : Sun May 15 05:41:58 2044 -# Fingerprint (SHA-256): 43:64:72:C1:00:9A:32:5C:54:F1:A5:BB:B5:46:8A:7B:AE:EC:CB:E0:5D:E5:F0:99:CB:70:D3:FE:41:E1:3C:16 -# Fingerprint (SHA1): 8C:0D:AA:FE:13:FA:59:F2:DB:9D:0C:97:DA:12:A2:45:1A:02:13:54 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "TrustAsia SMIME ECC Root CA" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\132\061\013\060\011\006\003\125\004\006\023\002\103\116\061 -\045\060\043\006\003\125\004\012\023\034\124\162\165\163\164\101 -\163\151\141\040\124\145\143\150\156\157\154\157\147\151\145\163 -\054\040\111\156\143\056\061\044\060\042\006\003\125\004\003\023 -\033\124\162\165\163\164\101\163\151\141\040\123\115\111\115\105 -\040\105\103\103\040\122\157\157\164\040\103\101 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\132\061\013\060\011\006\003\125\004\006\023\002\103\116\061 -\045\060\043\006\003\125\004\012\023\034\124\162\165\163\164\101 -\163\151\141\040\124\145\143\150\156\157\154\157\147\151\145\163 -\054\040\111\156\143\056\061\044\060\042\006\003\125\004\003\023 -\033\124\162\165\163\164\101\163\151\141\040\123\115\111\115\105 -\040\105\103\103\040\122\157\157\164\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\132\302\370\051\117\343\175\305\136\035\030\157\073\223 -\040\037\377\173\272\055 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\066\060\202\001\273\240\003\002\001\002\002\024\132 -\302\370\051\117\343\175\305\136\035\030\157\073\223\040\037\377 -\173\272\055\060\012\006\010\052\206\110\316\075\004\003\003\060 -\132\061\013\060\011\006\003\125\004\006\023\002\103\116\061\045 -\060\043\006\003\125\004\012\023\034\124\162\165\163\164\101\163 -\151\141\040\124\145\143\150\156\157\154\157\147\151\145\163\054 -\040\111\156\143\056\061\044\060\042\006\003\125\004\003\023\033 -\124\162\165\163\164\101\163\151\141\040\123\115\111\115\105\040 -\105\103\103\040\122\157\157\164\040\103\101\060\036\027\015\062 -\064\060\065\061\065\060\065\064\061\065\071\132\027\015\064\064 -\060\065\061\065\060\065\064\061\065\070\132\060\132\061\013\060 -\011\006\003\125\004\006\023\002\103\116\061\045\060\043\006\003 -\125\004\012\023\034\124\162\165\163\164\101\163\151\141\040\124 -\145\143\150\156\157\154\157\147\151\145\163\054\040\111\156\143 -\056\061\044\060\042\006\003\125\004\003\023\033\124\162\165\163 -\164\101\163\151\141\040\123\115\111\115\105\040\105\103\103\040 -\122\157\157\164\040\103\101\060\166\060\020\006\007\052\206\110 -\316\075\002\001\006\005\053\201\004\000\042\003\142\000\004\315 -\331\373\047\275\151\354\206\311\220\103\261\160\027\224\247\311 -\167\043\072\077\043\145\323\034\243\035\036\102\124\040\353\320 -\102\273\131\271\213\254\362\206\215\113\216\035\252\226\042\043 -\071\166\155\222\233\353\042\313\172\103\242\163\375\163\113\302 -\045\017\052\261\151\306\377\105\337\251\074\225\200\273\251\036 -\112\223\057\354\034\035\210\364\021\222\067\237\067\230\162\243 -\102\060\100\060\017\006\003\125\035\023\001\001\377\004\005\060 -\003\001\001\377\060\035\006\003\125\035\016\004\026\004\024\061 -\147\346\162\262\015\346\042\240\254\317\176\042\247\131\062\343 -\146\043\245\060\016\006\003\125\035\017\001\001\377\004\004\003 -\002\001\006\060\012\006\010\052\206\110\316\075\004\003\003\003 -\151\000\060\146\002\061\000\335\072\114\215\244\306\177\355\275 -\245\306\117\076\375\061\113\050\326\212\126\337\145\026\167\207 -\115\373\272\062\010\201\340\236\063\110\213\237\224\206\357\001 -\053\224\346\214\326\324\216\002\061\000\237\201\234\260\046\375 -\053\326\362\365\161\204\236\250\307\212\214\326\130\021\122\265 -\270\004\313\314\161\165\143\342\306\031\070\331\155\154\031\161 -\244\026\031\041\223\272\006\104\050\154 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "TrustAsia SMIME ECC Root CA" -# Issuer: CN=TrustAsia SMIME ECC Root CA,O="TrustAsia Technologies, Inc.",C=CN -# Serial Number:5a:c2:f8:29:4f:e3:7d:c5:5e:1d:18:6f:3b:93:20:1f:ff:7b:ba:2d -# Subject: CN=TrustAsia SMIME ECC Root CA,O="TrustAsia Technologies, Inc.",C=CN -# Not Valid Before: Wed May 15 05:41:59 2024 -# Not Valid After : Sun May 15 05:41:58 2044 -# Fingerprint (SHA-256): 43:64:72:C1:00:9A:32:5C:54:F1:A5:BB:B5:46:8A:7B:AE:EC:CB:E0:5D:E5:F0:99:CB:70:D3:FE:41:E1:3C:16 -# Fingerprint (SHA1): 8C:0D:AA:FE:13:FA:59:F2:DB:9D:0C:97:DA:12:A2:45:1A:02:13:54 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "TrustAsia SMIME ECC Root CA" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\214\015\252\376\023\372\131\362\333\235\014\227\332\022\242\105 -\032\002\023\124 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\225\175\377\225\115\114\152\373\215\014\017\317\102\333\357\040 -END -CKA_ISSUER MULTILINE_OCTAL -\060\132\061\013\060\011\006\003\125\004\006\023\002\103\116\061 -\045\060\043\006\003\125\004\012\023\034\124\162\165\163\164\101 -\163\151\141\040\124\145\143\150\156\157\154\157\147\151\145\163 -\054\040\111\156\143\056\061\044\060\042\006\003\125\004\003\023 -\033\124\162\165\163\164\101\163\151\141\040\123\115\111\115\105 -\040\105\103\103\040\122\157\157\164\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\132\302\370\051\117\343\175\305\136\035\030\157\073\223 -\040\037\377\173\272\055 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "TrustAsia SMIME RSA Root CA" -# -# Issuer: CN=TrustAsia SMIME RSA Root CA,O="TrustAsia Technologies, Inc.",C=CN -# Serial Number:5a:ee:71:df:de:0c:57:85:b5:bb:36:22:d7:b8:76:46:02:73:ca:ff -# Subject: CN=TrustAsia SMIME RSA Root CA,O="TrustAsia Technologies, Inc.",C=CN -# Not Valid Before: Wed May 15 05:42:01 2024 -# Not Valid After : Sun May 15 05:42:00 2044 -# Fingerprint (SHA-256): C7:79:6B:EB:62:C1:01:BB:14:3D:26:2A:7C:96:A0:C6:16:81:83:22:3E:F5:0D:69:96:32:D8:6E:03:B8:CC:9B -# Fingerprint (SHA1): 8C:69:21:7C:CE:49:73:36:5A:5C:EF:2B:B0:86:97:50:E3:E3:33:65 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "TrustAsia SMIME RSA Root CA" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\132\061\013\060\011\006\003\125\004\006\023\002\103\116\061 -\045\060\043\006\003\125\004\012\023\034\124\162\165\163\164\101 -\163\151\141\040\124\145\143\150\156\157\154\157\147\151\145\163 -\054\040\111\156\143\056\061\044\060\042\006\003\125\004\003\023 -\033\124\162\165\163\164\101\163\151\141\040\123\115\111\115\105 -\040\122\123\101\040\122\157\157\164\040\103\101 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\132\061\013\060\011\006\003\125\004\006\023\002\103\116\061 -\045\060\043\006\003\125\004\012\023\034\124\162\165\163\164\101 -\163\151\141\040\124\145\143\150\156\157\154\157\147\151\145\163 -\054\040\111\156\143\056\061\044\060\042\006\003\125\004\003\023 -\033\124\162\165\163\164\101\163\151\141\040\123\115\111\115\105 -\040\122\123\101\040\122\157\157\164\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\132\356\161\337\336\014\127\205\265\273\066\042\327\270 -\166\106\002\163\312\377 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\204\060\202\003\154\240\003\002\001\002\002\024\132 -\356\161\337\336\014\127\205\265\273\066\042\327\270\166\106\002 -\163\312\377\060\015\006\011\052\206\110\206\367\015\001\001\014 -\005\000\060\132\061\013\060\011\006\003\125\004\006\023\002\103 -\116\061\045\060\043\006\003\125\004\012\023\034\124\162\165\163 -\164\101\163\151\141\040\124\145\143\150\156\157\154\157\147\151 -\145\163\054\040\111\156\143\056\061\044\060\042\006\003\125\004 -\003\023\033\124\162\165\163\164\101\163\151\141\040\123\115\111 -\115\105\040\122\123\101\040\122\157\157\164\040\103\101\060\036 -\027\015\062\064\060\065\061\065\060\065\064\062\060\061\132\027 -\015\064\064\060\065\061\065\060\065\064\062\060\060\132\060\132 -\061\013\060\011\006\003\125\004\006\023\002\103\116\061\045\060 -\043\006\003\125\004\012\023\034\124\162\165\163\164\101\163\151 -\141\040\124\145\143\150\156\157\154\157\147\151\145\163\054\040 -\111\156\143\056\061\044\060\042\006\003\125\004\003\023\033\124 -\162\165\163\164\101\163\151\141\040\123\115\111\115\105\040\122 -\123\101\040\122\157\157\164\040\103\101\060\202\002\042\060\015 -\006\011\052\206\110\206\367\015\001\001\001\005\000\003\202\002 -\017\000\060\202\002\012\002\202\002\001\000\230\225\234\255\074 -\131\163\323\223\166\246\110\124\246\034\210\162\114\115\341\202 -\377\032\023\037\120\336\214\331\220\102\321\274\231\323\067\243 -\327\161\072\312\335\136\033\220\141\102\156\217\100\001\163\175 -\037\061\272\324\035\156\004\322\252\220\204\112\063\012\104\237 -\132\031\037\264\156\055\150\374\257\300\237\112\020\022\277\076 -\202\302\202\260\057\347\220\157\220\144\020\203\354\354\066\224 -\014\174\117\340\002\015\075\207\171\102\115\000\345\060\256\160 -\037\025\375\372\317\122\045\066\115\171\040\273\361\020\230\340 -\140\207\311\365\170\014\042\355\002\346\021\154\361\233\132\221 -\021\164\206\320\376\170\222\226\004\303\230\357\306\160\257\251 -\220\252\026\366\042\355\330\372\106\050\161\342\311\010\300\120 -\274\166\243\272\055\226\362\021\371\244\275\020\126\370\047\155 -\053\113\144\210\334\027\135\317\000\010\212\222\256\032\314\022 -\327\337\360\020\050\363\315\072\352\072\022\214\033\347\141\011 -\103\152\344\070\351\376\164\071\333\315\012\073\303\117\123\326 -\256\161\325\070\203\207\037\316\347\114\363\021\125\207\337\267 -\257\367\353\032\206\020\155\250\355\110\335\062\320\333\252\052 -\013\162\167\051\167\375\172\350\077\170\040\052\150\276\336\157 -\010\346\265\205\107\200\067\371\161\226\213\245\230\126\227\174 -\021\145\026\216\324\316\330\047\324\371\132\305\247\215\273\321 -\067\015\245\253\145\135\332\164\223\210\136\333\165\366\177\233 -\302\232\261\155\010\002\014\230\112\273\315\060\257\166\065\002 -\205\126\043\121\011\100\011\005\367\360\075\036\302\310\172\032 -\272\305\101\025\271\015\166\264\264\244\270\105\375\215\243\073 -\075\003\052\315\263\225\177\064\173\335\241\117\331\072\377\047 -\365\015\302\001\234\377\131\165\132\032\311\347\322\375\177\117 -\017\265\376\015\074\346\240\326\373\265\166\134\264\060\115\020 -\077\376\342\353\132\016\261\117\117\120\176\010\063\002\221\127 -\062\111\211\247\100\020\120\027\153\237\143\272\262\262\126\230 -\166\364\377\162\351\004\234\324\247\114\117\366\072\037\132\124 -\061\157\313\272\062\255\370\155\257\105\307\173\143\104\337\302 -\375\170\350\112\212\260\164\165\026\336\217\002\003\001\000\001 -\243\102\060\100\060\017\006\003\125\035\023\001\001\377\004\005 -\060\003\001\001\377\060\035\006\003\125\035\016\004\026\004\024 -\200\032\252\103\301\311\177\213\032\226\105\274\075\273\153\110 -\122\154\133\253\060\016\006\003\125\035\017\001\001\377\004\004 -\003\002\001\006\060\015\006\011\052\206\110\206\367\015\001\001 -\014\005\000\003\202\002\001\000\052\165\201\241\202\040\352\177 -\126\256\011\060\227\020\170\364\331\100\024\122\244\356\152\177 -\360\011\050\326\020\143\340\116\173\311\061\307\010\245\027\353 -\257\206\342\227\007\117\251\016\242\205\314\355\244\200\201\035 -\132\123\006\074\114\032\251\267\204\206\317\174\365\205\012\160 -\231\320\355\066\221\215\347\167\056\316\204\234\050\206\055\045 -\065\214\114\001\346\175\333\141\135\342\167\204\323\001\321\142 -\335\014\242\012\144\244\374\360\355\072\110\362\071\354\065\326 -\241\172\027\161\354\323\322\354\270\046\373\255\025\160\126\112 -\317\144\300\271\140\133\367\346\315\240\302\003\053\371\262\345 -\332\272\245\067\034\330\215\332\171\164\052\147\344\242\172\307 -\054\215\245\301\152\201\154\314\365\251\071\152\042\175\242\342 -\010\315\351\223\333\272\313\037\165\167\236\367\230\257\024\344 -\073\240\114\247\162\347\265\136\123\111\314\377\222\127\361\131 -\053\011\272\351\122\223\300\017\105\013\141\326\154\131\163\013 -\330\371\001\057\332\003\117\067\034\364\337\203\136\013\101\240 -\261\174\071\000\241\154\320\330\264\221\162\053\033\077\242\232 -\321\304\337\053\325\310\225\175\204\315\166\033\334\344\044\306 -\077\025\042\075\205\247\102\053\355\176\161\131\141\110\302\075 -\221\143\100\174\051\263\200\026\012\045\374\030\140\016\123\255 -\016\052\316\374\101\072\315\261\344\152\153\314\071\155\310\115 -\145\270\252\223\210\170\156\017\002\213\340\226\216\164\037\320 -\176\341\164\267\366\201\152\344\043\254\216\375\217\065\035\232 -\161\012\117\052\125\057\376\030\301\000\367\173\110\212\145\257 -\157\010\035\103\347\132\270\037\244\350\003\353\375\114\265\264 -\223\250\061\336\103\235\022\275\347\351\244\322\337\157\374\157 -\106\243\357\061\116\215\027\253\033\251\340\370\251\064\126\241 -\016\347\164\354\250\207\205\330\167\065\113\215\076\156\162\174 -\110\314\037\162\263\161\164\324\044\206\274\310\300\343\171\024 -\001\316\331\372\201\306\134\263\371\135\014\070\276\316\362\216 -\215\137\075\045\341\121\071\043\250\352\000\216\004\263\277\162 -\240\302\272\203\373\315\244\227\165\040\232\277\247\120\342\335 -\255\054\037\364\077\243\310\061 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "TrustAsia SMIME RSA Root CA" -# Issuer: CN=TrustAsia SMIME RSA Root CA,O="TrustAsia Technologies, Inc.",C=CN -# Serial Number:5a:ee:71:df:de:0c:57:85:b5:bb:36:22:d7:b8:76:46:02:73:ca:ff -# Subject: CN=TrustAsia SMIME RSA Root CA,O="TrustAsia Technologies, Inc.",C=CN -# Not Valid Before: Wed May 15 05:42:01 2024 -# Not Valid After : Sun May 15 05:42:00 2044 -# Fingerprint (SHA-256): C7:79:6B:EB:62:C1:01:BB:14:3D:26:2A:7C:96:A0:C6:16:81:83:22:3E:F5:0D:69:96:32:D8:6E:03:B8:CC:9B -# Fingerprint (SHA1): 8C:69:21:7C:CE:49:73:36:5A:5C:EF:2B:B0:86:97:50:E3:E3:33:65 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "TrustAsia SMIME RSA Root CA" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\214\151\041\174\316\111\163\066\132\134\357\053\260\206\227\120 -\343\343\063\145 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\151\206\230\353\337\305\241\132\301\244\153\324\074\243\373\266 -END -CKA_ISSUER MULTILINE_OCTAL -\060\132\061\013\060\011\006\003\125\004\006\023\002\103\116\061 -\045\060\043\006\003\125\004\012\023\034\124\162\165\163\164\101 -\163\151\141\040\124\145\143\150\156\157\154\157\147\151\145\163 -\054\040\111\156\143\056\061\044\060\042\006\003\125\004\003\023 -\033\124\162\165\163\164\101\163\151\141\040\123\115\111\115\105 -\040\122\123\101\040\122\157\157\164\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\132\356\161\337\336\014\127\205\265\273\066\042\327\270 -\166\106\002\163\312\377 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "TrustAsia TLS ECC Root CA" -# -# Issuer: CN=TrustAsia TLS ECC Root CA,O="TrustAsia Technologies, Inc.",C=CN -# Serial Number:36:74:e1:4d:7c:65:13:c9:ac:83:55:25:a0:3e:52:7e:2f:50:68:c7 -# Subject: CN=TrustAsia TLS ECC Root CA,O="TrustAsia Technologies, Inc.",C=CN -# Not Valid Before: Wed May 15 05:41:56 2024 -# Not Valid After : Sun May 15 05:41:55 2044 -# Fingerprint (SHA-256): C0:07:6B:9E:F0:53:1F:B1:A6:56:D6:7C:4E:BE:97:CD:5D:BA:A4:1E:F4:45:98:AC:C2:48:98:78:C9:2D:87:11 -# Fingerprint (SHA1): B5:EC:39:F3:A1:66:37:AE:C3:05:94:57:E2:BE:11:BE:B7:A1:7F:36 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "TrustAsia TLS ECC Root CA" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\130\061\013\060\011\006\003\125\004\006\023\002\103\116\061 -\045\060\043\006\003\125\004\012\023\034\124\162\165\163\164\101 -\163\151\141\040\124\145\143\150\156\157\154\157\147\151\145\163 -\054\040\111\156\143\056\061\042\060\040\006\003\125\004\003\023 -\031\124\162\165\163\164\101\163\151\141\040\124\114\123\040\105 -\103\103\040\122\157\157\164\040\103\101 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\130\061\013\060\011\006\003\125\004\006\023\002\103\116\061 -\045\060\043\006\003\125\004\012\023\034\124\162\165\163\164\101 -\163\151\141\040\124\145\143\150\156\157\154\157\147\151\145\163 -\054\040\111\156\143\056\061\042\060\040\006\003\125\004\003\023 -\031\124\162\165\163\164\101\163\151\141\040\124\114\123\040\105 -\103\103\040\122\157\157\164\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\066\164\341\115\174\145\023\311\254\203\125\045\240\076 -\122\176\057\120\150\307 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\061\060\202\001\267\240\003\002\001\002\002\024\066 -\164\341\115\174\145\023\311\254\203\125\045\240\076\122\176\057 -\120\150\307\060\012\006\010\052\206\110\316\075\004\003\003\060 -\130\061\013\060\011\006\003\125\004\006\023\002\103\116\061\045 -\060\043\006\003\125\004\012\023\034\124\162\165\163\164\101\163 -\151\141\040\124\145\143\150\156\157\154\157\147\151\145\163\054 -\040\111\156\143\056\061\042\060\040\006\003\125\004\003\023\031 -\124\162\165\163\164\101\163\151\141\040\124\114\123\040\105\103 -\103\040\122\157\157\164\040\103\101\060\036\027\015\062\064\060 -\065\061\065\060\065\064\061\065\066\132\027\015\064\064\060\065 -\061\065\060\065\064\061\065\065\132\060\130\061\013\060\011\006 -\003\125\004\006\023\002\103\116\061\045\060\043\006\003\125\004 -\012\023\034\124\162\165\163\164\101\163\151\141\040\124\145\143 -\150\156\157\154\157\147\151\145\163\054\040\111\156\143\056\061 -\042\060\040\006\003\125\004\003\023\031\124\162\165\163\164\101 -\163\151\141\040\124\114\123\040\105\103\103\040\122\157\157\164 -\040\103\101\060\166\060\020\006\007\052\206\110\316\075\002\001 -\006\005\053\201\004\000\042\003\142\000\004\270\177\245\133\077 -\001\076\175\360\210\155\256\051\230\341\233\134\123\231\333\367 -\010\377\325\152\340\216\313\104\246\360\301\214\275\117\324\316 -\324\210\123\350\136\127\327\116\276\054\077\363\022\247\000\351 -\202\343\052\133\062\174\113\233\024\051\236\370\055\203\265\353 -\216\061\111\075\046\141\351\035\162\213\211\266\012\273\234\063 -\065\017\332\354\336\251\112\037\311\063\261\243\102\060\100\060 -\017\006\003\125\035\023\001\001\377\004\005\060\003\001\001\377 -\060\035\006\003\125\035\016\004\026\004\024\054\205\123\273\261 -\103\315\062\352\236\243\207\376\242\230\250\246\223\351\020\060 -\016\006\003\125\035\017\001\001\377\004\004\003\002\001\006\060 -\012\006\010\052\206\110\316\075\004\003\003\003\150\000\060\145 -\002\060\124\107\327\303\055\141\206\110\364\171\132\125\015\065 -\057\137\015\366\147\154\167\100\032\106\347\370\150\133\116\047 -\035\270\230\175\177\223\277\010\115\304\332\105\060\241\017\136 -\112\170\002\061\000\243\221\207\362\021\063\203\303\301\212\221 -\072\114\053\120\261\275\042\224\135\065\211\163\203\305\233\031 -\376\264\241\351\324\241\146\266\001\245\066\371\330\150\141\050 -\267\164\341\242\061 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "TrustAsia TLS ECC Root CA" -# Issuer: CN=TrustAsia TLS ECC Root CA,O="TrustAsia Technologies, Inc.",C=CN -# Serial Number:36:74:e1:4d:7c:65:13:c9:ac:83:55:25:a0:3e:52:7e:2f:50:68:c7 -# Subject: CN=TrustAsia TLS ECC Root CA,O="TrustAsia Technologies, Inc.",C=CN -# Not Valid Before: Wed May 15 05:41:56 2024 -# Not Valid After : Sun May 15 05:41:55 2044 -# Fingerprint (SHA-256): C0:07:6B:9E:F0:53:1F:B1:A6:56:D6:7C:4E:BE:97:CD:5D:BA:A4:1E:F4:45:98:AC:C2:48:98:78:C9:2D:87:11 -# Fingerprint (SHA1): B5:EC:39:F3:A1:66:37:AE:C3:05:94:57:E2:BE:11:BE:B7:A1:7F:36 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "TrustAsia TLS ECC Root CA" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\265\354\071\363\241\146\067\256\303\005\224\127\342\276\021\276 -\267\241\177\066 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\011\110\004\167\322\374\145\223\161\146\261\021\225\117\006\214 -END -CKA_ISSUER MULTILINE_OCTAL -\060\130\061\013\060\011\006\003\125\004\006\023\002\103\116\061 -\045\060\043\006\003\125\004\012\023\034\124\162\165\163\164\101 -\163\151\141\040\124\145\143\150\156\157\154\157\147\151\145\163 -\054\040\111\156\143\056\061\042\060\040\006\003\125\004\003\023 -\031\124\162\165\163\164\101\163\151\141\040\124\114\123\040\105 -\103\103\040\122\157\157\164\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\066\164\341\115\174\145\023\311\254\203\125\045\240\076 -\122\176\057\120\150\307 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "TrustAsia TLS RSA Root CA" -# -# Issuer: CN=TrustAsia TLS RSA Root CA,O="TrustAsia Technologies, Inc.",C=CN -# Serial Number:1c:18:d8:cf:e5:53:3f:22:35:46:53:54:24:3c:6c:47:d1:5c:4a:9c -# Subject: CN=TrustAsia TLS RSA Root CA,O="TrustAsia Technologies, Inc.",C=CN -# Not Valid Before: Wed May 15 05:41:57 2024 -# Not Valid After : Sun May 15 05:41:56 2044 -# Fingerprint (SHA-256): 06:C0:8D:7D:AF:D8:76:97:1E:B1:12:4F:E6:7F:84:7E:C0:C7:A1:58:D3:EA:53:CB:E9:40:E2:EA:97:91:F4:C3 -# Fingerprint (SHA1): A5:46:50:C5:62:EA:95:9A:1A:A7:04:6F:17:58:C7:29:53:3D:03:FA -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "TrustAsia TLS RSA Root CA" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\130\061\013\060\011\006\003\125\004\006\023\002\103\116\061 -\045\060\043\006\003\125\004\012\023\034\124\162\165\163\164\101 -\163\151\141\040\124\145\143\150\156\157\154\157\147\151\145\163 -\054\040\111\156\143\056\061\042\060\040\006\003\125\004\003\023 -\031\124\162\165\163\164\101\163\151\141\040\124\114\123\040\122 -\123\101\040\122\157\157\164\040\103\101 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\130\061\013\060\011\006\003\125\004\006\023\002\103\116\061 -\045\060\043\006\003\125\004\012\023\034\124\162\165\163\164\101 -\163\151\141\040\124\145\143\150\156\157\154\157\147\151\145\163 -\054\040\111\156\143\056\061\042\060\040\006\003\125\004\003\023 -\031\124\162\165\163\164\101\163\151\141\040\124\114\123\040\122 -\123\101\040\122\157\157\164\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\034\030\330\317\345\123\077\042\065\106\123\124\044\074 -\154\107\321\134\112\234 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\200\060\202\003\150\240\003\002\001\002\002\024\034 -\030\330\317\345\123\077\042\065\106\123\124\044\074\154\107\321 -\134\112\234\060\015\006\011\052\206\110\206\367\015\001\001\014 -\005\000\060\130\061\013\060\011\006\003\125\004\006\023\002\103 -\116\061\045\060\043\006\003\125\004\012\023\034\124\162\165\163 -\164\101\163\151\141\040\124\145\143\150\156\157\154\157\147\151 -\145\163\054\040\111\156\143\056\061\042\060\040\006\003\125\004 -\003\023\031\124\162\165\163\164\101\163\151\141\040\124\114\123 -\040\122\123\101\040\122\157\157\164\040\103\101\060\036\027\015 -\062\064\060\065\061\065\060\065\064\061\065\067\132\027\015\064 -\064\060\065\061\065\060\065\064\061\065\066\132\060\130\061\013 -\060\011\006\003\125\004\006\023\002\103\116\061\045\060\043\006 -\003\125\004\012\023\034\124\162\165\163\164\101\163\151\141\040 -\124\145\143\150\156\157\154\157\147\151\145\163\054\040\111\156 -\143\056\061\042\060\040\006\003\125\004\003\023\031\124\162\165 -\163\164\101\163\151\141\040\124\114\123\040\122\123\101\040\122 -\157\157\164\040\103\101\060\202\002\042\060\015\006\011\052\206 -\110\206\367\015\001\001\001\005\000\003\202\002\017\000\060\202 -\002\012\002\202\002\001\000\303\026\270\033\152\244\104\163\345 -\326\116\364\271\317\133\013\301\321\232\201\365\143\260\217\103 -\301\273\010\132\032\172\341\007\166\046\037\217\151\126\276\376 -\066\140\320\014\203\315\224\352\347\305\055\134\057\005\026\002 -\236\012\250\057\345\140\046\124\226\370\230\100\035\254\256\235 -\164\147\057\124\373\224\143\230\343\046\112\203\306\225\266\011 -\103\120\315\015\175\336\104\016\140\022\117\133\065\275\277\231 -\070\155\175\154\332\342\150\163\037\371\061\245\031\020\163\005 -\052\303\062\031\205\352\064\252\335\102\036\060\215\077\236\265 -\036\141\325\157\275\000\162\162\255\022\077\252\246\111\163\362 -\206\025\225\014\020\137\121\144\316\377\167\270\311\155\254\345 -\325\230\361\231\056\154\343\311\104\371\265\103\047\010\115\366 -\176\336\104\171\273\262\214\034\332\323\113\154\056\326\303\170 -\267\114\325\244\344\332\334\212\216\016\377\017\303\246\140\046 -\050\317\066\277\372\127\012\354\133\077\351\060\026\173\304\333 -\304\324\144\240\060\373\345\375\035\161\222\335\051\217\101\130 -\336\000\255\072\375\075\174\032\250\261\027\360\116\064\170\130 -\045\326\205\041\353\171\035\320\334\253\317\142\074\260\307\227 -\213\326\320\237\323\376\074\336\305\343\374\072\203\160\204\041 -\035\011\302\241\374\273\050\041\145\123\140\172\220\155\226\070 -\133\377\361\327\172\133\155\323\311\160\111\112\272\035\072\320 -\120\332\062\040\031\344\213\077\353\325\026\046\067\074\373\165 -\236\260\007\160\270\024\140\167\334\366\017\134\122\012\274\135 -\155\215\121\012\332\305\030\310\233\155\334\260\203\263\177\243 -\116\170\114\230\045\253\362\176\056\040\136\202\025\246\326\330 -\217\254\345\315\062\206\310\371\344\332\211\342\073\076\223\305 -\023\152\377\307\367\030\374\147\265\357\030\054\124\253\100\323 -\154\115\355\305\310\267\070\117\144\304\224\114\117\240\315\256 -\245\306\047\045\165\047\155\306\332\234\216\260\005\231\325\050 -\021\305\041\324\270\374\307\226\253\112\144\131\141\153\023\374 -\113\314\222\246\017\244\121\277\016\130\220\331\202\203\071\246 -\137\263\372\156\222\263\315\063\016\205\250\361\051\323\253\131 -\255\326\333\336\324\053\201\002\003\001\000\001\243\102\060\100 -\060\017\006\003\125\035\023\001\001\377\004\005\060\003\001\001 -\377\060\035\006\003\125\035\016\004\026\004\024\270\007\221\171 -\134\006\364\106\375\173\131\312\132\046\221\247\105\053\370\123 -\060\016\006\003\125\035\017\001\001\377\004\004\003\002\001\006 -\060\015\006\011\052\206\110\206\367\015\001\001\014\005\000\003 -\202\002\001\000\041\233\152\005\040\135\030\026\247\022\244\367 -\107\077\315\312\073\256\216\300\202\316\334\110\045\170\027\154 -\340\340\160\304\326\226\331\331\366\277\172\234\023\273\123\225 -\222\377\317\222\340\363\305\047\065\127\250\073\242\031\353\370 -\212\243\004\336\151\213\344\074\074\275\345\257\320\022\033\345 -\211\153\163\233\157\045\002\113\220\202\257\100\302\255\272\232 -\140\044\132\201\115\005\030\243\342\063\171\172\013\037\223\355 -\354\071\112\365\023\004\354\215\164\235\201\012\250\157\350\166 -\376\213\117\053\151\022\206\012\064\066\335\202\233\157\117\340 -\163\335\111\177\050\076\311\073\243\127\004\330\223\331\074\051 -\333\022\020\150\341\304\211\270\006\040\347\033\172\274\261\223 -\141\232\031\100\021\265\152\205\127\001\361\266\132\055\046\163 -\047\226\371\271\077\133\320\210\235\344\240\375\272\116\225\011 -\203\177\167\334\121\005\224\235\040\161\166\261\354\372\211\265 -\234\056\205\361\271\133\044\132\261\011\253\332\312\032\007\315 -\206\337\333\151\333\264\110\030\000\055\274\242\304\211\105\043 -\245\016\341\104\145\076\212\301\152\060\035\342\140\370\072\252 -\207\011\102\271\201\222\334\045\210\230\211\361\174\065\361\142 -\312\356\171\370\031\057\376\137\370\333\207\316\352\250\017\014 -\246\350\013\240\074\340\153\224\230\234\177\255\006\346\034\352 -\102\020\137\342\046\025\074\067\071\367\327\274\356\270\345\357 -\003\356\275\042\373\050\206\064\130\304\132\177\141\242\170\017 -\136\363\312\235\274\033\074\247\310\055\366\247\042\021\312\003 -\330\347\147\012\212\016\313\065\216\064\071\330\310\352\215\237 -\144\340\067\260\154\327\305\217\301\220\141\046\333\044\214\036 -\112\300\210\337\065\220\316\077\002\364\144\141\336\307\310\007 -\225\336\062\030\072\217\242\102\100\044\345\326\063\135\174\256 -\357\261\115\117\324\127\220\065\152\334\256\004\227\111\211\064 -\227\056\060\004\347\230\367\333\013\001\220\301\037\012\077\370 -\302\376\116\372\333\232\163\163\026\274\005\270\171\330\131\257 -\006\347\077\147\070\071\261\174\253\224\340\051\024\246\050\362 -\337\155\342\232\333\124\103\370\107\130\243\135\164\025\234\301 -\253\260\307\064 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "TrustAsia TLS RSA Root CA" -# Issuer: CN=TrustAsia TLS RSA Root CA,O="TrustAsia Technologies, Inc.",C=CN -# Serial Number:1c:18:d8:cf:e5:53:3f:22:35:46:53:54:24:3c:6c:47:d1:5c:4a:9c -# Subject: CN=TrustAsia TLS RSA Root CA,O="TrustAsia Technologies, Inc.",C=CN -# Not Valid Before: Wed May 15 05:41:57 2024 -# Not Valid After : Sun May 15 05:41:56 2044 -# Fingerprint (SHA-256): 06:C0:8D:7D:AF:D8:76:97:1E:B1:12:4F:E6:7F:84:7E:C0:C7:A1:58:D3:EA:53:CB:E9:40:E2:EA:97:91:F4:C3 -# Fingerprint (SHA1): A5:46:50:C5:62:EA:95:9A:1A:A7:04:6F:17:58:C7:29:53:3D:03:FA -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "TrustAsia TLS RSA Root CA" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\245\106\120\305\142\352\225\232\032\247\004\157\027\130\307\051 -\123\075\003\372 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\073\236\303\206\017\064\074\153\305\106\304\216\035\347\031\022 -END -CKA_ISSUER MULTILINE_OCTAL -\060\130\061\013\060\011\006\003\125\004\006\023\002\103\116\061 -\045\060\043\006\003\125\004\012\023\034\124\162\165\163\164\101 -\163\151\141\040\124\145\143\150\156\157\154\157\147\151\145\163 -\054\040\111\156\143\056\061\042\060\040\006\003\125\004\003\023 -\031\124\162\165\163\164\101\163\151\141\040\124\114\123\040\122 -\123\101\040\122\157\157\164\040\103\101 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\034\030\330\317\345\123\077\042\065\106\123\124\044\074 -\154\107\321\134\112\234 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "D-TRUST EV Root CA 2 2023" -# -# Issuer: CN=D-TRUST EV Root CA 2 2023,O=D-Trust GmbH,C=DE -# Serial Number:69:26:09:7e:80:4b:4c:a0:a7:8c:78:62:53:5f:5a:6f -# Subject: CN=D-TRUST EV Root CA 2 2023,O=D-Trust GmbH,C=DE -# Not Valid Before: Tue May 09 09:10:33 2023 -# Not Valid After : Sun May 09 09:10:32 2038 -# Fingerprint (SHA-256): 8E:82:21:B2:E7:D4:00:78:36:A1:67:2F:0D:CC:29:9C:33:BC:07:D3:16:F1:32:FA:1A:20:6D:58:71:50:F1:CE -# Fingerprint (SHA1): A5:5B:D8:47:6C:8F:19:F7:4C:F4:6D:6B:B6:C2:79:82:22:DF:54:8B -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "D-TRUST EV Root CA 2 2023" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\110\061\013\060\011\006\003\125\004\006\023\002\104\105\061 -\025\060\023\006\003\125\004\012\023\014\104\055\124\162\165\163 -\164\040\107\155\142\110\061\042\060\040\006\003\125\004\003\023 -\031\104\055\124\122\125\123\124\040\105\126\040\122\157\157\164 -\040\103\101\040\062\040\062\060\062\063 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\110\061\013\060\011\006\003\125\004\006\023\002\104\105\061 -\025\060\023\006\003\125\004\012\023\014\104\055\124\162\165\163 -\164\040\107\155\142\110\061\042\060\040\006\003\125\004\003\023 -\031\104\055\124\122\125\123\124\040\105\126\040\122\157\157\164 -\040\103\101\040\062\040\062\060\062\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\151\046\011\176\200\113\114\240\247\214\170\142\123\137 -\132\157 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\251\060\202\003\221\240\003\002\001\002\002\020\151 -\046\011\176\200\113\114\240\247\214\170\142\123\137\132\157\060 -\015\006\011\052\206\110\206\367\015\001\001\015\005\000\060\110 -\061\013\060\011\006\003\125\004\006\023\002\104\105\061\025\060 -\023\006\003\125\004\012\023\014\104\055\124\162\165\163\164\040 -\107\155\142\110\061\042\060\040\006\003\125\004\003\023\031\104 -\055\124\122\125\123\124\040\105\126\040\122\157\157\164\040\103 -\101\040\062\040\062\060\062\063\060\036\027\015\062\063\060\065 -\060\071\060\071\061\060\063\063\132\027\015\063\070\060\065\060 -\071\060\071\061\060\063\062\132\060\110\061\013\060\011\006\003 -\125\004\006\023\002\104\105\061\025\060\023\006\003\125\004\012 -\023\014\104\055\124\162\165\163\164\040\107\155\142\110\061\042 -\060\040\006\003\125\004\003\023\031\104\055\124\122\125\123\124 -\040\105\126\040\122\157\157\164\040\103\101\040\062\040\062\060 -\062\063\060\202\002\042\060\015\006\011\052\206\110\206\367\015 -\001\001\001\005\000\003\202\002\017\000\060\202\002\012\002\202 -\002\001\000\330\216\243\211\200\013\262\127\122\334\251\123\114 -\067\271\177\143\027\023\357\247\133\043\133\151\165\260\231\012 -\027\301\213\304\333\250\340\314\061\272\302\362\315\135\351\267 -\370\035\257\152\304\225\207\327\107\311\225\330\202\004\120\075 -\201\010\377\344\075\263\261\326\305\262\375\210\011\333\234\204 -\354\045\027\024\207\177\060\170\233\152\130\311\266\163\050\074 -\064\367\231\367\177\323\246\370\034\105\174\255\054\214\224\077 -\330\147\020\123\176\042\315\116\045\121\360\045\044\065\021\136 -\020\306\354\207\146\211\201\150\272\314\053\235\107\163\037\275 -\315\221\244\162\152\234\242\033\030\240\157\354\120\364\175\100 -\302\250\060\317\275\163\310\023\053\020\023\036\213\232\250\072 -\224\163\323\030\151\012\112\377\301\001\003\377\171\177\265\110 -\177\173\356\350\051\157\066\114\225\141\206\330\371\242\163\212 -\356\256\057\226\356\150\315\075\115\050\102\371\105\053\062\033 -\106\125\026\152\246\113\051\371\273\225\126\277\106\035\354\035 -\223\035\300\145\262\037\241\103\256\126\236\240\261\217\153\022 -\267\140\155\170\013\312\212\134\355\036\226\016\203\246\110\225 -\215\073\243\041\304\256\130\306\000\262\204\264\043\244\226\206 -\065\270\330\236\330\254\064\111\230\143\225\305\313\155\110\107 -\342\362\056\030\036\320\061\253\335\164\354\371\334\214\270\034 -\216\150\043\272\320\363\120\334\317\145\217\163\072\062\307\174 -\376\312\202\042\117\276\216\142\107\146\345\315\207\342\350\325 -\017\030\237\345\004\162\113\106\074\020\362\104\302\144\126\161 -\116\165\350\234\311\046\164\305\175\131\321\012\133\017\155\376 -\236\165\034\030\306\032\072\174\330\015\004\314\315\267\105\145 -\172\261\217\270\256\204\110\076\263\172\115\250\003\342\342\176 -\001\026\131\150\030\103\063\260\322\334\260\032\103\065\356\245 -\332\251\106\134\256\206\201\101\001\112\164\046\354\237\006\277 -\302\005\067\144\165\170\051\150\375\305\365\353\376\107\371\344 -\205\260\341\173\061\235\246\177\162\243\271\304\054\056\314\231 -\127\016\041\014\105\001\224\145\353\145\011\306\143\042\013\063 -\111\222\110\074\374\315\316\260\076\216\236\213\370\376\111\305 -\065\162\107\002\003\001\000\001\243\201\216\060\201\213\060\017 -\006\003\125\035\023\001\001\377\004\005\060\003\001\001\377\060 -\035\006\003\125\035\016\004\026\004\024\252\374\221\020\033\207 -\221\137\026\271\277\117\113\221\136\000\034\261\062\200\060\016 -\006\003\125\035\017\001\001\377\004\004\003\002\001\006\060\111 -\006\003\125\035\037\004\102\060\100\060\076\240\074\240\072\206 -\070\150\164\164\160\072\057\057\143\162\154\056\144\055\164\162 -\165\163\164\056\156\145\164\057\143\162\154\057\144\055\164\162 -\165\163\164\137\145\166\137\162\157\157\164\137\143\141\137\062 -\137\062\060\062\063\056\143\162\154\060\015\006\011\052\206\110 -\206\367\015\001\001\015\005\000\003\202\002\001\000\223\313\245 -\037\231\021\354\232\015\137\054\025\223\306\077\276\020\215\170 -\102\360\156\220\107\107\216\243\222\062\215\160\217\366\133\215 -\276\211\316\107\001\152\033\040\040\211\133\310\202\020\154\340 -\347\231\252\153\306\052\240\143\065\221\152\205\045\255\027\070 -\245\233\176\120\362\166\352\205\005\052\047\101\053\261\201\321 -\242\366\100\165\251\016\313\361\125\110\330\354\321\354\263\350 -\316\024\241\065\354\302\136\065\032\253\246\026\001\006\216\352 -\334\057\243\212\312\054\221\353\122\216\137\014\233\027\317\313 -\163\007\031\304\152\302\163\124\357\174\103\122\143\301\021\312 -\302\105\261\364\073\123\365\151\256\074\343\245\336\254\350\124 -\267\262\221\375\254\251\037\362\207\344\027\306\111\250\174\330 -\012\101\364\362\076\347\167\064\004\122\335\350\201\362\115\057 -\124\105\235\025\341\117\314\345\336\064\127\020\311\043\162\027 -\160\215\120\160\037\126\154\314\271\377\072\132\117\143\172\303 -\156\145\007\035\204\241\377\251\014\143\211\155\262\100\210\071 -\327\037\167\150\265\374\234\325\326\147\151\133\250\164\333\374 -\211\366\033\062\367\244\044\246\166\267\107\123\357\215\111\217 -\251\266\203\132\245\226\220\105\141\365\336\003\117\046\017\250 -\213\360\003\226\260\254\025\320\161\132\152\173\224\346\160\223 -\332\361\151\340\262\142\115\236\217\377\211\235\233\135\315\105 -\351\224\002\042\215\340\065\177\350\361\004\171\161\154\124\203 -\370\063\271\005\062\033\130\125\021\117\320\345\047\107\161\354 -\355\332\147\326\142\246\113\115\017\151\242\311\274\354\042\113 -\224\307\150\224\027\176\342\216\050\076\266\306\352\365\064\154 -\237\067\210\007\070\333\206\161\372\315\225\110\103\156\243\117 -\202\207\327\064\230\156\113\223\171\140\165\151\017\360\032\325 -\123\372\041\014\302\077\351\077\037\030\214\222\135\170\247\166 -\147\031\273\262\352\177\351\160\011\126\126\243\260\014\013\055 -\066\136\305\351\304\325\203\313\206\027\227\054\154\023\157\207 -\132\257\111\246\035\333\315\070\004\056\137\342\112\065\016\055 -\113\370\242\044\004\215\330\341\143\136\002\222\064\332\230\141 -\134\034\157\130\166\144\263\374\002\270\365\235\012 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "D-TRUST EV Root CA 2 2023" -# Issuer: CN=D-TRUST EV Root CA 2 2023,O=D-Trust GmbH,C=DE -# Serial Number:69:26:09:7e:80:4b:4c:a0:a7:8c:78:62:53:5f:5a:6f -# Subject: CN=D-TRUST EV Root CA 2 2023,O=D-Trust GmbH,C=DE -# Not Valid Before: Tue May 09 09:10:33 2023 -# Not Valid After : Sun May 09 09:10:32 2038 -# Fingerprint (SHA-256): 8E:82:21:B2:E7:D4:00:78:36:A1:67:2F:0D:CC:29:9C:33:BC:07:D3:16:F1:32:FA:1A:20:6D:58:71:50:F1:CE -# Fingerprint (SHA1): A5:5B:D8:47:6C:8F:19:F7:4C:F4:6D:6B:B6:C2:79:82:22:DF:54:8B -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "D-TRUST EV Root CA 2 2023" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\245\133\330\107\154\217\031\367\114\364\155\153\266\302\171\202 -\042\337\124\213 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\226\264\170\011\360\011\313\167\353\273\033\115\157\066\274\266 -END -CKA_ISSUER MULTILINE_OCTAL -\060\110\061\013\060\011\006\003\125\004\006\023\002\104\105\061 -\025\060\023\006\003\125\004\012\023\014\104\055\124\162\165\163 -\164\040\107\155\142\110\061\042\060\040\006\003\125\004\003\023 -\031\104\055\124\122\125\123\124\040\105\126\040\122\157\157\164 -\040\103\101\040\062\040\062\060\062\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\151\046\011\176\200\113\114\240\247\214\170\142\123\137 -\132\157 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "SwissSign RSA SMIME Root CA 2022 - 1" -# -# Issuer: CN=SwissSign RSA SMIME Root CA 2022 - 1,O=SwissSign AG,C=CH -# Serial Number:46:0e:d4:01:71:90:a0:1a:83:2c:4a:42:10:28:15:d2:61:1b:ad:32 -# Subject: CN=SwissSign RSA SMIME Root CA 2022 - 1,O=SwissSign AG,C=CH -# Not Valid Before: Wed Jun 08 10:53:13 2022 -# Not Valid After : Sat Jun 08 10:53:13 2047 -# Fingerprint (SHA-256): 9A:12:C3:92:BF:E5:78:91:A0:C5:45:30:9D:4D:9F:D5:67:E4:80:CB:61:3D:63:42:27:8B:19:5C:79:A7:93:1F -# Fingerprint (SHA1): 14:D7:65:62:74:10:50:47:9F:8B:32:C6:86:8A:18:FA:E1:19:99:B0 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "SwissSign RSA SMIME Root CA 2022 - 1" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\123\061\013\060\011\006\003\125\004\006\023\002\103\110\061 -\025\060\023\006\003\125\004\012\023\014\123\167\151\163\163\123 -\151\147\156\040\101\107\061\055\060\053\006\003\125\004\003\023 -\044\123\167\151\163\163\123\151\147\156\040\122\123\101\040\123 -\115\111\115\105\040\122\157\157\164\040\103\101\040\062\060\062 -\062\040\055\040\061 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\123\061\013\060\011\006\003\125\004\006\023\002\103\110\061 -\025\060\023\006\003\125\004\012\023\014\123\167\151\163\163\123 -\151\147\156\040\101\107\061\055\060\053\006\003\125\004\003\023 -\044\123\167\151\163\163\123\151\147\156\040\122\123\101\040\123 -\115\111\115\105\040\122\157\157\164\040\103\101\040\062\060\062 -\062\040\055\040\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\106\016\324\001\161\220\240\032\203\054\112\102\020\050 -\025\322\141\033\255\062 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\227\060\202\003\177\240\003\002\001\002\002\024\106 -\016\324\001\161\220\240\032\203\054\112\102\020\050\025\322\141 -\033\255\062\060\015\006\011\052\206\110\206\367\015\001\001\013 -\005\000\060\123\061\013\060\011\006\003\125\004\006\023\002\103 -\110\061\025\060\023\006\003\125\004\012\023\014\123\167\151\163 -\163\123\151\147\156\040\101\107\061\055\060\053\006\003\125\004 -\003\023\044\123\167\151\163\163\123\151\147\156\040\122\123\101 -\040\123\115\111\115\105\040\122\157\157\164\040\103\101\040\062 -\060\062\062\040\055\040\061\060\036\027\015\062\062\060\066\060 -\070\061\060\065\063\061\063\132\027\015\064\067\060\066\060\070 -\061\060\065\063\061\063\132\060\123\061\013\060\011\006\003\125 -\004\006\023\002\103\110\061\025\060\023\006\003\125\004\012\023 -\014\123\167\151\163\163\123\151\147\156\040\101\107\061\055\060 -\053\006\003\125\004\003\023\044\123\167\151\163\163\123\151\147 -\156\040\122\123\101\040\123\115\111\115\105\040\122\157\157\164 -\040\103\101\040\062\060\062\062\040\055\040\061\060\202\002\042 -\060\015\006\011\052\206\110\206\367\015\001\001\001\005\000\003 -\202\002\017\000\060\202\002\012\002\202\002\001\000\324\373\372 -\077\206\242\231\160\011\072\311\326\241\116\001\316\106\265\055 -\044\110\015\105\351\254\311\032\327\062\200\244\346\323\312\326 -\362\051\067\354\232\054\326\201\316\346\033\235\261\017\101\337 -\130\323\137\252\240\171\131\013\214\255\371\305\371\034\373\303 -\351\065\100\164\303\301\014\313\147\373\234\136\014\043\371\320 -\057\372\114\202\105\034\265\365\037\370\031\156\332\223\267\116 -\150\203\176\142\055\035\214\225\037\160\331\316\132\214\041\135 -\250\276\010\251\126\155\331\367\271\220\231\307\073\327\275\236 -\056\311\147\127\056\041\316\360\062\203\373\004\001\371\267\202 -\104\015\262\313\172\011\241\110\076\117\300\013\152\033\033\354 -\317\035\236\177\006\220\254\050\005\013\250\346\124\073\242\247 -\054\071\023\231\250\373\064\353\365\360\275\001\330\210\021\310 -\256\272\031\002\111\002\334\212\054\264\275\141\140\354\235\170 -\134\152\213\057\027\206\136\362\117\223\000\153\135\305\262\251 -\245\030\352\346\155\176\127\005\373\007\374\274\174\241\103\261 -\146\034\250\147\373\253\067\366\252\252\270\172\101\367\071\325 -\214\237\256\162\066\047\344\142\306\103\231\361\241\101\351\377 -\211\237\017\111\257\311\024\006\027\047\144\071\015\245\264\052 -\133\354\074\373\237\305\137\306\073\135\046\031\362\204\051\270 -\225\104\011\122\375\154\060\320\142\217\050\245\201\226\053\224 -\057\046\165\344\011\214\012\337\070\363\176\135\070\216\202\232 -\214\334\236\256\316\022\102\072\042\362\065\215\117\322\032\310 -\111\063\013\372\066\077\377\054\153\152\040\161\114\315\255\020 -\077\151\062\204\216\134\356\123\210\104\342\335\314\003\060\222 -\206\171\220\052\113\165\373\122\142\304\364\157\115\367\333\043 -\241\030\335\105\123\027\232\143\044\110\211\042\315\176\233\001 -\034\200\050\003\217\133\053\372\037\343\174\031\275\346\217\261 -\100\166\240\362\307\067\262\062\224\020\062\315\247\023\227\361 -\073\054\172\064\042\173\164\072\100\342\257\202\370\301\301\170 -\374\137\344\065\177\300\364\114\360\114\262\352\207\003\162\045 -\131\203\052\010\244\121\336\317\356\250\347\350\100\077\210\360 -\066\253\011\116\330\240\250\177\363\341\011\333\271\002\003\001 -\000\001\243\143\060\141\060\017\006\003\125\035\023\001\001\377 -\004\005\060\003\001\001\377\060\016\006\003\125\035\017\001\001 -\377\004\004\003\002\001\006\060\037\006\003\125\035\043\004\030 -\060\026\200\024\314\056\255\211\214\203\343\100\243\045\151\245 -\352\222\175\322\067\072\307\306\060\035\006\003\125\035\016\004 -\026\004\024\314\056\255\211\214\203\343\100\243\045\151\245\352 -\222\175\322\067\072\307\306\060\015\006\011\052\206\110\206\367 -\015\001\001\013\005\000\003\202\002\001\000\000\007\146\026\245 -\355\307\271\277\274\310\221\255\130\355\136\022\005\263\366\106 -\233\173\344\204\020\057\007\261\132\136\062\156\155\000\360\136 -\307\232\142\071\207\115\344\074\363\276\366\272\152\123\154\204 -\155\007\324\141\312\147\146\276\233\076\105\060\235\121\322\327 -\132\102\256\235\222\016\043\253\320\025\224\076\250\232\312\233 -\355\301\302\137\041\243\231\200\374\271\246\141\016\120\200\200 -\047\307\350\175\240\324\224\172\230\003\347\356\102\213\363\122 -\120\134\357\276\260\166\132\034\011\241\277\203\300\036\166\145 -\320\045\101\133\151\221\223\167\371\214\113\360\054\333\233\006 -\000\027\203\372\132\224\264\206\211\357\274\012\013\022\370\006 -\115\322\163\342\221\070\135\271\152\113\117\247\257\332\046\045 -\222\043\032\174\037\047\015\221\204\357\027\162\366\106\353\153 -\073\067\251\324\325\232\143\272\136\171\214\052\265\233\242\064 -\265\314\226\047\371\171\010\074\177\155\340\377\174\334\305\046 -\257\303\241\172\151\026\335\207\065\163\306\153\061\153\126\001 -\055\117\231\331\356\312\341\320\203\336\266\205\347\026\370\321 -\256\063\110\373\032\317\135\137\212\204\141\164\007\157\031\260 -\121\041\262\241\004\261\173\123\217\357\242\105\255\037\230\335 -\371\152\004\154\252\066\305\257\214\352\051\111\112\347\377\127 -\263\306\074\021\111\030\027\346\146\205\341\350\043\362\213\016 -\074\223\304\077\166\116\176\142\242\051\313\026\060\336\054\151 -\257\221\247\342\127\345\063\114\277\330\216\007\242\177\241\065 -\106\151\112\250\040\051\377\353\336\040\225\131\261\256\115\060 -\153\330\232\264\003\037\302\070\344\040\325\016\326\032\060\114 -\150\234\214\340\355\241\017\216\102\135\353\200\052\022\171\246 -\027\027\264\225\052\216\064\221\247\275\321\254\250\032\103\041 -\213\336\357\340\254\106\045\145\012\306\053\241\233\076\042\350 -\030\070\265\046\366\054\312\010\040\336\060\321\255\124\375\334 -\110\025\237\315\247\101\327\067\070\205\060\117\022\210\103\064 -\203\327\052\115\324\000\127\134\345\312\360\335\341\222\050\053 -\030\165\275\107\244\102\023\351\126\132\215\112\136\316\016\165 -\065\200\163\031\017\054\051\213\273\225\270 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "SwissSign RSA SMIME Root CA 2022 - 1" -# Issuer: CN=SwissSign RSA SMIME Root CA 2022 - 1,O=SwissSign AG,C=CH -# Serial Number:46:0e:d4:01:71:90:a0:1a:83:2c:4a:42:10:28:15:d2:61:1b:ad:32 -# Subject: CN=SwissSign RSA SMIME Root CA 2022 - 1,O=SwissSign AG,C=CH -# Not Valid Before: Wed Jun 08 10:53:13 2022 -# Not Valid After : Sat Jun 08 10:53:13 2047 -# Fingerprint (SHA-256): 9A:12:C3:92:BF:E5:78:91:A0:C5:45:30:9D:4D:9F:D5:67:E4:80:CB:61:3D:63:42:27:8B:19:5C:79:A7:93:1F -# Fingerprint (SHA1): 14:D7:65:62:74:10:50:47:9F:8B:32:C6:86:8A:18:FA:E1:19:99:B0 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "SwissSign RSA SMIME Root CA 2022 - 1" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\024\327\145\142\164\020\120\107\237\213\062\306\206\212\030\372 -\341\031\231\260 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\232\063\065\330\302\042\023\366\370\153\226\000\022\032\110\141 -END -CKA_ISSUER MULTILINE_OCTAL -\060\123\061\013\060\011\006\003\125\004\006\023\002\103\110\061 -\025\060\023\006\003\125\004\012\023\014\123\167\151\163\163\123 -\151\147\156\040\101\107\061\055\060\053\006\003\125\004\003\023 -\044\123\167\151\163\163\123\151\147\156\040\122\123\101\040\123 -\115\111\115\105\040\122\157\157\164\040\103\101\040\062\060\062 -\062\040\055\040\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\106\016\324\001\161\220\240\032\203\054\112\102\020\050 -\025\322\141\033\255\062 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "SwissSign RSA TLS Root CA 2022 - 1" -# -# Issuer: CN=SwissSign RSA TLS Root CA 2022 - 1,O=SwissSign AG,C=CH -# Serial Number:43:fa:0c:5f:4e:1b:80:18:44:ef:d1:b4:4f:35:1f:44:f4:80:ed:cb -# Subject: CN=SwissSign RSA TLS Root CA 2022 - 1,O=SwissSign AG,C=CH -# Not Valid Before: Wed Jun 08 11:08:22 2022 -# Not Valid After : Sat Jun 08 11:08:22 2047 -# Fingerprint (SHA-256): 19:31:44:F4:31:E0:FD:DB:74:07:17:D4:DE:92:6A:57:11:33:88:4B:43:60:D3:0E:27:29:13:CB:E6:60:CE:41 -# Fingerprint (SHA1): 81:34:0A:BE:4C:CD:CE:CC:E7:7D:CC:8A:D4:57:E2:45:A0:77:5D:CE -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "SwissSign RSA TLS Root CA 2022 - 1" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\121\061\013\060\011\006\003\125\004\006\023\002\103\110\061 -\025\060\023\006\003\125\004\012\023\014\123\167\151\163\163\123 -\151\147\156\040\101\107\061\053\060\051\006\003\125\004\003\023 -\042\123\167\151\163\163\123\151\147\156\040\122\123\101\040\124 -\114\123\040\122\157\157\164\040\103\101\040\062\060\062\062\040 -\055\040\061 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\121\061\013\060\011\006\003\125\004\006\023\002\103\110\061 -\025\060\023\006\003\125\004\012\023\014\123\167\151\163\163\123 -\151\147\156\040\101\107\061\053\060\051\006\003\125\004\003\023 -\042\123\167\151\163\163\123\151\147\156\040\122\123\101\040\124 -\114\123\040\122\157\157\164\040\103\101\040\062\060\062\062\040 -\055\040\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\103\372\014\137\116\033\200\030\104\357\321\264\117\065 -\037\104\364\200\355\313 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\223\060\202\003\173\240\003\002\001\002\002\024\103 -\372\014\137\116\033\200\030\104\357\321\264\117\065\037\104\364 -\200\355\313\060\015\006\011\052\206\110\206\367\015\001\001\013 -\005\000\060\121\061\013\060\011\006\003\125\004\006\023\002\103 -\110\061\025\060\023\006\003\125\004\012\023\014\123\167\151\163 -\163\123\151\147\156\040\101\107\061\053\060\051\006\003\125\004 -\003\023\042\123\167\151\163\163\123\151\147\156\040\122\123\101 -\040\124\114\123\040\122\157\157\164\040\103\101\040\062\060\062 -\062\040\055\040\061\060\036\027\015\062\062\060\066\060\070\061 -\061\060\070\062\062\132\027\015\064\067\060\066\060\070\061\061 -\060\070\062\062\132\060\121\061\013\060\011\006\003\125\004\006 -\023\002\103\110\061\025\060\023\006\003\125\004\012\023\014\123 -\167\151\163\163\123\151\147\156\040\101\107\061\053\060\051\006 -\003\125\004\003\023\042\123\167\151\163\163\123\151\147\156\040 -\122\123\101\040\124\114\123\040\122\157\157\164\040\103\101\040 -\062\060\062\062\040\055\040\061\060\202\002\042\060\015\006\011 -\052\206\110\206\367\015\001\001\001\005\000\003\202\002\017\000 -\060\202\002\012\002\202\002\001\000\313\052\150\342\013\303\127 -\274\065\143\274\160\245\073\363\214\074\116\127\226\156\303\116 -\066\244\366\002\312\036\252\256\270\336\250\257\035\166\332\272 -\065\320\221\160\007\337\263\006\362\212\362\056\125\121\173\273 -\054\044\313\177\222\046\200\243\264\224\366\202\241\244\350\372 -\165\035\131\363\007\152\141\144\342\306\214\225\257\243\273\216 -\157\126\317\161\314\136\201\141\015\155\362\253\002\056\244\227 -\345\161\374\212\260\221\040\133\234\164\122\155\256\025\047\131 -\170\362\011\312\145\016\177\313\364\353\347\334\251\114\167\366 -\053\026\004\225\256\234\161\245\077\052\332\101\102\347\074\204 -\020\364\341\075\214\153\342\053\221\107\125\117\270\126\276\105 -\336\042\121\115\116\050\331\137\031\101\006\217\016\115\006\340 -\160\100\043\001\152\344\313\023\233\163\254\115\024\110\222\055 -\376\155\247\370\207\153\171\165\341\276\020\261\252\210\100\131 -\124\327\317\304\320\233\104\263\070\151\144\214\201\321\043\176 -\252\071\074\073\017\237\112\173\202\312\153\157\312\042\076\061 -\320\260\320\052\034\222\212\217\330\031\234\107\344\076\014\271 -\302\315\276\101\014\370\244\107\005\333\301\027\060\070\072\151 -\334\315\303\151\043\375\232\017\002\316\020\152\316\312\370\271 -\051\243\066\211\206\256\013\300\117\143\271\006\131\111\136\016 -\301\151\263\012\363\167\176\056\235\214\263\047\230\322\231\215 -\045\247\037\206\263\246\124\160\070\374\175\135\350\117\203\014 -\321\223\345\022\344\124\332\076\362\255\072\336\076\074\105\360 -\050\017\006\271\341\333\227\173\231\105\236\335\376\225\131\004 -\057\165\077\323\256\211\231\206\254\024\264\250\204\372\310\135 -\073\033\130\223\301\027\224\125\310\013\343\202\171\204\237\363 -\000\204\064\356\334\061\325\217\362\372\117\226\114\006\252\170 -\373\336\144\242\043\315\037\076\305\214\274\067\124\016\273\132 -\162\125\357\310\133\265\162\370\170\337\067\040\114\127\221\163 -\222\163\254\030\167\103\202\040\151\354\351\254\051\106\345\013 -\116\370\067\163\211\226\212\034\155\275\357\276\330\266\364\312 -\300\375\107\360\256\013\130\040\305\310\035\066\256\227\215\120 -\203\046\044\051\367\235\073\017\005\002\003\001\000\001\243\143 -\060\141\060\017\006\003\125\035\023\001\001\377\004\005\060\003 -\001\001\377\060\016\006\003\125\035\017\001\001\377\004\004\003 -\002\001\006\060\037\006\003\125\035\043\004\030\060\026\200\024 -\157\216\142\213\223\103\260\341\100\366\247\303\375\361\017\270 -\017\025\070\245\060\035\006\003\125\035\016\004\026\004\024\157 -\216\142\213\223\103\260\341\100\366\247\303\375\361\017\270\017 -\025\070\245\060\015\006\011\052\206\110\206\367\015\001\001\013 -\005\000\003\202\002\001\000\254\054\051\101\175\372\134\365\032 -\225\030\277\054\251\212\251\044\124\165\365\270\100\253\313\250 -\044\121\053\030\077\143\251\256\230\126\053\005\103\042\243\267 -\327\106\236\300\052\022\075\216\226\226\100\337\014\063\213\153 -\067\221\072\225\273\071\051\155\300\002\154\212\224\013\007\002 -\115\030\076\373\373\173\365\166\075\233\366\136\060\006\130\063 -\036\252\170\325\346\124\004\072\262\202\011\215\316\026\063\131 -\105\050\361\245\243\227\016\103\043\375\013\040\200\220\377\343 -\046\317\270\144\221\345\005\217\023\240\166\015\327\067\014\020 -\210\226\364\076\276\225\275\361\303\175\360\243\303\171\107\013 -\134\222\025\143\355\122\165\212\347\106\151\313\121\125\013\052 -\114\365\362\144\117\251\134\377\147\062\216\125\055\062\202\034 -\200\057\152\221\370\313\274\176\030\242\046\250\056\243\123\050 -\207\355\127\345\145\172\116\000\112\133\116\123\311\142\066\275 -\302\216\133\353\314\156\047\201\030\131\213\104\143\237\325\014 -\145\364\051\145\177\221\054\345\177\176\350\211\317\217\040\313 -\155\007\102\021\121\046\062\212\056\072\107\023\270\215\275\107 -\015\011\360\026\244\355\226\206\056\031\330\276\214\072\350\105 -\056\021\272\256\132\347\271\277\261\314\217\340\240\377\270\263 -\321\205\173\171\146\243\071\265\073\146\330\100\276\317\267\147 -\213\110\311\031\045\125\374\275\215\317\136\332\116\246\362\151 -\316\375\177\114\167\320\301\106\065\230\134\043\233\002\105\103 -\224\132\335\274\107\255\042\376\272\136\057\221\051\051\206\173 -\041\336\156\144\267\313\015\217\067\133\243\010\152\353\364\335 -\002\217\120\003\002\261\270\067\150\226\120\353\270\137\324\050 -\212\245\042\014\212\204\360\131\056\325\067\321\141\345\102\163 -\130\052\201\367\166\333\342\342\115\015\137\366\267\276\005\264 -\256\116\015\336\026\075\003\201\263\046\136\113\270\113\000\317 -\377\214\027\272\154\140\055\047\207\067\044\346\172\140\057\265 -\323\203\004\252\117\103\165\242\301\203\262\047\230\053\261\016 -\200\272\300\205\136\102\271\337\261\140\221\323\353\030\176\160 -\170\256\166\203\276\161\132\320\220\343\312\301\026\045\147\112 -\360\266\173\272\341\234\331 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "SwissSign RSA TLS Root CA 2022 - 1" -# Issuer: CN=SwissSign RSA TLS Root CA 2022 - 1,O=SwissSign AG,C=CH -# Serial Number:43:fa:0c:5f:4e:1b:80:18:44:ef:d1:b4:4f:35:1f:44:f4:80:ed:cb -# Subject: CN=SwissSign RSA TLS Root CA 2022 - 1,O=SwissSign AG,C=CH -# Not Valid Before: Wed Jun 08 11:08:22 2022 -# Not Valid After : Sat Jun 08 11:08:22 2047 -# Fingerprint (SHA-256): 19:31:44:F4:31:E0:FD:DB:74:07:17:D4:DE:92:6A:57:11:33:88:4B:43:60:D3:0E:27:29:13:CB:E6:60:CE:41 -# Fingerprint (SHA1): 81:34:0A:BE:4C:CD:CE:CC:E7:7D:CC:8A:D4:57:E2:45:A0:77:5D:CE -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "SwissSign RSA TLS Root CA 2022 - 1" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\201\064\012\276\114\315\316\314\347\175\314\212\324\127\342\105 -\240\167\135\316 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\026\056\344\031\166\201\205\272\216\221\130\361\025\357\162\071 -END -CKA_ISSUER MULTILINE_OCTAL -\060\121\061\013\060\011\006\003\125\004\006\023\002\103\110\061 -\025\060\023\006\003\125\004\012\023\014\123\167\151\163\163\123 -\151\147\156\040\101\107\061\053\060\051\006\003\125\004\003\023 -\042\123\167\151\163\163\123\151\147\156\040\122\123\101\040\124 -\114\123\040\122\157\157\164\040\103\101\040\062\060\062\062\040 -\055\040\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\103\372\014\137\116\033\200\030\104\357\321\264\117\065 -\037\104\364\200\355\313 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "OISTE Client Root ECC G1" -# -# Issuer: CN=OISTE Client Root ECC G1,O=OISTE Foundation,C=CH -# Serial Number:54:ec:97:d6:8b:b4:c4:0b:21:6e:0e:b2:d0:53:c8:7a -# Subject: CN=OISTE Client Root ECC G1,O=OISTE Foundation,C=CH -# Not Valid Before: Wed May 31 14:31:40 2023 -# Not Valid After : Sun May 24 14:31:39 2048 -# Fingerprint (SHA-256): D9:A3:24:85:A8:CC:A8:55:39:CE:F1:2F:FF:FF:71:13:78:A1:78:51:D7:3D:A2:73:2A:B4:30:2D:76:3B:D6:2B -# Fingerprint (SHA1): C0:2B:13:F9:1D:77:56:ED:6C:92:83:F1:86:DF:2A:D5:1E:6E:F2:BC -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "OISTE Client Root ECC G1" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\113\061\013\060\011\006\003\125\004\006\023\002\103\110\061 -\031\060\027\006\003\125\004\012\014\020\117\111\123\124\105\040 -\106\157\165\156\144\141\164\151\157\156\061\041\060\037\006\003 -\125\004\003\014\030\117\111\123\124\105\040\103\154\151\145\156 -\164\040\122\157\157\164\040\105\103\103\040\107\061 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\113\061\013\060\011\006\003\125\004\006\023\002\103\110\061 -\031\060\027\006\003\125\004\012\014\020\117\111\123\124\105\040 -\106\157\165\156\144\141\164\151\157\156\061\041\060\037\006\003 -\125\004\003\014\030\117\111\123\124\105\040\103\154\151\145\156 -\164\040\122\157\157\164\040\105\103\103\040\107\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\124\354\227\326\213\264\304\013\041\156\016\262\320\123 -\310\172 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\064\060\202\001\272\240\003\002\001\002\002\020\124 -\354\227\326\213\264\304\013\041\156\016\262\320\123\310\172\060 -\012\006\010\052\206\110\316\075\004\003\003\060\113\061\013\060 -\011\006\003\125\004\006\023\002\103\110\061\031\060\027\006\003 -\125\004\012\014\020\117\111\123\124\105\040\106\157\165\156\144 -\141\164\151\157\156\061\041\060\037\006\003\125\004\003\014\030 -\117\111\123\124\105\040\103\154\151\145\156\164\040\122\157\157 -\164\040\105\103\103\040\107\061\060\036\027\015\062\063\060\065 -\063\061\061\064\063\061\064\060\132\027\015\064\070\060\065\062 -\064\061\064\063\061\063\071\132\060\113\061\013\060\011\006\003 -\125\004\006\023\002\103\110\061\031\060\027\006\003\125\004\012 -\014\020\117\111\123\124\105\040\106\157\165\156\144\141\164\151 -\157\156\061\041\060\037\006\003\125\004\003\014\030\117\111\123 -\124\105\040\103\154\151\145\156\164\040\122\157\157\164\040\105 -\103\103\040\107\061\060\166\060\020\006\007\052\206\110\316\075 -\002\001\006\005\053\201\004\000\042\003\142\000\004\210\116\150 -\037\311\236\276\072\004\133\025\303\065\364\314\120\305\010\255 -\070\156\250\074\322\002\272\314\253\045\375\165\100\375\147\031 -\237\033\012\135\366\313\026\173\371\134\036\202\334\025\104\324 -\234\074\155\141\223\105\364\117\317\142\271\337\076\123\215\232 -\324\112\336\210\252\013\246\361\324\141\326\036\164\325\030\262 -\305\115\114\357\200\173\354\015\353\203\071\124\226\243\143\060 -\141\060\017\006\003\125\035\023\001\001\377\004\005\060\003\001 -\001\377\060\037\006\003\125\035\043\004\030\060\026\200\024\231 -\127\073\071\261\055\000\214\041\146\214\225\151\234\155\165\354 -\214\077\372\060\035\006\003\125\035\016\004\026\004\024\231\127 -\073\071\261\055\000\214\041\146\214\225\151\234\155\165\354\214 -\077\372\060\016\006\003\125\035\017\001\001\377\004\004\003\002 -\001\206\060\012\006\010\052\206\110\316\075\004\003\003\003\150 -\000\060\145\002\061\000\226\377\344\202\116\026\042\133\240\205 -\030\074\075\072\217\040\006\010\045\347\365\221\066\031\255\173 -\264\337\133\146\022\067\163\160\355\315\005\050\007\136\010\316 -\015\102\137\031\221\002\002\060\147\111\207\256\006\101\035\040 -\323\061\246\252\046\067\361\047\212\141\015\376\232\006\103\247 -\056\236\046\107\243\062\030\213\350\136\120\005\361\260\172\110 -\166\336\333\241\142\112\272\167 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "OISTE Client Root ECC G1" -# Issuer: CN=OISTE Client Root ECC G1,O=OISTE Foundation,C=CH -# Serial Number:54:ec:97:d6:8b:b4:c4:0b:21:6e:0e:b2:d0:53:c8:7a -# Subject: CN=OISTE Client Root ECC G1,O=OISTE Foundation,C=CH -# Not Valid Before: Wed May 31 14:31:40 2023 -# Not Valid After : Sun May 24 14:31:39 2048 -# Fingerprint (SHA-256): D9:A3:24:85:A8:CC:A8:55:39:CE:F1:2F:FF:FF:71:13:78:A1:78:51:D7:3D:A2:73:2A:B4:30:2D:76:3B:D6:2B -# Fingerprint (SHA1): C0:2B:13:F9:1D:77:56:ED:6C:92:83:F1:86:DF:2A:D5:1E:6E:F2:BC -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "OISTE Client Root ECC G1" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\300\053\023\371\035\167\126\355\154\222\203\361\206\337\052\325 -\036\156\362\274 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\121\257\341\070\170\021\354\345\310\237\135\233\065\362\114\054 -END -CKA_ISSUER MULTILINE_OCTAL -\060\113\061\013\060\011\006\003\125\004\006\023\002\103\110\061 -\031\060\027\006\003\125\004\012\014\020\117\111\123\124\105\040 -\106\157\165\156\144\141\164\151\157\156\061\041\060\037\006\003 -\125\004\003\014\030\117\111\123\124\105\040\103\154\151\145\156 -\164\040\122\157\157\164\040\105\103\103\040\107\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\124\354\227\326\213\264\304\013\041\156\016\262\320\123 -\310\172 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "OISTE Client Root RSA G1" -# -# Issuer: CN=OISTE Client Root RSA G1,O=OISTE Foundation,C=CH -# Serial Number:34:17:6f:59:01:88:1b:aa:a5:dd:c8:48:bb:b4:3b:73 -# Subject: CN=OISTE Client Root RSA G1,O=OISTE Foundation,C=CH -# Not Valid Before: Wed May 31 14:23:29 2023 -# Not Valid After : Sun May 24 14:23:28 2048 -# Fingerprint (SHA-256): D0:2A:0F:99:4A:86:8C:66:39:5F:2E:7A:88:0D:F5:09:BD:0C:29:C9:6D:E1:60:15:A0:FD:50:1E:DA:4F:96:A9 -# Fingerprint (SHA1): BD:A8:13:20:E0:BF:97:ED:A2:8E:9E:18:5F:F2:D5:FE:E5:2B:13:D5 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "OISTE Client Root RSA G1" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\113\061\013\060\011\006\003\125\004\006\023\002\103\110\061 -\031\060\027\006\003\125\004\012\014\020\117\111\123\124\105\040 -\106\157\165\156\144\141\164\151\157\156\061\041\060\037\006\003 -\125\004\003\014\030\117\111\123\124\105\040\103\154\151\145\156 -\164\040\122\157\157\164\040\122\123\101\040\107\061 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\113\061\013\060\011\006\003\125\004\006\023\002\103\110\061 -\031\060\027\006\003\125\004\012\014\020\117\111\123\124\105\040 -\106\157\165\156\144\141\164\151\157\156\061\041\060\037\006\003 -\125\004\003\014\030\117\111\123\124\105\040\103\154\151\145\156 -\164\040\122\157\157\164\040\122\123\101\040\107\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\064\027\157\131\001\210\033\252\245\335\310\110\273\264 -\073\163 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\203\060\202\003\153\240\003\002\001\002\002\020\064 -\027\157\131\001\210\033\252\245\335\310\110\273\264\073\163\060 -\015\006\011\052\206\110\206\367\015\001\001\014\005\000\060\113 -\061\013\060\011\006\003\125\004\006\023\002\103\110\061\031\060 -\027\006\003\125\004\012\014\020\117\111\123\124\105\040\106\157 -\165\156\144\141\164\151\157\156\061\041\060\037\006\003\125\004 -\003\014\030\117\111\123\124\105\040\103\154\151\145\156\164\040 -\122\157\157\164\040\122\123\101\040\107\061\060\036\027\015\062 -\063\060\065\063\061\061\064\062\063\062\071\132\027\015\064\070 -\060\065\062\064\061\064\062\063\062\070\132\060\113\061\013\060 -\011\006\003\125\004\006\023\002\103\110\061\031\060\027\006\003 -\125\004\012\014\020\117\111\123\124\105\040\106\157\165\156\144 -\141\164\151\157\156\061\041\060\037\006\003\125\004\003\014\030 -\117\111\123\124\105\040\103\154\151\145\156\164\040\122\157\157 -\164\040\122\123\101\040\107\061\060\202\002\042\060\015\006\011 -\052\206\110\206\367\015\001\001\001\005\000\003\202\002\017\000 -\060\202\002\012\002\202\002\001\000\272\117\376\376\124\023\265 -\204\074\274\340\323\061\361\035\156\334\304\123\161\372\344\071 -\121\103\166\175\222\037\201\177\000\153\101\302\346\332\334\030 -\115\154\027\131\160\011\063\142\354\151\210\055\260\335\131\371 -\141\140\140\126\361\266\264\357\353\207\320\023\376\303\317\157 -\217\176\071\130\121\263\211\002\216\124\225\036\042\137\253\050 -\005\103\047\370\105\364\011\102\046\224\376\275\023\170\273\221 -\362\020\020\234\015\147\174\332\144\040\353\172\060\032\272\110 -\015\170\124\052\231\061\064\253\313\246\152\347\014\147\071\146 -\244\046\250\047\050\347\363\346\074\163\344\053\314\157\061\056 -\023\164\141\313\150\346\322\063\316\122\274\176\145\044\132\041 -\201\061\103\252\262\234\321\030\347\141\074\122\257\200\211\351 -\064\106\336\371\115\231\132\155\035\275\306\045\321\223\125\216 -\370\047\222\103\072\214\225\105\100\343\211\030\247\206\301\131 -\230\312\333\046\034\023\300\214\201\271\230\260\255\151\255\156 -\030\343\173\142\101\365\255\066\376\013\264\173\040\137\237\251 -\156\371\231\202\022\122\322\212\304\124\170\264\174\367\101\233 -\003\347\007\136\263\302\271\111\144\147\222\026\304\140\220\016 -\260\202\175\063\255\320\066\352\321\166\153\174\210\107\230\254 -\033\371\264\120\214\141\201\151\330\061\363\215\372\076\362\365 -\113\257\316\303\035\357\137\050\033\353\030\326\240\130\122\062 -\276\102\157\315\111\227\042\301\160\271\323\343\140\117\336\203 -\202\240\116\060\275\163\123\302\275\027\375\240\300\230\217\352 -\016\027\007\346\103\225\040\116\333\021\250\371\343\323\270\047 -\107\014\047\333\022\353\201\125\314\165\333\237\323\027\103\304 -\373\353\212\050\155\351\257\104\120\132\103\373\361\071\342\223 -\120\317\230\374\104\226\130\070\245\245\355\105\303\122\102\005 -\247\357\345\074\244\254\075\347\326\251\126\005\252\260\303\247 -\031\344\345\075\327\127\104\155\224\021\037\312\160\310\374\271 -\114\314\101\132\203\164\123\220\170\317\326\324\056\117\261\252 -\115\056\365\321\010\133\072\144\357\310\247\250\172\141\354\354 -\246\325\210\116\266\124\324\130\221\302\045\144\221\274\012\024 -\075\222\024\232\265\013\006\351\057\002\003\001\000\001\243\143 -\060\141\060\017\006\003\125\035\023\001\001\377\004\005\060\003 -\001\001\377\060\037\006\003\125\035\043\004\030\060\026\200\024 -\051\202\045\065\012\072\276\222\053\344\011\003\344\354\217\215 -\070\162\071\313\060\035\006\003\125\035\016\004\026\004\024\051 -\202\045\065\012\072\276\222\053\344\011\003\344\354\217\215\070 -\162\071\313\060\016\006\003\125\035\017\001\001\377\004\004\003 -\002\001\206\060\015\006\011\052\206\110\206\367\015\001\001\014 -\005\000\003\202\002\001\000\155\043\206\302\377\365\340\310\300 -\125\212\140\061\314\227\103\107\160\103\323\343\354\122\372\323 -\302\236\373\211\062\032\312\106\223\117\004\227\053\333\320\234 -\204\015\225\007\102\124\376\357\151\041\337\222\003\056\217\067 -\041\043\167\251\167\067\154\240\304\256\234\247\130\071\112\025 -\227\142\106\203\121\040\355\077\302\243\361\303\142\047\320\254 -\023\036\376\074\122\035\220\325\143\361\251\136\352\177\347\347 -\353\226\132\121\354\324\251\033\343\014\224\146\254\313\210\222 -\111\276\163\134\212\340\152\274\246\201\315\263\134\324\043\222 -\310\115\371\040\214\160\224\113\150\155\362\217\036\154\065\367 -\350\137\324\327\275\040\067\122\146\377\053\273\111\146\267\161 -\250\054\137\163\017\007\222\347\116\137\245\006\333\311\212\074 -\227\305\102\352\175\017\201\033\127\353\236\014\017\377\243\047 -\040\111\123\246\263\072\114\313\155\060\065\332\362\360\232\376 -\120\337\155\134\044\075\115\167\152\175\206\137\114\320\341\246 -\264\256\004\023\001\220\361\200\150\204\007\224\202\007\203\353 -\221\345\223\016\165\221\256\243\043\040\111\144\324\272\071\226 -\127\160\356\125\064\050\174\326\257\312\251\236\346\311\001\311 -\007\301\320\104\261\200\264\121\120\252\217\366\234\345\147\163 -\320\033\352\203\065\027\057\120\306\336\126\307\273\243\003\313 -\342\241\030\350\370\316\121\006\243\322\003\100\141\032\247\147 -\127\203\374\321\022\271\050\252\332\116\153\325\234\330\205\067 -\332\275\042\327\064\131\234\032\246\316\170\326\224\170\007\006 -\017\261\223\041\240\111\307\020\236\012\256\121\167\032\371\161 -\220\303\255\230\017\212\051\152\140\001\252\117\255\040\003\055 -\152\216\243\013\152\326\375\223\014\212\141\313\275\050\361\137 -\161\375\270\063\071\326\112\361\366\262\150\122\076\145\217\103 -\235\201\044\044\366\050\114\065\247\375\063\012\245\170\301\004 -\037\354\111\152\304\256\325\104\026\246\247\215\177\332\041\226 -\076\250\272\026\147\324\251\241\347\302\232\370\020\331\073\232 -\356\150\366\057\000\356\313\273\146\215\042\070\206\364\277\137 -\170\251\310\240\035\132\273\165\120\371\122\013\017\035\002\054 -\024\032\363\207\152\167\363 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "OISTE Client Root RSA G1" -# Issuer: CN=OISTE Client Root RSA G1,O=OISTE Foundation,C=CH -# Serial Number:34:17:6f:59:01:88:1b:aa:a5:dd:c8:48:bb:b4:3b:73 -# Subject: CN=OISTE Client Root RSA G1,O=OISTE Foundation,C=CH -# Not Valid Before: Wed May 31 14:23:29 2023 -# Not Valid After : Sun May 24 14:23:28 2048 -# Fingerprint (SHA-256): D0:2A:0F:99:4A:86:8C:66:39:5F:2E:7A:88:0D:F5:09:BD:0C:29:C9:6D:E1:60:15:A0:FD:50:1E:DA:4F:96:A9 -# Fingerprint (SHA1): BD:A8:13:20:E0:BF:97:ED:A2:8E:9E:18:5F:F2:D5:FE:E5:2B:13:D5 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "OISTE Client Root RSA G1" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\275\250\023\040\340\277\227\355\242\216\236\030\137\362\325\376 -\345\053\023\325 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\232\033\325\012\267\026\352\272\241\212\331\361\036\015\371\023 -END -CKA_ISSUER MULTILINE_OCTAL -\060\113\061\013\060\011\006\003\125\004\006\023\002\103\110\061 -\031\060\027\006\003\125\004\012\014\020\117\111\123\124\105\040 -\106\157\165\156\144\141\164\151\157\156\061\041\060\037\006\003 -\125\004\003\014\030\117\111\123\124\105\040\103\154\151\145\156 -\164\040\122\157\157\164\040\122\123\101\040\107\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\064\027\157\131\001\210\033\252\245\335\310\110\273\264 -\073\163 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "OISTE Server Root ECC G1" -# -# Issuer: CN=OISTE Server Root ECC G1,O=OISTE Foundation,C=CH -# Serial Number:23:f9:c3:d6:35:af:8f:28:4b:1f:f0:54:ea:7e:97:9d -# Subject: CN=OISTE Server Root ECC G1,O=OISTE Foundation,C=CH -# Not Valid Before: Wed May 31 14:42:28 2023 -# Not Valid After : Sun May 24 14:42:27 2048 -# Fingerprint (SHA-256): EE:C9:97:C0:C3:0F:21:6F:7E:3B:8B:30:7D:2B:AE:42:41:2D:75:3F:C8:21:9D:AF:D1:52:0B:25:72:85:0F:49 -# Fingerprint (SHA1): 3B:F6:8B:09:AE:2A:92:7B:BA:E3:8D:3F:11:95:D9:E6:44:0C:45:E2 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "OISTE Server Root ECC G1" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\113\061\013\060\011\006\003\125\004\006\023\002\103\110\061 -\031\060\027\006\003\125\004\012\014\020\117\111\123\124\105\040 -\106\157\165\156\144\141\164\151\157\156\061\041\060\037\006\003 -\125\004\003\014\030\117\111\123\124\105\040\123\145\162\166\145 -\162\040\122\157\157\164\040\105\103\103\040\107\061 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\113\061\013\060\011\006\003\125\004\006\023\002\103\110\061 -\031\060\027\006\003\125\004\012\014\020\117\111\123\124\105\040 -\106\157\165\156\144\141\164\151\157\156\061\041\060\037\006\003 -\125\004\003\014\030\117\111\123\124\105\040\123\145\162\166\145 -\162\040\122\157\157\164\040\105\103\103\040\107\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\043\371\303\326\065\257\217\050\113\037\360\124\352\176 -\227\235 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\065\060\202\001\272\240\003\002\001\002\002\020\043 -\371\303\326\065\257\217\050\113\037\360\124\352\176\227\235\060 -\012\006\010\052\206\110\316\075\004\003\003\060\113\061\013\060 -\011\006\003\125\004\006\023\002\103\110\061\031\060\027\006\003 -\125\004\012\014\020\117\111\123\124\105\040\106\157\165\156\144 -\141\164\151\157\156\061\041\060\037\006\003\125\004\003\014\030 -\117\111\123\124\105\040\123\145\162\166\145\162\040\122\157\157 -\164\040\105\103\103\040\107\061\060\036\027\015\062\063\060\065 -\063\061\061\064\064\062\062\070\132\027\015\064\070\060\065\062 -\064\061\064\064\062\062\067\132\060\113\061\013\060\011\006\003 -\125\004\006\023\002\103\110\061\031\060\027\006\003\125\004\012 -\014\020\117\111\123\124\105\040\106\157\165\156\144\141\164\151 -\157\156\061\041\060\037\006\003\125\004\003\014\030\117\111\123 -\124\105\040\123\145\162\166\145\162\040\122\157\157\164\040\105 -\103\103\040\107\061\060\166\060\020\006\007\052\206\110\316\075 -\002\001\006\005\053\201\004\000\042\003\142\000\004\027\057\372 -\022\274\254\030\363\012\364\104\326\166\102\236\263\350\037\267 -\171\251\130\266\370\145\321\072\041\117\250\353\243\276\244\062 -\162\363\266\001\311\053\375\167\205\156\123\335\255\352\252\056 -\045\222\266\351\041\021\250\257\265\114\013\363\226\140\232\073 -\347\352\032\170\056\264\075\345\050\336\034\200\272\134\156\015 -\333\031\245\343\077\234\052\270\100\113\335\346\117\243\143\060 -\141\060\017\006\003\125\035\023\001\001\377\004\005\060\003\001 -\001\377\060\037\006\003\125\035\043\004\030\060\026\200\024\067 -\115\210\145\317\374\075\212\325\243\361\111\300\116\014\020\157 -\102\264\234\060\035\006\003\125\035\016\004\026\004\024\067\115 -\210\145\317\374\075\212\325\243\361\111\300\116\014\020\157\102 -\264\234\060\016\006\003\125\035\017\001\001\377\004\004\003\002 -\001\206\060\012\006\010\052\206\110\316\075\004\003\003\003\151 -\000\060\146\002\061\000\251\052\060\035\320\302\237\220\121\121 -\100\076\225\124\041\315\026\146\367\123\154\010\026\071\320\022 -\174\177\143\033\337\343\070\000\071\331\055\123\040\105\013\034 -\140\147\061\103\045\355\002\061\000\222\211\256\351\134\142\203 -\142\141\371\055\127\253\126\271\021\335\045\276\152\116\112\032 -\202\153\334\317\323\274\112\263\074\327\056\233\333\370\050\151 -\274\153\055\354\061\241\072\343\127 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "OISTE Server Root ECC G1" -# Issuer: CN=OISTE Server Root ECC G1,O=OISTE Foundation,C=CH -# Serial Number:23:f9:c3:d6:35:af:8f:28:4b:1f:f0:54:ea:7e:97:9d -# Subject: CN=OISTE Server Root ECC G1,O=OISTE Foundation,C=CH -# Not Valid Before: Wed May 31 14:42:28 2023 -# Not Valid After : Sun May 24 14:42:27 2048 -# Fingerprint (SHA-256): EE:C9:97:C0:C3:0F:21:6F:7E:3B:8B:30:7D:2B:AE:42:41:2D:75:3F:C8:21:9D:AF:D1:52:0B:25:72:85:0F:49 -# Fingerprint (SHA1): 3B:F6:8B:09:AE:2A:92:7B:BA:E3:8D:3F:11:95:D9:E6:44:0C:45:E2 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "OISTE Server Root ECC G1" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\073\366\213\011\256\052\222\173\272\343\215\077\021\225\331\346 -\104\014\105\342 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\102\247\322\065\256\002\222\333\031\166\010\336\057\005\264\324 -END -CKA_ISSUER MULTILINE_OCTAL -\060\113\061\013\060\011\006\003\125\004\006\023\002\103\110\061 -\031\060\027\006\003\125\004\012\014\020\117\111\123\124\105\040 -\106\157\165\156\144\141\164\151\157\156\061\041\060\037\006\003 -\125\004\003\014\030\117\111\123\124\105\040\123\145\162\166\145 -\162\040\122\157\157\164\040\105\103\103\040\107\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\043\371\303\326\065\257\217\050\113\037\360\124\352\176 -\227\235 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "OISTE Server Root RSA G1" -# -# Issuer: CN=OISTE Server Root RSA G1,O=OISTE Foundation,C=CH -# Serial Number:55:a5:d9:67:94:28:c6:ed:0c:fa:27:dd:5b:01:4d:18 -# Subject: CN=OISTE Server Root RSA G1,O=OISTE Foundation,C=CH -# Not Valid Before: Wed May 31 14:37:16 2023 -# Not Valid After : Sun May 24 14:37:15 2048 -# Fingerprint (SHA-256): 9A:E3:62:32:A5:18:9F:FD:DB:35:3D:FD:26:52:0C:01:53:95:D2:27:77:DA:C5:9D:B5:7B:98:C0:89:A6:51:E6 -# Fingerprint (SHA1): F7:00:34:25:94:88:68:31:E4:34:87:3F:70:FE:86:B3:86:9F:F0:6E -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "OISTE Server Root RSA G1" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\113\061\013\060\011\006\003\125\004\006\023\002\103\110\061 -\031\060\027\006\003\125\004\012\014\020\117\111\123\124\105\040 -\106\157\165\156\144\141\164\151\157\156\061\041\060\037\006\003 -\125\004\003\014\030\117\111\123\124\105\040\123\145\162\166\145 -\162\040\122\157\157\164\040\122\123\101\040\107\061 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\113\061\013\060\011\006\003\125\004\006\023\002\103\110\061 -\031\060\027\006\003\125\004\012\014\020\117\111\123\124\105\040 -\106\157\165\156\144\141\164\151\157\156\061\041\060\037\006\003 -\125\004\003\014\030\117\111\123\124\105\040\123\145\162\166\145 -\162\040\122\157\157\164\040\122\123\101\040\107\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\125\245\331\147\224\050\306\355\014\372\047\335\133\001 -\115\030 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\203\060\202\003\153\240\003\002\001\002\002\020\125 -\245\331\147\224\050\306\355\014\372\047\335\133\001\115\030\060 -\015\006\011\052\206\110\206\367\015\001\001\014\005\000\060\113 -\061\013\060\011\006\003\125\004\006\023\002\103\110\061\031\060 -\027\006\003\125\004\012\014\020\117\111\123\124\105\040\106\157 -\165\156\144\141\164\151\157\156\061\041\060\037\006\003\125\004 -\003\014\030\117\111\123\124\105\040\123\145\162\166\145\162\040 -\122\157\157\164\040\122\123\101\040\107\061\060\036\027\015\062 -\063\060\065\063\061\061\064\063\067\061\066\132\027\015\064\070 -\060\065\062\064\061\064\063\067\061\065\132\060\113\061\013\060 -\011\006\003\125\004\006\023\002\103\110\061\031\060\027\006\003 -\125\004\012\014\020\117\111\123\124\105\040\106\157\165\156\144 -\141\164\151\157\156\061\041\060\037\006\003\125\004\003\014\030 -\117\111\123\124\105\040\123\145\162\166\145\162\040\122\157\157 -\164\040\122\123\101\040\107\061\060\202\002\042\060\015\006\011 -\052\206\110\206\367\015\001\001\001\005\000\003\202\002\017\000 -\060\202\002\012\002\202\002\001\000\252\256\364\253\202\317\373 -\345\067\013\347\325\226\255\220\350\113\051\334\125\140\343\314 -\274\263\274\055\222\271\344\243\172\361\201\264\236\162\162\103 -\337\077\253\013\046\264\356\173\032\151\373\050\320\162\134\112 -\155\151\231\360\143\036\014\322\261\377\326\214\064\320\356\333 -\254\110\271\352\260\024\216\330\007\251\044\230\335\351\011\276 -\250\042\033\131\071\321\047\207\334\034\315\370\373\263\353\351 -\223\170\355\017\316\067\174\046\167\156\241\330\054\041\114\344 -\212\117\307\023\074\156\307\325\023\227\262\250\333\044\151\203 -\126\323\151\313\202\022\273\235\033\362\370\064\362\230\053\052 -\216\004\147\366\343\207\241\035\255\156\316\066\164\016\136\063 -\073\313\333\121\227\224\152\225\074\316\030\132\156\113\306\374 -\007\217\056\032\271\112\367\144\064\051\334\246\215\120\341\215 -\213\113\345\110\033\156\056\200\020\077\344\237\033\145\077\021 -\264\352\127\151\237\264\000\353\205\044\231\044\365\041\235\227 -\252\373\064\177\002\153\025\220\255\273\236\132\031\177\244\214 -\330\372\155\050\374\070\307\343\114\255\152\316\331\116\223\222 -\216\314\014\147\277\013\113\226\316\146\147\123\150\313\027\021 -\216\131\367\254\234\033\271\216\150\104\267\030\257\346\345\017 -\145\334\225\011\260\223\022\265\037\076\224\245\307\210\165\041 -\261\336\011\044\052\114\342\274\354\114\147\107\302\051\210\271 -\012\272\371\301\164\316\214\030\046\145\332\367\157\306\214\173 -\150\134\013\356\143\300\136\113\361\116\314\237\057\017\341\350 -\232\172\223\361\340\310\333\277\047\346\145\051\173\066\340\063 -\025\163\362\235\153\204\010\150\053\066\007\053\047\314\170\330 -\152\207\016\107\164\364\252\240\023\135\144\176\364\333\024\256 -\373\072\344\057\301\145\343\271\172\100\154\360\006\267\173\050 -\233\327\341\137\070\163\224\254\331\160\223\055\334\204\257\106 -\034\242\172\054\077\201\046\102\347\324\330\305\154\204\146\021 -\213\167\153\124\034\243\265\330\020\360\256\051\367\147\010\210 -\027\134\270\227\171\317\352\053\052\356\130\063\345\155\351\051 -\252\145\001\015\202\023\354\045\013\135\054\100\162\025\051\323 -\220\054\367\032\103\325\152\360\151\002\003\001\000\001\243\143 -\060\141\060\017\006\003\125\035\023\001\001\377\004\005\060\003 -\001\001\377\060\037\006\003\125\035\043\004\030\060\026\200\024 -\362\311\301\017\015\143\000\273\354\105\016\112\037\265\261\263 -\066\315\016\215\060\035\006\003\125\035\016\004\026\004\024\362 -\311\301\017\015\143\000\273\354\105\016\112\037\265\261\263\066 -\315\016\215\060\016\006\003\125\035\017\001\001\377\004\004\003 -\002\001\206\060\015\006\011\052\206\110\206\367\015\001\001\014 -\005\000\003\202\002\001\000\064\147\171\262\072\306\345\075\367 -\043\162\271\011\357\222\255\047\037\240\116\012\262\365\332\027 -\014\242\205\322\176\222\121\375\025\145\327\134\153\144\026\356 -\212\105\312\014\103\066\104\065\331\177\376\171\072\034\350\306 -\344\075\153\167\324\041\020\343\366\363\040\116\251\276\211\363 -\034\234\251\337\274\060\072\027\321\062\103\320\252\212\162\034 -\121\050\114\335\066\310\344\055\147\175\221\207\034\235\274\374 -\253\050\226\136\141\134\270\042\063\030\110\026\120\352\312\057 -\351\245\111\334\177\074\244\031\274\066\255\222\342\271\364\113 -\325\353\010\255\347\170\376\027\300\135\207\167\350\147\167\117 -\000\146\257\364\261\003\072\276\022\174\101\065\345\364\246\033 -\107\213\313\171\367\326\277\027\156\116\145\360\370\332\127\301 -\224\201\345\172\126\015\273\106\177\157\221\375\175\346\027\344 -\201\047\273\005\210\126\335\040\245\367\230\055\221\031\151\061 -\137\233\060\362\231\255\162\100\226\314\330\167\146\233\264\325 -\016\262\020\376\024\252\303\200\161\235\075\215\350\175\024\154 -\141\144\206\106\246\327\124\305\266\327\220\026\106\245\205\312 -\236\072\343\346\023\026\266\025\043\314\251\051\122\375\000\306 -\366\220\216\126\217\211\010\335\226\252\346\323\152\251\206\065 -\366\325\105\170\102\112\106\374\003\310\136\330\146\366\105\145 -\044\264\276\207\173\125\040\235\367\235\265\052\374\271\142\031 -\313\154\073\257\323\155\070\154\253\173\246\036\215\374\351\236 -\376\153\025\271\333\202\232\313\230\337\163\241\220\240\240\305 -\340\350\001\250\243\024\234\310\301\232\254\025\120\063\215\355 -\174\052\213\163\225\100\103\046\374\201\244\052\137\071\220\267 -\047\313\121\167\370\226\223\036\317\362\167\175\037\106\223\242 -\131\036\225\104\305\055\165\144\260\326\371\340\074\151\352\004 -\265\034\013\342\106\104\115\103\073\227\111\161\021\275\044\266 -\302\255\162\124\006\376\153\030\371\167\333\051\054\122\236\155 -\167\173\142\375\017\115\216\230\062\060\060\161\022\326\045\065 -\343\237\370\157\234\265\353\152\033\255\352\020\323\226\026\162 -\006\041\045\306\114\274\217\160\273\014\344\136\042\203\055\322 -\276\376\205\133\264\344\275 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "OISTE Server Root RSA G1" -# Issuer: CN=OISTE Server Root RSA G1,O=OISTE Foundation,C=CH -# Serial Number:55:a5:d9:67:94:28:c6:ed:0c:fa:27:dd:5b:01:4d:18 -# Subject: CN=OISTE Server Root RSA G1,O=OISTE Foundation,C=CH -# Not Valid Before: Wed May 31 14:37:16 2023 -# Not Valid After : Sun May 24 14:37:15 2048 -# Fingerprint (SHA-256): 9A:E3:62:32:A5:18:9F:FD:DB:35:3D:FD:26:52:0C:01:53:95:D2:27:77:DA:C5:9D:B5:7B:98:C0:89:A6:51:E6 -# Fingerprint (SHA1): F7:00:34:25:94:88:68:31:E4:34:87:3F:70:FE:86:B3:86:9F:F0:6E -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "OISTE Server Root RSA G1" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\367\000\064\045\224\210\150\061\344\064\207\077\160\376\206\263 -\206\237\360\156 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\043\247\236\324\160\270\271\024\127\101\212\176\104\131\342\150 -END -CKA_ISSUER MULTILINE_OCTAL -\060\113\061\013\060\011\006\003\125\004\006\023\002\103\110\061 -\031\060\027\006\003\125\004\012\014\020\117\111\123\124\105\040 -\106\157\165\156\144\141\164\151\157\156\061\041\060\037\006\003 -\125\004\003\014\030\117\111\123\124\105\040\123\145\162\166\145 -\162\040\122\157\157\164\040\122\123\101\040\107\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\125\245\331\147\224\050\306\355\014\372\047\335\133\001 -\115\030 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "e-Szigno TLS Root CA 2023" -# -# Issuer: CN=e-Szigno TLS Root CA 2023,OID.2.5.4.97=VATHU-23584497,O=Microsec Ltd.,L=Budapest,C=HU -# Serial Number:00:e8:6f:18:7b:d6:39:6b:98:4a:49:98:0a -# Subject: CN=e-Szigno TLS Root CA 2023,OID.2.5.4.97=VATHU-23584497,O=Microsec Ltd.,L=Budapest,C=HU -# Not Valid Before: Mon Jul 17 14:00:00 2023 -# Not Valid After : Sat Jul 17 14:00:00 2038 -# Fingerprint (SHA-256): B4:91:41:50:2D:00:66:3D:74:0F:2E:7E:C3:40:C5:28:00:96:26:66:12:1A:36:D0:9C:F7:DD:2B:90:38:4F:B4 -# Fingerprint (SHA1): 6F:9A:D5:D5:DF:E8:2C:EB:BE:37:07:EE:4F:4F:52:58:29:41:D1:FE -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "e-Szigno TLS Root CA 2023" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\165\061\013\060\011\006\003\125\004\006\023\002\110\125\061 -\021\060\017\006\003\125\004\007\014\010\102\165\144\141\160\145 -\163\164\061\026\060\024\006\003\125\004\012\014\015\115\151\143 -\162\157\163\145\143\040\114\164\144\056\061\027\060\025\006\003 -\125\004\141\014\016\126\101\124\110\125\055\062\063\065\070\064 -\064\071\067\061\042\060\040\006\003\125\004\003\014\031\145\055 -\123\172\151\147\156\157\040\124\114\123\040\122\157\157\164\040 -\103\101\040\062\060\062\063 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\165\061\013\060\011\006\003\125\004\006\023\002\110\125\061 -\021\060\017\006\003\125\004\007\014\010\102\165\144\141\160\145 -\163\164\061\026\060\024\006\003\125\004\012\014\015\115\151\143 -\162\157\163\145\143\040\114\164\144\056\061\027\060\025\006\003 -\125\004\141\014\016\126\101\124\110\125\055\062\063\065\070\064 -\064\071\067\061\042\060\040\006\003\125\004\003\014\031\145\055 -\123\172\151\147\156\157\040\124\114\123\040\122\157\157\164\040 -\103\101\040\062\060\062\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\015\000\350\157\030\173\326\071\153\230\112\111\230\012 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\317\060\202\002\061\240\003\002\001\002\002\015\000 -\350\157\030\173\326\071\153\230\112\111\230\012\060\012\006\010 -\052\206\110\316\075\004\003\004\060\165\061\013\060\011\006\003 -\125\004\006\023\002\110\125\061\021\060\017\006\003\125\004\007 -\014\010\102\165\144\141\160\145\163\164\061\026\060\024\006\003 -\125\004\012\014\015\115\151\143\162\157\163\145\143\040\114\164 -\144\056\061\027\060\025\006\003\125\004\141\014\016\126\101\124 -\110\125\055\062\063\065\070\064\064\071\067\061\042\060\040\006 -\003\125\004\003\014\031\145\055\123\172\151\147\156\157\040\124 -\114\123\040\122\157\157\164\040\103\101\040\062\060\062\063\060 -\036\027\015\062\063\060\067\061\067\061\064\060\060\060\060\132 -\027\015\063\070\060\067\061\067\061\064\060\060\060\060\132\060 -\165\061\013\060\011\006\003\125\004\006\023\002\110\125\061\021 -\060\017\006\003\125\004\007\014\010\102\165\144\141\160\145\163 -\164\061\026\060\024\006\003\125\004\012\014\015\115\151\143\162 -\157\163\145\143\040\114\164\144\056\061\027\060\025\006\003\125 -\004\141\014\016\126\101\124\110\125\055\062\063\065\070\064\064 -\071\067\061\042\060\040\006\003\125\004\003\014\031\145\055\123 -\172\151\147\156\157\040\124\114\123\040\122\157\157\164\040\103 -\101\040\062\060\062\063\060\201\233\060\020\006\007\052\206\110 -\316\075\002\001\006\005\053\201\004\000\043\003\201\206\000\004 -\000\150\017\337\242\174\074\252\164\210\141\012\215\302\114\245 -\001\042\024\324\367\140\167\102\234\012\070\140\241\214\147\076 -\263\143\351\372\221\260\213\113\346\071\337\002\302\060\001\122 -\000\277\337\214\355\131\255\062\145\253\011\131\120\265\031\302 -\150\034\000\340\005\137\332\120\046\034\303\254\004\042\305\072 -\115\357\351\127\130\066\243\301\031\123\020\012\321\315\077\357 -\113\065\032\103\217\102\023\114\271\054\032\234\276\060\266\304 -\336\334\113\235\344\244\074\313\056\331\255\337\337\175\011\337 -\056\222\377\241\243\143\060\141\060\017\006\003\125\035\023\001 -\001\377\004\005\060\003\001\001\377\060\016\006\003\125\035\017 -\001\001\377\004\004\003\002\001\006\060\035\006\003\125\035\016 -\004\026\004\024\131\204\002\142\132\106\170\365\135\334\217\012 -\020\050\043\334\325\326\373\105\060\037\006\003\125\035\043\004 -\030\060\026\200\024\131\204\002\142\132\106\170\365\135\334\217 -\012\020\050\043\334\325\326\373\105\060\012\006\010\052\206\110 -\316\075\004\003\004\003\201\213\000\060\201\207\002\102\001\055 -\332\256\365\056\170\266\146\270\237\266\160\177\146\164\317\354 -\216\174\376\300\001\171\232\316\122\002\347\303\321\014\172\155 -\313\265\136\356\027\244\233\333\004\166\356\051\051\350\257\373 -\255\254\122\364\327\053\326\167\204\020\275\305\322\050\150\064 -\002\101\065\166\132\165\363\222\206\010\365\262\036\012\366\145 -\013\332\166\307\122\377\013\036\200\160\042\060\303\063\333\030 -\355\204\327\213\354\355\323\250\143\201\265\126\174\107\307\126 -\060\224\150\163\153\322\056\251\271\331\054\034\051\275\014\272 -\271\145\213 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "e-Szigno TLS Root CA 2023" -# Issuer: CN=e-Szigno TLS Root CA 2023,OID.2.5.4.97=VATHU-23584497,O=Microsec Ltd.,L=Budapest,C=HU -# Serial Number:00:e8:6f:18:7b:d6:39:6b:98:4a:49:98:0a -# Subject: CN=e-Szigno TLS Root CA 2023,OID.2.5.4.97=VATHU-23584497,O=Microsec Ltd.,L=Budapest,C=HU -# Not Valid Before: Mon Jul 17 14:00:00 2023 -# Not Valid After : Sat Jul 17 14:00:00 2038 -# Fingerprint (SHA-256): B4:91:41:50:2D:00:66:3D:74:0F:2E:7E:C3:40:C5:28:00:96:26:66:12:1A:36:D0:9C:F7:DD:2B:90:38:4F:B4 -# Fingerprint (SHA1): 6F:9A:D5:D5:DF:E8:2C:EB:BE:37:07:EE:4F:4F:52:58:29:41:D1:FE -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "e-Szigno TLS Root CA 2023" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\157\232\325\325\337\350\054\353\276\067\007\356\117\117\122\130 -\051\101\321\376 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\152\351\231\164\245\332\136\361\331\056\362\310\321\206\213\161 -END -CKA_ISSUER MULTILINE_OCTAL -\060\165\061\013\060\011\006\003\125\004\006\023\002\110\125\061 -\021\060\017\006\003\125\004\007\014\010\102\165\144\141\160\145 -\163\164\061\026\060\024\006\003\125\004\012\014\015\115\151\143 -\162\157\163\145\143\040\114\164\144\056\061\027\060\025\006\003 -\125\004\141\014\016\126\101\124\110\125\055\062\063\065\070\064 -\064\071\067\061\042\060\040\006\003\125\004\003\014\031\145\055 -\123\172\151\147\156\157\040\124\114\123\040\122\157\157\164\040 -\103\101\040\062\060\062\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\015\000\350\157\030\173\326\071\153\230\112\111\230\012 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "SecureSign Root CA16" -# -# Issuer: CN=SecureSign Root CA16,O="Cybertrust Japan Co., Ltd.",C=JP -# Serial Number:54:7b:8d:ab:53:11:00:77:a8:18:03:ae:a1:2b:11:29:ab:42:e0:45 -# Subject: CN=SecureSign Root CA16,O="Cybertrust Japan Co., Ltd.",C=JP -# Not Valid Before: Tue Jul 30 07:08:11 2024 -# Not Valid After : Fri Jul 29 06:55:40 2044 -# Fingerprint (SHA-256): 4C:1C:CD:24:F1:7E:95:0F:C1:85:36:B3:3C:AF:E3:22:93:CF:C3:3E:84:67:B4:1E:1C:69:30:55:D7:F5:13:BF -# Fingerprint (SHA1): D1:79:17:EC:45:E2:A0:CA:D7:74:51:30:10:A4:C6:5C:AA:B3:3C:49 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "SecureSign Root CA16" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\121\061\013\060\011\006\003\125\004\006\023\002\112\120\061 -\043\060\041\006\003\125\004\012\023\032\103\171\142\145\162\164 -\162\165\163\164\040\112\141\160\141\156\040\103\157\056\054\040 -\114\164\144\056\061\035\060\033\006\003\125\004\003\023\024\123 -\145\143\165\162\145\123\151\147\156\040\122\157\157\164\040\103 -\101\061\066 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\121\061\013\060\011\006\003\125\004\006\023\002\112\120\061 -\043\060\041\006\003\125\004\012\023\032\103\171\142\145\162\164 -\162\165\163\164\040\112\141\160\141\156\040\103\157\056\054\040 -\114\164\144\056\061\035\060\033\006\003\125\004\003\023\024\123 -\145\143\165\162\145\123\151\147\156\040\122\157\157\164\040\103 -\101\061\066 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\124\173\215\253\123\021\000\167\250\030\003\256\241\053 -\021\051\253\102\340\105 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\162\060\202\003\132\240\003\002\001\002\002\024\124 -\173\215\253\123\021\000\167\250\030\003\256\241\053\021\051\253 -\102\340\105\060\015\006\011\052\206\110\206\367\015\001\001\014 -\005\000\060\121\061\013\060\011\006\003\125\004\006\023\002\112 -\120\061\043\060\041\006\003\125\004\012\023\032\103\171\142\145 -\162\164\162\165\163\164\040\112\141\160\141\156\040\103\157\056 -\054\040\114\164\144\056\061\035\060\033\006\003\125\004\003\023 -\024\123\145\143\165\162\145\123\151\147\156\040\122\157\157\164 -\040\103\101\061\066\060\036\027\015\062\064\060\067\063\060\060 -\067\060\070\061\061\132\027\015\064\064\060\067\062\071\060\066 -\065\065\064\060\132\060\121\061\013\060\011\006\003\125\004\006 -\023\002\112\120\061\043\060\041\006\003\125\004\012\023\032\103 -\171\142\145\162\164\162\165\163\164\040\112\141\160\141\156\040 -\103\157\056\054\040\114\164\144\056\061\035\060\033\006\003\125 -\004\003\023\024\123\145\143\165\162\145\123\151\147\156\040\122 -\157\157\164\040\103\101\061\066\060\202\002\042\060\015\006\011 -\052\206\110\206\367\015\001\001\001\005\000\003\202\002\017\000 -\060\202\002\012\002\202\002\001\000\307\045\037\360\022\266\217 -\261\357\177\076\127\276\107\206\363\342\046\314\016\172\356\163 -\302\366\063\044\352\302\037\156\345\321\232\164\205\224\354\163 -\021\340\141\210\355\133\055\245\327\123\323\266\200\254\260\345 -\126\351\126\152\152\232\215\273\352\335\155\302\164\175\136\365 -\047\333\044\267\125\212\222\133\303\245\020\371\167\103\156\151 -\366\263\346\336\175\165\221\260\215\351\373\140\046\155\011\355 -\376\341\124\331\000\211\271\262\326\205\163\070\046\044\323\111 -\231\306\154\065\366\352\076\057\005\174\052\071\002\351\205\065 -\256\123\052\175\144\147\322\200\256\224\260\243\162\010\064\263 -\143\125\317\230\137\103\062\151\376\253\314\205\213\217\043\343 -\214\207\224\076\236\315\341\213\006\372\171\107\025\251\333\126 -\053\122\363\265\101\063\372\244\334\216\325\255\313\116\226\273 -\261\316\324\253\123\130\274\110\134\264\217\327\146\036\024\041 -\014\065\140\320\164\263\141\220\056\170\272\005\356\120\325\117 -\243\302\360\132\072\256\131\314\175\103\207\240\106\161\154\113 -\216\354\064\200\376\273\164\334\370\273\040\356\242\343\352\352 -\246\230\015\262\334\021\044\141\052\260\142\214\346\144\200\130 -\376\270\034\261\325\223\134\001\356\064\160\363\267\035\324\245 -\146\323\016\131\246\275\004\203\313\321\114\014\246\132\142\040 -\113\204\245\116\073\324\250\362\245\142\143\313\136\265\362\170 -\066\027\026\036\362\073\100\006\136\112\155\336\365\364\255\154 -\214\350\211\157\154\050\060\102\055\027\166\000\145\043\235\324 -\321\350\007\077\041\012\356\266\356\123\265\372\173\355\076\072 -\101\224\155\060\051\271\254\117\357\123\013\005\136\304\236\154 -\000\332\163\350\176\056\353\373\302\270\255\105\120\146\316\115 -\370\116\355\110\275\236\027\120\162\217\263\226\106\037\332\320 -\327\267\072\314\024\134\274\211\263\133\354\214\175\254\242\217 -\233\131\206\016\335\060\304\063\150\010\233\275\111\361\305\375 -\072\166\021\233\327\017\240\100\140\046\342\014\257\211\340\162 -\123\252\203\355\311\073\032\341\117\005\216\070\215\122\201\000 -\075\141\105\021\277\263\254\273\114\263\125\163\245\260\135\034 -\164\137\026\141\051\236\250\002\073\002\003\001\000\001\243\102 -\060\100\060\017\006\003\125\035\023\001\001\377\004\005\060\003 -\001\001\377\060\016\006\003\125\035\017\001\001\377\004\004\003 -\002\001\006\060\035\006\003\125\035\016\004\026\004\024\030\156 -\064\266\333\231\125\144\110\245\206\111\270\236\113\223\367\016 -\053\017\060\015\006\011\052\206\110\206\367\015\001\001\014\005 -\000\003\202\002\001\000\253\202\224\212\011\027\240\274\203\130 -\204\261\263\200\143\044\112\341\121\050\076\370\114\314\140\037 -\341\151\320\203\302\361\356\375\010\326\067\323\026\167\102\273 -\331\250\006\166\160\024\271\271\323\151\353\223\352\342\140\061 -\225\300\141\021\165\353\142\336\201\275\345\012\244\244\247\105 -\053\355\222\340\247\110\273\226\110\056\315\317\066\007\161\270 -\166\132\204\377\321\316\336\151\217\124\111\365\135\223\111\100 -\020\160\152\122\304\264\053\340\002\157\066\317\240\006\137\047 -\067\316\025\356\022\002\000\115\135\234\127\331\267\335\150\246 -\177\034\266\244\251\212\025\377\113\215\301\274\027\034\101\327 -\156\272\124\045\234\055\263\070\161\225\150\027\221\334\214\360 -\130\110\064\036\157\217\345\351\055\101\317\017\222\200\330\314 -\144\252\231\021\176\172\371\062\376\033\042\266\372\055\253\054 -\100\322\374\254\045\265\016\114\016\074\273\050\010\243\223\313 -\332\004\176\260\350\065\312\136\025\106\162\073\333\051\316\255 -\365\157\007\173\232\311\111\054\114\012\022\143\302\256\352\355 -\005\044\317\074\316\146\051\037\327\072\140\144\067\200\052\331 -\173\063\157\363\347\213\256\241\024\316\231\031\345\013\172\274 -\326\137\322\223\021\272\365\207\231\337\041\113\342\117\150\126 -\375\261\165\053\076\113\075\116\173\142\346\131\250\365\044\062 -\311\054\243\356\035\266\365\176\056\055\047\122\011\165\203\260 -\306\106\033\073\265\074\252\140\211\345\315\227\037\261\147\313 -\161\217\144\021\025\352\202\000\343\342\115\326\311\270\225\222 -\105\011\025\236\133\121\343\330\301\015\242\202\232\244\135\151 -\334\105\170\201\127\064\035\264\270\003\061\370\171\250\221\104 -\162\216\343\025\312\001\236\150\370\247\306\104\010\256\164\052 -\226\361\023\141\103\030\321\312\107\227\270\330\270\071\254\111 -\031\320\145\360\241\273\132\200\207\251\142\151\276\053\271\257 -\237\310\001\375\326\373\203\237\214\274\227\052\124\141\222\007 -\310\301\316\256\111\140\056\337\345\053\116\000\072\374\271\106 -\253\164\031\070\145\231\301\367\002\065\122\356\351\335\365\164 -\115\240\160\237\156\266\334\024\013\103\062\330\001\021\007\074 -\215\105\157\101\254\001 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "SecureSign Root CA16" -# Issuer: CN=SecureSign Root CA16,O="Cybertrust Japan Co., Ltd.",C=JP -# Serial Number:54:7b:8d:ab:53:11:00:77:a8:18:03:ae:a1:2b:11:29:ab:42:e0:45 -# Subject: CN=SecureSign Root CA16,O="Cybertrust Japan Co., Ltd.",C=JP -# Not Valid Before: Tue Jul 30 07:08:11 2024 -# Not Valid After : Fri Jul 29 06:55:40 2044 -# Fingerprint (SHA-256): 4C:1C:CD:24:F1:7E:95:0F:C1:85:36:B3:3C:AF:E3:22:93:CF:C3:3E:84:67:B4:1E:1C:69:30:55:D7:F5:13:BF -# Fingerprint (SHA1): D1:79:17:EC:45:E2:A0:CA:D7:74:51:30:10:A4:C6:5C:AA:B3:3C:49 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "SecureSign Root CA16" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\321\171\027\354\105\342\240\312\327\164\121\060\020\244\306\134 -\252\263\074\111 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\150\132\170\276\353\165\351\257\156\376\274\220\301\201\062\245 -END -CKA_ISSUER MULTILINE_OCTAL -\060\121\061\013\060\011\006\003\125\004\006\023\002\112\120\061 -\043\060\041\006\003\125\004\012\023\032\103\171\142\145\162\164 -\162\165\163\164\040\112\141\160\141\156\040\103\157\056\054\040 -\114\164\144\056\061\035\060\033\006\003\125\004\003\023\024\123 -\145\143\165\162\145\123\151\147\156\040\122\157\157\164\040\103 -\101\061\066 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\124\173\215\253\123\021\000\167\250\030\003\256\241\053 -\021\051\253\102\340\105 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "SECOM TLS RSA Root CA 2024" -# -# Issuer: CN=SECOM TLS RSA Root CA 2024,O="SECOM Trust Systems Co., Ltd.",C=JP -# Serial Number:00:ee:89:34:d0:cb:80:e0:b2 -# Subject: CN=SECOM TLS RSA Root CA 2024,O="SECOM Trust Systems Co., Ltd.",C=JP -# Not Valid Before: Wed Jan 31 05:11:55 2024 -# Not Valid After : Thu Jan 14 05:11:55 2049 -# Fingerprint (SHA-256): 14:35:F2:25:C5:D2:52:D7:A2:19:48:CC:3C:E6:2A:EC:FA:88:00:1E:3D:D7:2D:1C:C3:55:51:00:EB:37:2F:93 -# Fingerprint (SHA1): FB:97:96:7C:EF:8D:98:63:06:C0:3B:B6:11:F8:E0:13:97:A2:98:D3 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "SECOM TLS RSA Root CA 2024" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\132\061\013\060\011\006\003\125\004\006\023\002\112\120\061 -\046\060\044\006\003\125\004\012\023\035\123\105\103\117\115\040 -\124\162\165\163\164\040\123\171\163\164\145\155\163\040\103\157 -\056\054\040\114\164\144\056\061\043\060\041\006\003\125\004\003 -\023\032\123\105\103\117\115\040\124\114\123\040\122\123\101\040 -\122\157\157\164\040\103\101\040\062\060\062\064 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\132\061\013\060\011\006\003\125\004\006\023\002\112\120\061 -\046\060\044\006\003\125\004\012\023\035\123\105\103\117\115\040 -\124\162\165\163\164\040\123\171\163\164\145\155\163\040\103\157 -\056\054\040\114\164\144\056\061\043\060\041\006\003\125\004\003 -\023\032\123\105\103\117\115\040\124\114\123\040\122\123\101\040 -\122\157\157\164\040\103\101\040\062\060\062\064 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\011\000\356\211\064\320\313\200\340\262 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\232\060\202\003\202\240\003\002\001\002\002\011\000 -\356\211\064\320\313\200\340\262\060\015\006\011\052\206\110\206 -\367\015\001\001\014\005\000\060\132\061\013\060\011\006\003\125 -\004\006\023\002\112\120\061\046\060\044\006\003\125\004\012\023 -\035\123\105\103\117\115\040\124\162\165\163\164\040\123\171\163 -\164\145\155\163\040\103\157\056\054\040\114\164\144\056\061\043 -\060\041\006\003\125\004\003\023\032\123\105\103\117\115\040\124 -\114\123\040\122\123\101\040\122\157\157\164\040\103\101\040\062 -\060\062\064\060\036\027\015\062\064\060\061\063\061\060\065\061 -\061\065\065\132\027\015\064\071\060\061\061\064\060\065\061\061 -\065\065\132\060\132\061\013\060\011\006\003\125\004\006\023\002 -\112\120\061\046\060\044\006\003\125\004\012\023\035\123\105\103 -\117\115\040\124\162\165\163\164\040\123\171\163\164\145\155\163 -\040\103\157\056\054\040\114\164\144\056\061\043\060\041\006\003 -\125\004\003\023\032\123\105\103\117\115\040\124\114\123\040\122 -\123\101\040\122\157\157\164\040\103\101\040\062\060\062\064\060 -\202\002\042\060\015\006\011\052\206\110\206\367\015\001\001\001 -\005\000\003\202\002\017\000\060\202\002\012\002\202\002\001\000 -\341\070\342\315\114\063\305\262\047\253\304\361\327\130\032\025 -\203\144\345\363\276\337\214\273\117\043\070\235\350\164\122\002 -\371\044\206\133\044\322\323\317\154\177\374\277\301\357\137\271 -\233\245\372\234\142\053\355\336\045\024\220\106\266\063\272\357 -\270\127\073\077\167\316\107\026\151\104\346\335\126\316\002\060 -\145\267\206\026\306\127\034\160\021\327\271\236\350\335\017\270 -\107\352\053\232\260\135\035\342\165\011\065\004\033\313\155\101 -\262\210\227\161\273\071\226\033\234\177\077\244\377\034\214\373 -\233\377\111\003\124\333\214\316\236\361\261\124\121\070\350\254 -\102\336\167\174\312\011\056\126\040\241\346\333\270\312\141\072 -\243\002\266\071\011\355\036\236\174\103\037\056\237\024\001\130 -\275\145\242\321\237\276\204\117\360\211\222\117\166\346\167\156 -\272\347\302\340\026\255\113\211\247\134\131\261\067\113\324\135 -\275\042\217\320\174\073\360\374\202\054\120\022\305\122\017\201 -\212\360\125\221\076\035\333\125\337\372\157\067\144\034\142\143 -\313\155\127\043\114\236\215\132\046\145\106\321\254\347\315\273 -\075\033\240\361\225\326\233\165\361\361\102\337\322\007\100\113 -\141\334\341\152\157\223\103\073\162\376\003\326\315\251\070\000 -\311\110\021\230\211\370\271\310\003\163\364\142\374\251\267\127 -\235\156\171\230\362\327\374\244\322\254\011\125\247\100\125\132 -\302\267\236\242\065\345\316\310\113\363\044\000\306\200\064\074 -\023\123\335\152\247\055\360\054\247\317\376\073\105\344\014\353 -\153\305\140\355\074\301\304\044\256\071\227\376\327\254\212\112 -\065\127\134\262\151\376\204\174\374\324\027\071\232\033\057\161 -\276\100\260\165\271\265\344\107\123\242\123\243\023\101\366\125 -\276\177\000\360\316\310\041\104\242\110\230\032\145\323\055\320 -\024\227\114\012\147\202\062\216\101\306\317\055\043\206\226\227 -\021\161\077\030\227\004\274\216\225\314\107\041\215\240\113\323 -\161\011\322\037\151\033\203\252\170\203\262\160\253\300\243\160 -\076\115\267\255\311\373\053\201\214\207\315\115\032\357\372\224 -\214\146\255\324\000\052\326\165\145\214\312\112\252\230\247\075 -\073\037\375\337\107\337\321\123\121\342\113\355\072\163\316\065 -\002\003\001\000\001\243\143\060\141\060\035\006\003\125\035\016 -\004\026\004\024\054\353\162\022\216\130\167\144\065\025\126\065 -\001\127\007\251\175\015\066\346\060\037\006\003\125\035\043\004 -\030\060\026\200\024\054\353\162\022\216\130\167\144\065\025\126 -\065\001\127\007\251\175\015\066\346\060\016\006\003\125\035\017 -\001\001\377\004\004\003\002\001\006\060\017\006\003\125\035\023 -\001\001\377\004\005\060\003\001\001\377\060\015\006\011\052\206 -\110\206\367\015\001\001\014\005\000\003\202\002\001\000\025\302 -\313\345\271\046\237\151\354\371\264\123\321\376\024\123\007\064 -\161\023\043\014\100\135\327\045\160\225\213\174\236\201\234\212 -\241\347\073\206\141\072\217\035\231\063\302\240\063\131\047\333 -\042\121\300\125\307\137\314\324\133\331\301\054\100\326\163\214 -\056\023\302\353\225\232\241\031\223\075\244\224\027\032\141\263 -\105\353\003\045\136\211\201\020\147\153\350\370\260\015\114\357 -\042\035\226\362\364\260\007\305\134\120\223\105\245\223\017\201 -\065\127\337\121\056\261\163\131\364\334\013\347\265\363\110\103 -\270\323\051\250\341\050\343\257\245\061\345\277\132\370\173\211 -\363\220\263\351\042\053\103\266\200\174\120\014\334\154\225\046 -\257\234\053\070\127\271\174\035\020\311\330\266\265\322\216\364 -\006\216\325\057\067\365\133\303\001\276\375\025\116\174\101\370 -\330\323\346\244\300\156\021\205\207\321\257\247\200\132\046\231 -\235\121\375\002\344\041\017\351\326\320\225\370\061\131\374\330 -\257\257\162\125\076\235\075\000\176\030\121\032\143\115\310\061 -\217\200\160\020\254\372\211\265\174\334\153\101\173\175\316\212 -\037\060\023\105\154\270\157\244\321\377\046\305\326\164\145\063 -\174\326\316\327\153\254\301\066\271\301\250\174\054\035\174\025 -\064\015\333\374\317\035\211\257\004\112\013\273\045\040\147\117 -\125\064\262\150\345\200\064\221\162\055\125\211\013\214\307\266 -\112\054\163\053\213\034\120\173\374\324\202\275\364\217\165\015 -\154\173\027\003\025\053\015\261\200\132\176\144\266\001\331\331 -\351\101\012\352\302\125\272\342\011\107\121\302\266\067\320\103 -\262\170\313\113\027\231\371\103\304\012\037\121\304\176\026\001 -\302\242\145\157\234\251\242\214\232\023\366\130\027\321\340\207 -\021\354\323\213\337\151\245\327\127\154\363\270\141\127\120\231 -\131\141\102\044\007\002\211\326\031\317\240\231\153\307\261\314 -\172\043\077\324\201\345\021\364\376\375\112\164\160\042\262\250 -\122\216\322\145\375\102\000\034\204\070\361\351\116\237\314\053 -\115\321\132\247\206\033\345\241\340\226\143\036\067\037\237\000 -\210\103\226\345\225\177\024\316\354\176\035\114\365\076\110\125 -\121\060\260\041\373\014\012\145\372\233\367\211\314\171 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "SECOM TLS RSA Root CA 2024" -# Issuer: CN=SECOM TLS RSA Root CA 2024,O="SECOM Trust Systems Co., Ltd.",C=JP -# Serial Number:00:ee:89:34:d0:cb:80:e0:b2 -# Subject: CN=SECOM TLS RSA Root CA 2024,O="SECOM Trust Systems Co., Ltd.",C=JP -# Not Valid Before: Wed Jan 31 05:11:55 2024 -# Not Valid After : Thu Jan 14 05:11:55 2049 -# Fingerprint (SHA-256): 14:35:F2:25:C5:D2:52:D7:A2:19:48:CC:3C:E6:2A:EC:FA:88:00:1E:3D:D7:2D:1C:C3:55:51:00:EB:37:2F:93 -# Fingerprint (SHA1): FB:97:96:7C:EF:8D:98:63:06:C0:3B:B6:11:F8:E0:13:97:A2:98:D3 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "SECOM TLS RSA Root CA 2024" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\373\227\226\174\357\215\230\143\006\300\073\266\021\370\340\023 -\227\242\230\323 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\320\244\333\062\353\104\230\322\142\013\076\274\115\174\134\351 -END -CKA_ISSUER MULTILINE_OCTAL -\060\132\061\013\060\011\006\003\125\004\006\023\002\112\120\061 -\046\060\044\006\003\125\004\012\023\035\123\105\103\117\115\040 -\124\162\165\163\164\040\123\171\163\164\145\155\163\040\103\157 -\056\054\040\114\164\144\056\061\043\060\041\006\003\125\004\003 -\023\032\123\105\103\117\115\040\124\114\123\040\122\123\101\040 -\122\157\157\164\040\103\101\040\062\060\062\064 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\011\000\356\211\064\320\313\200\340\262 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "SECOM TLS ECC Root CA 2024" -# -# Issuer: CN=SECOM TLS ECC Root CA 2024,O="SECOM Trust Systems Co., Ltd.",C=JP -# Serial Number:00:81:7a:2c:ef:8f:23:7a:44 -# Subject: CN=SECOM TLS ECC Root CA 2024,O="SECOM Trust Systems Co., Ltd.",C=JP -# Not Valid Before: Wed Jan 31 05:52:34 2024 -# Not Valid After : Thu Jan 14 05:52:34 2049 -# Fingerprint (SHA-256): 6A:B2:AB:75:F5:1C:B4:F4:F0:15:62:03:FB:F6:F6:46:23:2F:51:4B:E0:59:F6:28:33:30:8B:82:B4:D7:2D:B1 -# Fingerprint (SHA1): 7A:1F:22:2D:72:B2:C3:19:87:44:DB:61:69:E8:A6:4B:D7:0D:44:0E -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "SECOM TLS ECC Root CA 2024" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\132\061\013\060\011\006\003\125\004\006\023\002\112\120\061 -\046\060\044\006\003\125\004\012\023\035\123\105\103\117\115\040 -\124\162\165\163\164\040\123\171\163\164\145\155\163\040\103\157 -\056\054\040\114\164\144\056\061\043\060\041\006\003\125\004\003 -\023\032\123\105\103\117\115\040\124\114\123\040\105\103\103\040 -\122\157\157\164\040\103\101\040\062\060\062\064 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\132\061\013\060\011\006\003\125\004\006\023\002\112\120\061 -\046\060\044\006\003\125\004\012\023\035\123\105\103\117\115\040 -\124\162\165\163\164\040\123\171\163\164\145\155\163\040\103\157 -\056\054\040\114\164\144\056\061\043\060\041\006\003\125\004\003 -\023\032\123\105\103\117\115\040\124\114\123\040\105\103\103\040 -\122\157\157\164\040\103\101\040\062\060\062\064 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\011\000\201\172\054\357\217\043\172\104 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\114\060\202\001\321\240\003\002\001\002\002\011\000 -\201\172\054\357\217\043\172\104\060\012\006\010\052\206\110\316 -\075\004\003\003\060\132\061\013\060\011\006\003\125\004\006\023 -\002\112\120\061\046\060\044\006\003\125\004\012\023\035\123\105 -\103\117\115\040\124\162\165\163\164\040\123\171\163\164\145\155 -\163\040\103\157\056\054\040\114\164\144\056\061\043\060\041\006 -\003\125\004\003\023\032\123\105\103\117\115\040\124\114\123\040 -\105\103\103\040\122\157\157\164\040\103\101\040\062\060\062\064 -\060\036\027\015\062\064\060\061\063\061\060\065\065\062\063\064 -\132\027\015\064\071\060\061\061\064\060\065\065\062\063\064\132 -\060\132\061\013\060\011\006\003\125\004\006\023\002\112\120\061 -\046\060\044\006\003\125\004\012\023\035\123\105\103\117\115\040 -\124\162\165\163\164\040\123\171\163\164\145\155\163\040\103\157 -\056\054\040\114\164\144\056\061\043\060\041\006\003\125\004\003 -\023\032\123\105\103\117\115\040\124\114\123\040\105\103\103\040 -\122\157\157\164\040\103\101\040\062\060\062\064\060\166\060\020 -\006\007\052\206\110\316\075\002\001\006\005\053\201\004\000\042 -\003\142\000\004\354\334\305\062\333\275\167\064\027\110\320\265 -\331\366\233\223\117\206\224\056\137\212\160\167\107\265\332\146 -\211\321\121\335\264\150\130\226\071\273\156\064\020\213\121\224 -\237\223\244\027\000\116\171\006\061\027\261\164\077\064\157\062 -\122\250\234\136\073\056\366\113\003\053\162\131\006\000\260\054 -\345\141\353\351\360\045\164\357\262\217\335\022\077\306\121\201 -\371\230\027\150\243\143\060\141\060\035\006\003\125\035\016\004 -\026\004\024\073\166\021\173\051\164\342\116\006\114\126\202\100 -\320\041\057\172\263\311\325\060\037\006\003\125\035\043\004\030 -\060\026\200\024\073\166\021\173\051\164\342\116\006\114\126\202 -\100\320\041\057\172\263\311\325\060\016\006\003\125\035\017\001 -\001\377\004\004\003\002\001\006\060\017\006\003\125\035\023\001 -\001\377\004\005\060\003\001\001\377\060\012\006\010\052\206\110 -\316\075\004\003\003\003\151\000\060\146\002\061\000\335\342\157 -\307\342\326\223\030\264\003\343\062\051\101\345\356\177\037\353 -\171\010\275\061\074\277\234\147\232\023\115\233\222\012\072\100 -\237\133\373\027\365\100\257\306\305\305\005\300\243\002\061\000 -\253\001\124\355\100\010\132\173\262\114\063\076\367\157\324\105 -\030\345\257\075\355\141\213\117\211\133\371\270\361\024\005\262 -\227\314\003\161\222\135\300\146\177\244\001\361\267\120\011\326 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "SECOM TLS ECC Root CA 2024" -# Issuer: CN=SECOM TLS ECC Root CA 2024,O="SECOM Trust Systems Co., Ltd.",C=JP -# Serial Number:00:81:7a:2c:ef:8f:23:7a:44 -# Subject: CN=SECOM TLS ECC Root CA 2024,O="SECOM Trust Systems Co., Ltd.",C=JP -# Not Valid Before: Wed Jan 31 05:52:34 2024 -# Not Valid After : Thu Jan 14 05:52:34 2049 -# Fingerprint (SHA-256): 6A:B2:AB:75:F5:1C:B4:F4:F0:15:62:03:FB:F6:F6:46:23:2F:51:4B:E0:59:F6:28:33:30:8B:82:B4:D7:2D:B1 -# Fingerprint (SHA1): 7A:1F:22:2D:72:B2:C3:19:87:44:DB:61:69:E8:A6:4B:D7:0D:44:0E -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "SECOM TLS ECC Root CA 2024" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\172\037\042\055\162\262\303\031\207\104\333\141\151\350\246\113 -\327\015\104\016 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\231\323\235\344\322\261\055\360\052\004\147\205\363\337\106\326 -END -CKA_ISSUER MULTILINE_OCTAL -\060\132\061\013\060\011\006\003\125\004\006\023\002\112\120\061 -\046\060\044\006\003\125\004\012\023\035\123\105\103\117\115\040 -\124\162\165\163\164\040\123\171\163\164\145\155\163\040\103\157 -\056\054\040\114\164\144\056\061\043\060\041\006\003\125\004\003 -\023\032\123\105\103\117\115\040\124\114\123\040\105\103\103\040 -\122\157\157\164\040\103\101\040\062\060\062\064 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\011\000\201\172\054\357\217\043\172\104 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "SECOM SMIME RSA Root CA 2024" -# -# Issuer: CN=SECOM SMIME RSA Root CA 2024,O="SECOM Trust Systems Co., Ltd.",C=JP -# Serial Number:00:dd:a9:db:9e:7e:bc:d4:6d -# Subject: CN=SECOM SMIME RSA Root CA 2024,O="SECOM Trust Systems Co., Ltd.",C=JP -# Not Valid Before: Wed Jan 31 06:23:06 2024 -# Not Valid After : Thu Jan 14 06:23:06 2049 -# Fingerprint (SHA-256): 36:29:E7:18:8E:00:A7:CB:32:32:C4:42:6B:C8:49:12:F1:21:8B:1A:9A:E6:76:C0:B0:AB:E1:DB:FE:21:82:B5 -# Fingerprint (SHA1): 90:A5:E1:BD:C5:3F:69:08:C2:E3:73:9F:E7:55:E3:7F:75:F3:84:47 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "SECOM SMIME RSA Root CA 2024" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\134\061\013\060\011\006\003\125\004\006\023\002\112\120\061 -\046\060\044\006\003\125\004\012\023\035\123\105\103\117\115\040 -\124\162\165\163\164\040\123\171\163\164\145\155\163\040\103\157 -\056\054\040\114\164\144\056\061\045\060\043\006\003\125\004\003 -\023\034\123\105\103\117\115\040\123\115\111\115\105\040\122\123 -\101\040\122\157\157\164\040\103\101\040\062\060\062\064 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\134\061\013\060\011\006\003\125\004\006\023\002\112\120\061 -\046\060\044\006\003\125\004\012\023\035\123\105\103\117\115\040 -\124\162\165\163\164\040\123\171\163\164\145\155\163\040\103\157 -\056\054\040\114\164\144\056\061\045\060\043\006\003\125\004\003 -\023\034\123\105\103\117\115\040\123\115\111\115\105\040\122\123 -\101\040\122\157\157\164\040\103\101\040\062\060\062\064 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\011\000\335\251\333\236\176\274\324\155 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\236\060\202\003\206\240\003\002\001\002\002\011\000 -\335\251\333\236\176\274\324\155\060\015\006\011\052\206\110\206 -\367\015\001\001\014\005\000\060\134\061\013\060\011\006\003\125 -\004\006\023\002\112\120\061\046\060\044\006\003\125\004\012\023 -\035\123\105\103\117\115\040\124\162\165\163\164\040\123\171\163 -\164\145\155\163\040\103\157\056\054\040\114\164\144\056\061\045 -\060\043\006\003\125\004\003\023\034\123\105\103\117\115\040\123 -\115\111\115\105\040\122\123\101\040\122\157\157\164\040\103\101 -\040\062\060\062\064\060\036\027\015\062\064\060\061\063\061\060 -\066\062\063\060\066\132\027\015\064\071\060\061\061\064\060\066 -\062\063\060\066\132\060\134\061\013\060\011\006\003\125\004\006 -\023\002\112\120\061\046\060\044\006\003\125\004\012\023\035\123 -\105\103\117\115\040\124\162\165\163\164\040\123\171\163\164\145 -\155\163\040\103\157\056\054\040\114\164\144\056\061\045\060\043 -\006\003\125\004\003\023\034\123\105\103\117\115\040\123\115\111 -\115\105\040\122\123\101\040\122\157\157\164\040\103\101\040\062 -\060\062\064\060\202\002\042\060\015\006\011\052\206\110\206\367 -\015\001\001\001\005\000\003\202\002\017\000\060\202\002\012\002 -\202\002\001\000\301\312\336\306\344\326\154\327\326\170\031\114 -\105\145\246\144\314\126\243\202\175\214\212\325\211\332\015\345 -\357\140\077\143\221\372\360\007\033\147\266\077\301\300\356\202 -\031\226\121\311\053\102\156\376\123\107\212\242\346\206\027\325 -\312\247\266\077\111\010\320\310\375\175\052\072\056\305\013\152 -\226\204\104\114\213\335\010\124\033\263\002\247\103\024\104\135 -\157\062\074\061\202\121\304\342\301\206\375\334\170\172\270\345 -\070\160\233\324\116\037\024\262\057\352\013\032\166\144\050\211 -\047\253\162\171\310\341\135\017\274\026\255\126\312\243\232\040 -\122\120\252\037\062\270\124\133\171\350\374\165\070\240\300\357 -\106\362\313\007\203\121\057\271\172\105\273\221\345\367\034\074 -\302\315\174\307\005\150\324\322\210\306\310\226\231\055\014\005 -\163\314\060\007\220\166\341\003\060\025\165\001\136\320\163\150 -\172\251\020\213\322\106\353\176\057\112\126\145\003\050\213\117 -\031\360\211\175\131\371\370\034\155\177\331\341\331\231\212\304 -\104\226\274\043\044\103\311\161\373\115\151\232\101\045\250\362 -\142\264\235\356\274\020\063\070\067\277\043\013\164\314\276\063 -\060\207\054\032\263\054\200\277\236\264\104\375\316\351\040\130 -\233\031\204\347\150\270\161\177\131\242\322\012\017\252\007\310 -\143\026\334\300\363\014\216\223\321\124\355\201\006\056\115\203 -\015\104\254\115\061\105\356\165\273\114\106\056\255\245\305\037 -\211\242\044\142\223\333\206\072\262\164\242\330\072\103\354\146 -\344\024\221\030\274\014\063\017\214\107\225\011\006\371\320\376 -\227\156\066\062\013\342\140\361\306\163\135\040\367\206\251\033 -\150\361\165\045\131\242\253\276\147\060\247\262\263\303\156\370 -\242\110\163\207\161\216\015\312\134\043\265\221\165\353\257\013 -\263\114\170\360\227\164\351\124\056\336\100\227\252\246\343\173 -\130\366\244\355\016\120\240\371\176\240\056\064\014\127\001\370 -\376\302\370\301\267\254\301\343\363\254\151\305\144\126\262\255 -\320\100\271\333\233\165\046\061\050\367\152\160\123\270\165\022 -\275\025\142\160\036\337\020\107\242\165\147\140\325\137\162\154 -\201\315\344\111\275\156\365\020\013\301\301\135\220\317\323\023 -\155\342\312\103\002\003\001\000\001\243\143\060\141\060\035\006 -\003\125\035\016\004\026\004\024\173\341\234\250\066\034\107\244 -\004\373\001\202\157\272\161\101\065\034\060\260\060\037\006\003 -\125\035\043\004\030\060\026\200\024\173\341\234\250\066\034\107 -\244\004\373\001\202\157\272\161\101\065\034\060\260\060\016\006 -\003\125\035\017\001\001\377\004\004\003\002\001\006\060\017\006 -\003\125\035\023\001\001\377\004\005\060\003\001\001\377\060\015 -\006\011\052\206\110\206\367\015\001\001\014\005\000\003\202\002 -\001\000\264\266\325\373\106\055\356\273\274\174\332\064\357\344 -\260\131\050\312\106\144\274\042\345\010\226\341\032\033\366\044 -\316\331\131\140\142\315\033\252\132\014\174\270\174\164\133\342 -\204\074\044\270\147\167\230\034\156\150\341\152\244\265\265\063 -\222\230\005\171\036\011\272\130\321\352\202\127\124\165\034\144 -\313\101\240\216\241\174\002\104\173\271\250\147\072\172\122\116 -\072\273\201\177\305\145\364\323\032\145\357\120\375\200\237\115 -\011\222\132\001\133\251\247\060\120\200\152\226\177\122\114\034 -\077\146\345\044\224\302\031\252\004\050\237\303\026\060\316\364 -\163\327\264\316\076\317\027\033\072\141\240\166\040\076\012\113 -\063\335\271\330\101\173\224\243\174\266\014\121\244\122\206\233 -\131\116\173\340\332\366\121\304\042\376\045\271\071\152\275\146 -\323\125\236\122\246\141\175\113\054\314\037\256\061\152\364\075 -\230\017\100\003\073\254\146\141\067\337\373\041\223\201\332\324 -\041\027\035\227\021\373\250\216\262\175\202\174\136\326\173\102 -\241\251\033\223\355\042\072\355\224\220\173\367\136\131\073\376 -\165\034\126\205\367\210\113\100\155\251\070\126\041\256\345\025 -\033\102\131\237\377\314\006\073\066\233\121\067\177\130\062\303 -\136\153\230\001\035\301\273\114\022\164\017\152\100\015\117\102 -\062\212\356\072\175\223\250\344\370\041\106\254\140\161\361\115 -\151\046\072\175\365\342\070\102\207\113\372\273\202\124\336\353 -\116\170\310\246\153\332\236\241\254\200\233\111\375\046\276\302 -\027\270\115\250\010\150\031\102\372\305\101\017\030\343\356\010 -\330\037\043\207\020\316\325\361\010\071\103\247\367\353\143\010 -\067\141\077\173\336\203\045\265\134\162\125\357\333\060\072\023 -\325\231\113\107\261\200\276\317\177\200\331\024\014\273\340\234 -\372\011\213\015\001\042\071\154\354\135\304\226\260\055\044\065 -\021\340\005\175\102\151\167\052\101\036\241\305\154\371\275\321 -\046\240\360\255\103\170\213\326\240\134\322\226\001\345\335\354 -\356\310\117\346\140\124\113\014\020\207\207\345\313\167\147\132 -\002\326\221\126\213\356\032\235\346\034\016\366\344\033\000\101 -\240\124\034\056\217\336\322\247\166\147\341\343\237\350\157\007 -\044\244 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "SECOM SMIME RSA Root CA 2024" -# Issuer: CN=SECOM SMIME RSA Root CA 2024,O="SECOM Trust Systems Co., Ltd.",C=JP -# Serial Number:00:dd:a9:db:9e:7e:bc:d4:6d -# Subject: CN=SECOM SMIME RSA Root CA 2024,O="SECOM Trust Systems Co., Ltd.",C=JP -# Not Valid Before: Wed Jan 31 06:23:06 2024 -# Not Valid After : Thu Jan 14 06:23:06 2049 -# Fingerprint (SHA-256): 36:29:E7:18:8E:00:A7:CB:32:32:C4:42:6B:C8:49:12:F1:21:8B:1A:9A:E6:76:C0:B0:AB:E1:DB:FE:21:82:B5 -# Fingerprint (SHA1): 90:A5:E1:BD:C5:3F:69:08:C2:E3:73:9F:E7:55:E3:7F:75:F3:84:47 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "SECOM SMIME RSA Root CA 2024" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\220\245\341\275\305\077\151\010\302\343\163\237\347\125\343\177 -\165\363\204\107 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\241\313\205\021\231\325\204\012\342\151\245\257\066\061\142\220 -END -CKA_ISSUER MULTILINE_OCTAL -\060\134\061\013\060\011\006\003\125\004\006\023\002\112\120\061 -\046\060\044\006\003\125\004\012\023\035\123\105\103\117\115\040 -\124\162\165\163\164\040\123\171\163\164\145\155\163\040\103\157 -\056\054\040\114\164\144\056\061\045\060\043\006\003\125\004\003 -\023\034\123\105\103\117\115\040\123\115\111\115\105\040\122\123 -\101\040\122\157\157\164\040\103\101\040\062\060\062\064 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\011\000\335\251\333\236\176\274\324\155 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Telia EC Email Root CA v3" -# -# Issuer: CN=Telia EC Email Root CA v3,O=Telia Company AB,C=SE -# Serial Number:01:8b:d2:e1:0c:1e:d8:0d:94:03:87:05:11:00:a6 -# Subject: CN=Telia EC Email Root CA v3,O=Telia Company AB,C=SE -# Not Valid Before: Wed Nov 15 12:14:14 2023 -# Not Valid After : Sat May 23 11:00:00 2048 -# Fingerprint (SHA-256): 36:82:22:8D:7D:67:8B:57:14:40:CF:1C:B3:4E:69:FB:41:35:FD:6C:2A:1B:E3:8E:14:16:3B:71:1E:02:AE:01 -# Fingerprint (SHA1): 33:EA:1C:7E:79:CF:31:66:FD:B9:FA:32:47:73:FB:B7:89:01:00:4F -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Telia EC Email Root CA v3" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\114\061\013\060\011\006\003\125\004\006\023\002\123\105\061 -\031\060\027\006\003\125\004\012\014\020\124\145\154\151\141\040 -\103\157\155\160\141\156\171\040\101\102\061\042\060\040\006\003 -\125\004\003\014\031\124\145\154\151\141\040\105\103\040\105\155 -\141\151\154\040\122\157\157\164\040\103\101\040\166\063 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\114\061\013\060\011\006\003\125\004\006\023\002\123\105\061 -\031\060\027\006\003\125\004\012\014\020\124\145\154\151\141\040 -\103\157\155\160\141\156\171\040\101\102\061\042\060\040\006\003 -\125\004\003\014\031\124\145\154\151\141\040\105\103\040\105\155 -\141\151\154\040\122\157\157\164\040\103\101\040\166\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\017\001\213\322\341\014\036\330\015\224\003\207\005\021\000 -\246 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\065\060\202\001\273\240\003\002\001\002\002\017\001 -\213\322\341\014\036\330\015\224\003\207\005\021\000\246\060\012 -\006\010\052\206\110\316\075\004\003\003\060\114\061\013\060\011 -\006\003\125\004\006\023\002\123\105\061\031\060\027\006\003\125 -\004\012\014\020\124\145\154\151\141\040\103\157\155\160\141\156 -\171\040\101\102\061\042\060\040\006\003\125\004\003\014\031\124 -\145\154\151\141\040\105\103\040\105\155\141\151\154\040\122\157 -\157\164\040\103\101\040\166\063\060\036\027\015\062\063\061\061 -\061\065\061\062\061\064\061\064\132\027\015\064\070\060\065\062 -\063\061\061\060\060\060\060\132\060\114\061\013\060\011\006\003 -\125\004\006\023\002\123\105\061\031\060\027\006\003\125\004\012 -\014\020\124\145\154\151\141\040\103\157\155\160\141\156\171\040 -\101\102\061\042\060\040\006\003\125\004\003\014\031\124\145\154 -\151\141\040\105\103\040\105\155\141\151\154\040\122\157\157\164 -\040\103\101\040\166\063\060\166\060\020\006\007\052\206\110\316 -\075\002\001\006\005\053\201\004\000\042\003\142\000\004\224\000 -\346\143\237\026\057\244\370\272\105\045\315\107\053\127\234\131 -\056\207\302\136\363\043\105\231\305\224\256\133\152\302\066\063 -\336\154\267\322\310\274\020\202\351\106\247\016\253\144\015\114 -\056\245\005\347\315\273\064\142\130\251\307\272\334\101\140\052 -\107\031\266\257\036\373\221\221\260\265\234\345\232\127\174\030 -\230\037\222\153\110\262\262\014\011\137\235\341\201\030\243\143 -\060\141\060\037\006\003\125\035\043\004\030\060\026\200\024\056 -\321\321\037\117\251\046\255\246\255\041\230\105\373\023\034\123 -\002\257\346\060\035\006\003\125\035\016\004\026\004\024\056\321 -\321\037\117\251\046\255\246\255\041\230\105\373\023\034\123\002 -\257\346\060\016\006\003\125\035\017\001\001\377\004\004\003\002 -\001\006\060\017\006\003\125\035\023\001\001\377\004\005\060\003 -\001\001\377\060\012\006\010\052\206\110\316\075\004\003\003\003 -\150\000\060\145\002\061\000\353\252\152\365\014\257\201\003\016 -\252\222\077\357\053\033\013\263\264\324\230\330\367\225\244\035 -\252\274\266\277\346\122\230\013\170\134\017\017\243\306\243\151 -\302\275\120\326\157\172\177\002\060\074\035\354\172\365\211\203 -\077\041\351\260\325\170\372\333\120\363\164\007\314\171\247\045 -\362\366\214\070\207\331\266\154\102\364\162\111\114\326\273\135 -\114\256\036\366\372\221\132\052\113 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Telia EC Email Root CA v3" -# Issuer: CN=Telia EC Email Root CA v3,O=Telia Company AB,C=SE -# Serial Number:01:8b:d2:e1:0c:1e:d8:0d:94:03:87:05:11:00:a6 -# Subject: CN=Telia EC Email Root CA v3,O=Telia Company AB,C=SE -# Not Valid Before: Wed Nov 15 12:14:14 2023 -# Not Valid After : Sat May 23 11:00:00 2048 -# Fingerprint (SHA-256): 36:82:22:8D:7D:67:8B:57:14:40:CF:1C:B3:4E:69:FB:41:35:FD:6C:2A:1B:E3:8E:14:16:3B:71:1E:02:AE:01 -# Fingerprint (SHA1): 33:EA:1C:7E:79:CF:31:66:FD:B9:FA:32:47:73:FB:B7:89:01:00:4F -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Telia EC Email Root CA v3" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\063\352\034\176\171\317\061\146\375\271\372\062\107\163\373\267 -\211\001\000\117 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\327\203\306\202\162\144\010\353\243\270\127\205\010\236\106\231 -END -CKA_ISSUER MULTILINE_OCTAL -\060\114\061\013\060\011\006\003\125\004\006\023\002\123\105\061 -\031\060\027\006\003\125\004\012\014\020\124\145\154\151\141\040 -\103\157\155\160\141\156\171\040\101\102\061\042\060\040\006\003 -\125\004\003\014\031\124\145\154\151\141\040\105\103\040\105\155 -\141\151\154\040\122\157\157\164\040\103\101\040\166\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\017\001\213\322\341\014\036\330\015\224\003\207\005\021\000 -\246 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Telia EC TLS Root CA v3" -# -# Issuer: CN=Telia EC TLS Root CA v3,O=Telia Company AB,C=SE -# Serial Number:01:8b:d2:22:54:63:4d:04:8b:6c:e5:47:1f:d2:b5 -# Subject: CN=Telia EC TLS Root CA v3,O=Telia Company AB,C=SE -# Not Valid Before: Wed Nov 15 08:55:26 2023 -# Not Valid After : Sat May 23 11:00:00 2048 -# Fingerprint (SHA-256): 09:8E:08:A9:1D:BB:F7:74:78:B9:6C:CE:B8:9B:14:13:A5:DA:37:B7:C8:62:60:6A:95:5D:EB:07:17:9F:43:26 -# Fingerprint (SHA1): B4:D6:07:C2:A5:95:BC:5B:F4:67:4D:C9:DC:6F:6F:0A:00:7A:A5:35 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Telia EC TLS Root CA v3" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\112\061\013\060\011\006\003\125\004\006\023\002\123\105\061 -\031\060\027\006\003\125\004\012\014\020\124\145\154\151\141\040 -\103\157\155\160\141\156\171\040\101\102\061\040\060\036\006\003 -\125\004\003\014\027\124\145\154\151\141\040\105\103\040\124\114 -\123\040\122\157\157\164\040\103\101\040\166\063 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\112\061\013\060\011\006\003\125\004\006\023\002\123\105\061 -\031\060\027\006\003\125\004\012\014\020\124\145\154\151\141\040 -\103\157\155\160\141\156\171\040\101\102\061\040\060\036\006\003 -\125\004\003\014\027\124\145\154\151\141\040\105\103\040\124\114 -\123\040\122\157\157\164\040\103\101\040\166\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\017\001\213\322\042\124\143\115\004\213\154\345\107\037\322 -\265 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\062\060\202\001\267\240\003\002\001\002\002\017\001 -\213\322\042\124\143\115\004\213\154\345\107\037\322\265\060\012 -\006\010\052\206\110\316\075\004\003\003\060\112\061\013\060\011 -\006\003\125\004\006\023\002\123\105\061\031\060\027\006\003\125 -\004\012\014\020\124\145\154\151\141\040\103\157\155\160\141\156 -\171\040\101\102\061\040\060\036\006\003\125\004\003\014\027\124 -\145\154\151\141\040\105\103\040\124\114\123\040\122\157\157\164 -\040\103\101\040\166\063\060\036\027\015\062\063\061\061\061\065 -\060\070\065\065\062\066\132\027\015\064\070\060\065\062\063\061 -\061\060\060\060\060\132\060\112\061\013\060\011\006\003\125\004 -\006\023\002\123\105\061\031\060\027\006\003\125\004\012\014\020 -\124\145\154\151\141\040\103\157\155\160\141\156\171\040\101\102 -\061\040\060\036\006\003\125\004\003\014\027\124\145\154\151\141 -\040\105\103\040\124\114\123\040\122\157\157\164\040\103\101\040 -\166\063\060\166\060\020\006\007\052\206\110\316\075\002\001\006 -\005\053\201\004\000\042\003\142\000\004\301\310\226\025\103\055 -\271\205\051\112\126\322\042\270\166\232\362\117\247\246\140\347 -\222\337\122\117\301\151\326\076\151\026\106\260\044\115\263\327 -\343\113\020\174\162\075\232\224\173\105\271\055\273\171\340\203 -\245\276\004\024\227\111\347\041\264\300\247\006\145\227\217\361 -\032\126\131\225\345\306\065\214\075\207\241\067\341\005\015\300 -\151\312\102\064\302\311\053\203\151\145\243\143\060\141\060\037 -\006\003\125\035\043\004\030\060\026\200\024\324\144\350\103\210 -\072\163\057\320\032\161\202\066\013\136\205\336\307\336\103\060 -\035\006\003\125\035\016\004\026\004\024\324\144\350\103\210\072 -\163\057\320\032\161\202\066\013\136\205\336\307\336\103\060\016 -\006\003\125\035\017\001\001\377\004\004\003\002\001\006\060\017 -\006\003\125\035\023\001\001\377\004\005\060\003\001\001\377\060 -\012\006\010\052\206\110\316\075\004\003\003\003\151\000\060\146 -\002\061\000\227\001\107\122\377\326\333\047\300\065\045\206\206 -\177\366\326\267\373\073\115\255\050\267\225\045\236\217\016\215 -\043\130\105\144\010\225\056\055\125\151\135\275\060\025\003\270 -\136\070\130\002\061\000\257\052\277\076\147\144\147\370\340\153 -\345\101\363\226\000\116\156\226\235\324\273\260\065\064\134\164 -\330\024\047\022\026\151\327\044\213\345\001\054\110\265\374\005 -\021\051\136\146\167\143 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Telia EC TLS Root CA v3" -# Issuer: CN=Telia EC TLS Root CA v3,O=Telia Company AB,C=SE -# Serial Number:01:8b:d2:22:54:63:4d:04:8b:6c:e5:47:1f:d2:b5 -# Subject: CN=Telia EC TLS Root CA v3,O=Telia Company AB,C=SE -# Not Valid Before: Wed Nov 15 08:55:26 2023 -# Not Valid After : Sat May 23 11:00:00 2048 -# Fingerprint (SHA-256): 09:8E:08:A9:1D:BB:F7:74:78:B9:6C:CE:B8:9B:14:13:A5:DA:37:B7:C8:62:60:6A:95:5D:EB:07:17:9F:43:26 -# Fingerprint (SHA1): B4:D6:07:C2:A5:95:BC:5B:F4:67:4D:C9:DC:6F:6F:0A:00:7A:A5:35 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Telia EC TLS Root CA v3" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\264\326\007\302\245\225\274\133\364\147\115\311\334\157\157\012 -\000\172\245\065 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\266\372\152\134\102\373\305\147\162\300\340\057\162\373\132\104 -END -CKA_ISSUER MULTILINE_OCTAL -\060\112\061\013\060\011\006\003\125\004\006\023\002\123\105\061 -\031\060\027\006\003\125\004\012\014\020\124\145\154\151\141\040 -\103\157\155\160\141\156\171\040\101\102\061\040\060\036\006\003 -\125\004\003\014\027\124\145\154\151\141\040\105\103\040\124\114 -\123\040\122\157\157\164\040\103\101\040\166\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\017\001\213\322\042\124\143\115\004\213\154\345\107\037\322 -\265 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Telia RSA Email Root CA v3" -# -# Issuer: CN=Telia RSA Email Root CA v3,O=Telia Company AB,C=SE -# Serial Number:01:8b:d2:ce:f4:c1:15:78:29:62:4d:79:b2:75:5b -# Subject: CN=Telia RSA Email Root CA v3,O=Telia Company AB,C=SE -# Not Valid Before: Wed Nov 15 11:55:02 2023 -# Not Valid After : Sat May 23 11:00:00 2048 -# Fingerprint (SHA-256): 5B:0C:50:2A:7D:96:3B:A5:52:17:39:6F:DA:9B:3D:C7:81:71:00:0A:EE:FF:42:CE:CC:3A:20:A7:93:81:63:E8 -# Fingerprint (SHA1): AA:6C:3C:AF:F0:96:C6:4D:C3:27:84:BE:9D:8A:3E:3A:7B:B4:4E:C2 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Telia RSA Email Root CA v3" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\115\061\013\060\011\006\003\125\004\006\023\002\123\105\061 -\031\060\027\006\003\125\004\012\014\020\124\145\154\151\141\040 -\103\157\155\160\141\156\171\040\101\102\061\043\060\041\006\003 -\125\004\003\014\032\124\145\154\151\141\040\122\123\101\040\105 -\155\141\151\154\040\122\157\157\164\040\103\101\040\166\063 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\115\061\013\060\011\006\003\125\004\006\023\002\123\105\061 -\031\060\027\006\003\125\004\012\014\020\124\145\154\151\141\040 -\103\157\155\160\141\156\171\040\101\102\061\043\060\041\006\003 -\125\004\003\014\032\124\145\154\151\141\040\122\123\101\040\105 -\155\141\151\154\040\122\157\157\164\040\103\101\040\166\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\017\001\213\322\316\364\301\025\170\051\142\115\171\262\165 -\133 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\206\060\202\003\156\240\003\002\001\002\002\017\001 -\213\322\316\364\301\025\170\051\142\115\171\262\165\133\060\015 -\006\011\052\206\110\206\367\015\001\001\014\005\000\060\115\061 -\013\060\011\006\003\125\004\006\023\002\123\105\061\031\060\027 -\006\003\125\004\012\014\020\124\145\154\151\141\040\103\157\155 -\160\141\156\171\040\101\102\061\043\060\041\006\003\125\004\003 -\014\032\124\145\154\151\141\040\122\123\101\040\105\155\141\151 -\154\040\122\157\157\164\040\103\101\040\166\063\060\036\027\015 -\062\063\061\061\061\065\061\061\065\065\060\062\132\027\015\064 -\070\060\065\062\063\061\061\060\060\060\060\132\060\115\061\013 -\060\011\006\003\125\004\006\023\002\123\105\061\031\060\027\006 -\003\125\004\012\014\020\124\145\154\151\141\040\103\157\155\160 -\141\156\171\040\101\102\061\043\060\041\006\003\125\004\003\014 -\032\124\145\154\151\141\040\122\123\101\040\105\155\141\151\154 -\040\122\157\157\164\040\103\101\040\166\063\060\202\002\042\060 -\015\006\011\052\206\110\206\367\015\001\001\001\005\000\003\202 -\002\017\000\060\202\002\012\002\202\002\001\000\271\111\073\057 -\133\122\030\311\317\144\254\250\333\366\172\236\076\255\327\201 -\243\354\272\352\201\056\365\275\257\225\321\113\136\210\356\224 -\142\012\313\206\047\011\250\047\321\303\062\243\012\352\356\027 -\145\014\074\023\026\372\337\004\323\153\317\140\212\066\133\367 -\047\226\061\334\333\367\307\156\025\021\272\143\051\273\320\211 -\160\154\343\110\242\064\231\310\372\112\222\217\260\176\222\056 -\354\246\164\371\321\052\234\163\302\162\053\124\217\011\170\173 -\357\046\014\076\362\174\072\021\135\041\007\325\317\276\136\043 -\210\240\053\005\302\214\277\051\277\130\105\074\361\152\310\253 -\364\376\071\376\262\156\025\132\017\247\113\076\151\304\273\073 -\321\222\240\330\137\050\201\302\275\112\226\245\241\106\161\370 -\015\261\021\143\152\246\001\137\305\163\172\330\111\112\056\301 -\064\276\077\145\336\302\152\306\217\040\330\276\046\002\272\307 -\162\042\026\230\231\227\346\144\155\111\070\220\312\324\161\006 -\264\204\042\264\236\063\064\126\312\035\166\251\232\110\335\314 -\365\217\056\211\111\306\172\006\003\217\257\216\354\200\162\025 -\361\331\011\200\130\122\251\302\034\255\076\137\067\061\146\227 -\020\241\330\163\264\335\056\302\063\245\176\247\130\233\201\021 -\153\210\325\374\113\265\055\272\176\374\121\255\347\076\115\256 -\363\316\121\236\345\123\213\257\036\250\102\344\145\271\362\346 -\052\103\347\117\074\365\333\321\334\273\240\337\027\330\341\276 -\122\131\147\076\041\024\072\203\131\176\157\203\331\225\153\061 -\171\143\216\311\135\324\064\215\370\344\332\056\256\331\010\353 -\333\263\034\351\335\225\030\256\142\233\065\200\105\357\322\224 -\240\326\013\340\242\311\040\100\063\265\113\173\230\066\144\064 -\227\324\213\003\267\172\212\233\147\052\225\223\143\263\362\362 -\037\024\054\021\250\321\146\014\332\106\346\014\336\125\272\107 -\043\306\352\017\262\103\135\216\376\017\127\324\257\347\312\070 -\313\326\333\231\273\112\130\266\150\241\324\212\045\162\252\233 -\015\100\072\246\241\243\036\267\132\055\241\347\240\071\217\306 -\104\324\240\166\137\210\074\377\345\045\120\214\356\074\176\022 -\066\075\262\136\045\107\066\151\231\024\041\137\002\003\001\000 -\001\243\143\060\141\060\037\006\003\125\035\043\004\030\060\026 -\200\024\207\271\006\077\106\305\051\024\315\024\136\305\236\043 -\220\266\044\256\146\231\060\035\006\003\125\035\016\004\026\004 -\024\207\271\006\077\106\305\051\024\315\024\136\305\236\043\220 -\266\044\256\146\231\060\016\006\003\125\035\017\001\001\377\004 -\004\003\002\001\006\060\017\006\003\125\035\023\001\001\377\004 -\005\060\003\001\001\377\060\015\006\011\052\206\110\206\367\015 -\001\001\014\005\000\003\202\002\001\000\215\123\131\331\377\073 -\062\217\327\061\076\355\166\235\015\206\215\342\060\120\160\270 -\235\331\237\022\071\313\235\257\265\256\303\207\341\153\304\355 -\203\020\274\105\172\266\231\360\264\171\174\155\065\243\223\220 -\054\060\206\261\377\205\327\214\145\127\130\222\007\110\354\107 -\230\267\347\166\306\167\140\377\107\354\167\100\255\034\055\352 -\337\122\314\222\176\245\333\053\107\365\033\247\107\100\135\161 -\163\110\304\323\375\247\260\043\100\261\043\273\353\332\201\100 -\305\062\007\331\051\311\023\006\266\030\226\127\131\213\140\001 -\257\357\014\230\112\113\246\026\242\241\043\103\254\125\151\114 -\061\137\373\141\274\053\263\305\002\061\265\124\077\165\031\253 -\135\074\076\144\305\343\353\360\177\262\212\272\057\004\062\073 -\362\003\336\052\273\302\011\342\243\045\363\115\056\206\170\126 -\330\074\107\055\144\255\372\001\171\260\330\210\116\353\262\301 -\132\345\113\272\066\304\031\102\353\233\056\014\015\244\370\273 -\332\044\036\000\234\356\112\043\321\241\264\242\317\135\047\252 -\102\123\203\042\204\024\227\050\134\227\171\246\140\274\207\066 -\231\370\303\027\150\342\272\145\363\016\312\066\327\323\044\074 -\301\011\211\356\373\023\271\103\250\051\024\305\273\101\107\264 -\366\112\275\333\107\042\317\367\243\332\060\126\306\175\230\145 -\045\151\120\140\152\365\372\265\277\214\170\033\167\255\271\135 -\316\327\227\151\156\356\011\346\337\226\167\273\006\223\252\123 -\241\234\331\053\273\336\073\231\042\004\251\274\024\366\075\003 -\242\363\065\224\074\116\037\142\276\360\262\347\130\271\323\027 -\051\305\253\016\325\113\145\106\031\133\044\072\142\111\044\005 -\212\300\170\367\024\224\321\257\013\037\067\154\064\005\316\147 -\361\166\300\367\254\144\110\326\127\232\050\363\027\117\232\367 -\003\264\040\021\142\237\377\032\252\151\063\141\050\176\075\366 -\304\150\027\314\063\071\303\316\122\341\366\262\273\125\134\146 -\155\237\341\074\256\246\016\025\115\106\361\326\004\015\205\226 -\263\137\050\024\117\316\326\233\341\372\015\163\154\157\247\375 -\271\351\052\244\267\100\114\160\016\070\117\033\254\307\165\050 -\170\251\167\066\232\150\164\240\327\267 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Telia RSA Email Root CA v3" -# Issuer: CN=Telia RSA Email Root CA v3,O=Telia Company AB,C=SE -# Serial Number:01:8b:d2:ce:f4:c1:15:78:29:62:4d:79:b2:75:5b -# Subject: CN=Telia RSA Email Root CA v3,O=Telia Company AB,C=SE -# Not Valid Before: Wed Nov 15 11:55:02 2023 -# Not Valid After : Sat May 23 11:00:00 2048 -# Fingerprint (SHA-256): 5B:0C:50:2A:7D:96:3B:A5:52:17:39:6F:DA:9B:3D:C7:81:71:00:0A:EE:FF:42:CE:CC:3A:20:A7:93:81:63:E8 -# Fingerprint (SHA1): AA:6C:3C:AF:F0:96:C6:4D:C3:27:84:BE:9D:8A:3E:3A:7B:B4:4E:C2 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Telia RSA Email Root CA v3" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\252\154\074\257\360\226\306\115\303\047\204\276\235\212\076\072 -\173\264\116\302 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\173\170\307\204\252\212\256\263\377\237\272\146\072\007\164\361 -END -CKA_ISSUER MULTILINE_OCTAL -\060\115\061\013\060\011\006\003\125\004\006\023\002\123\105\061 -\031\060\027\006\003\125\004\012\014\020\124\145\154\151\141\040 -\103\157\155\160\141\156\171\040\101\102\061\043\060\041\006\003 -\125\004\003\014\032\124\145\154\151\141\040\122\123\101\040\105 -\155\141\151\154\040\122\157\157\164\040\103\101\040\166\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\017\001\213\322\316\364\301\025\170\051\142\115\171\262\165 -\133 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Telia RSA TLS Root CA v3" -# -# Issuer: CN=Telia RSA TLS Root CA v3,O=Telia Company AB,C=SE -# Serial Number:01:8b:d2:50:ab:42:55:2c:47:5a:bd:a1:dc:1a:c5 -# Subject: CN=Telia RSA TLS Root CA v3,O=Telia Company AB,C=SE -# Not Valid Before: Wed Nov 15 09:47:42 2023 -# Not Valid After : Sat May 23 11:00:00 2048 -# Fingerprint (SHA-256): D1:3D:B1:29:4C:45:EB:C6:FC:86:C6:BB:F6:9F:A2:9B:DF:E6:92:DF:F7:C7:13:C2:43:C7:A9:56:C6:A2:28:4C -# Fingerprint (SHA1): B5:2E:88:4E:40:C1:11:FB:50:C7:E2:4F:AC:18:2B:BD:68:15:D2:34 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Telia RSA TLS Root CA v3" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\113\061\013\060\011\006\003\125\004\006\023\002\123\105\061 -\031\060\027\006\003\125\004\012\014\020\124\145\154\151\141\040 -\103\157\155\160\141\156\171\040\101\102\061\041\060\037\006\003 -\125\004\003\014\030\124\145\154\151\141\040\122\123\101\040\124 -\114\123\040\122\157\157\164\040\103\101\040\166\063 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\113\061\013\060\011\006\003\125\004\006\023\002\123\105\061 -\031\060\027\006\003\125\004\012\014\020\124\145\154\151\141\040 -\103\157\155\160\141\156\171\040\101\102\061\041\060\037\006\003 -\125\004\003\014\030\124\145\154\151\141\040\122\123\101\040\124 -\114\123\040\122\157\157\164\040\103\101\040\166\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\017\001\213\322\120\253\102\125\054\107\132\275\241\334\032 -\305 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\202\060\202\003\152\240\003\002\001\002\002\017\001 -\213\322\120\253\102\125\054\107\132\275\241\334\032\305\060\015 -\006\011\052\206\110\206\367\015\001\001\014\005\000\060\113\061 -\013\060\011\006\003\125\004\006\023\002\123\105\061\031\060\027 -\006\003\125\004\012\014\020\124\145\154\151\141\040\103\157\155 -\160\141\156\171\040\101\102\061\041\060\037\006\003\125\004\003 -\014\030\124\145\154\151\141\040\122\123\101\040\124\114\123\040 -\122\157\157\164\040\103\101\040\166\063\060\036\027\015\062\063 -\061\061\061\065\060\071\064\067\064\062\132\027\015\064\070\060 -\065\062\063\061\061\060\060\060\060\132\060\113\061\013\060\011 -\006\003\125\004\006\023\002\123\105\061\031\060\027\006\003\125 -\004\012\014\020\124\145\154\151\141\040\103\157\155\160\141\156 -\171\040\101\102\061\041\060\037\006\003\125\004\003\014\030\124 -\145\154\151\141\040\122\123\101\040\124\114\123\040\122\157\157 -\164\040\103\101\040\166\063\060\202\002\042\060\015\006\011\052 -\206\110\206\367\015\001\001\001\005\000\003\202\002\017\000\060 -\202\002\012\002\202\002\001\000\261\137\075\050\155\175\204\047 -\370\113\121\157\223\300\367\117\040\304\106\031\234\277\037\005 -\354\251\233\341\140\023\307\170\243\173\130\235\334\241\361\104 -\115\023\052\147\015\011\260\020\347\266\357\034\121\030\153\210 -\121\332\135\264\126\065\132\164\114\152\071\157\266\225\337\175 -\061\261\042\073\350\321\124\354\376\005\274\113\304\231\346\033 -\000\252\043\340\137\271\070\343\125\027\203\306\314\143\102\370 -\340\006\300\245\150\357\354\233\230\273\322\171\131\161\141\221 -\264\211\057\130\062\267\064\331\023\345\033\160\135\317\316\360 -\324\305\126\226\324\251\076\234\106\062\043\336\211\100\156\124 -\176\225\027\370\025\374\271\243\344\075\175\246\343\142\177\131 -\365\056\042\266\273\204\225\301\005\177\322\343\223\267\360\165 -\074\234\117\372\357\045\157\160\374\035\306\331\255\353\321\377 -\363\134\323\225\256\342\001\162\241\072\246\104\250\262\220\002 -\123\146\306\343\147\330\052\266\314\374\145\247\247\273\276\247 -\321\153\317\210\332\067\012\133\341\201\356\021\344\274\006\266 -\255\065\303\374\137\255\243\134\213\357\050\174\145\260\300\311 -\012\166\370\123\302\163\024\342\354\123\251\250\205\126\071\360 -\027\131\256\370\264\032\117\124\072\352\246\202\201\272\166\311 -\007\242\113\043\145\071\112\353\120\377\042\174\346\022\200\065 -\310\006\011\024\065\162\262\064\161\015\103\256\365\300\060\000 -\326\352\232\256\373\130\201\113\350\032\147\146\005\152\076\323 -\037\033\254\015\360\032\323\051\326\251\276\051\125\261\204\171 -\364\021\140\042\300\025\004\314\153\032\037\226\371\007\057\230 -\226\237\122\220\022\276\120\053\052\365\106\330\122\070\213\243 -\342\056\064\201\117\117\272\027\241\020\056\266\052\171\363\220 -\027\367\301\064\105\333\372\170\324\103\104\224\126\260\052\264 -\176\030\370\350\302\043\366\270\374\222\120\246\234\136\172\146 -\134\103\104\224\112\030\042\043\220\014\347\021\316\346\054\232 -\122\264\343\140\176\063\305\114\375\217\355\105\021\260\307\377 -\032\154\266\275\140\134\034\244\262\233\251\372\024\123\150\227 -\033\003\345\033\244\232\255\131\231\335\000\367\135\046\153\172 -\140\224\076\165\115\351\016\357\002\003\001\000\001\243\143\060 -\141\060\037\006\003\125\035\043\004\030\060\026\200\024\260\307 -\251\322\335\262\050\126\163\004\224\214\024\134\110\157\067\122 -\222\250\060\035\006\003\125\035\016\004\026\004\024\260\307\251 -\322\335\262\050\126\163\004\224\214\024\134\110\157\067\122\222 -\250\060\016\006\003\125\035\017\001\001\377\004\004\003\002\001 -\006\060\017\006\003\125\035\023\001\001\377\004\005\060\003\001 -\001\377\060\015\006\011\052\206\110\206\367\015\001\001\014\005 -\000\003\202\002\001\000\135\143\061\154\064\140\321\223\266\321 -\374\010\021\052\257\271\353\176\330\270\345\276\303\253\241\246 -\204\264\126\162\214\122\234\207\013\011\056\363\250\104\276\250 -\257\152\103\355\176\151\146\341\261\160\267\357\254\157\377\016 -\136\305\201\252\327\333\134\306\201\064\064\331\227\305\321\060 -\233\213\130\345\266\046\266\312\221\034\340\033\107\201\121\313 -\354\151\321\265\256\270\133\231\232\230\274\125\332\001\223\273 -\243\204\335\071\234\361\204\020\171\030\340\026\131\160\167\041 -\352\332\064\376\011\353\174\362\243\331\374\032\254\067\260\220 -\106\343\207\246\346\032\030\214\027\337\077\351\351\211\274\254 -\226\173\045\106\056\013\353\021\354\011\210\377\075\246\376\072 -\132\233\060\040\172\277\353\023\010\267\204\042\351\021\127\072 -\021\365\244\070\346\221\012\355\235\120\006\164\254\154\002\220 -\266\313\064\044\240\375\167\371\227\327\215\307\327\027\217\214 -\370\123\136\133\371\044\051\041\255\310\376\111\050\163\320\377 -\176\020\172\026\173\251\275\227\045\004\070\205\147\322\272\176 -\311\122\126\065\271\262\016\375\325\223\001\161\034\055\100\245 -\044\054\201\050\246\214\144\070\302\332\372\161\051\250\255\326 -\061\221\137\221\243\311\116\040\210\121\222\305\317\310\071\066 -\356\005\272\042\065\027\012\106\112\247\021\143\220\275\343\210 -\024\234\361\051\061\237\000\226\265\170\074\307\003\160\164\125 -\115\004\142\302\012\342\147\262\167\230\136\062\115\253\064\152 -\121\312\006\303\073\057\027\164\042\375\231\307\120\333\310\111 -\327\257\226\002\000\134\276\026\276\274\132\252\372\032\323\134 -\001\370\140\237\263\236\321\114\141\070\116\360\006\204\243\112 -\272\317\012\336\024\123\324\024\251\212\014\314\041\034\322\306 -\320\016\256\243\315\352\077\377\101\051\226\365\377\011\162\167 -\053\213\210\366\212\024\251\126\261\124\320\327\115\220\310\131 -\170\002\242\165\061\117\263\020\225\026\345\270\002\170\263\356 -\072\242\303\233\026\266\066\320\256\125\264\337\230\263\040\105 -\070\261\214\020\240\055\115\307\104\257\313\351\214\115\026\242 -\347\102\352\025\017\200\327\361\352\353\021\307\014\334\173\010 -\217\067\167\155\304\257 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Telia RSA TLS Root CA v3" -# Issuer: CN=Telia RSA TLS Root CA v3,O=Telia Company AB,C=SE -# Serial Number:01:8b:d2:50:ab:42:55:2c:47:5a:bd:a1:dc:1a:c5 -# Subject: CN=Telia RSA TLS Root CA v3,O=Telia Company AB,C=SE -# Not Valid Before: Wed Nov 15 09:47:42 2023 -# Not Valid After : Sat May 23 11:00:00 2048 -# Fingerprint (SHA-256): D1:3D:B1:29:4C:45:EB:C6:FC:86:C6:BB:F6:9F:A2:9B:DF:E6:92:DF:F7:C7:13:C2:43:C7:A9:56:C6:A2:28:4C -# Fingerprint (SHA1): B5:2E:88:4E:40:C1:11:FB:50:C7:E2:4F:AC:18:2B:BD:68:15:D2:34 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Telia RSA TLS Root CA v3" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\265\056\210\116\100\301\021\373\120\307\342\117\254\030\053\275 -\150\025\322\064 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\364\213\234\363\370\143\317\334\045\217\264\273\242\351\235\342 -END -CKA_ISSUER MULTILINE_OCTAL -\060\113\061\013\060\011\006\003\125\004\006\023\002\123\105\061 -\031\060\027\006\003\125\004\012\014\020\124\145\154\151\141\040 -\103\157\155\160\141\156\171\040\101\102\061\041\060\037\006\003 -\125\004\003\014\030\124\145\154\151\141\040\122\123\101\040\124 -\114\123\040\122\157\157\164\040\103\101\040\166\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\017\001\213\322\120\253\102\125\054\107\132\275\241\334\032 -\305 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE diff --git a/tools/checkimports.py b/tools/checkimports.py deleted file mode 100755 index ed003d8b6b9..00000000000 --- a/tools/checkimports.py +++ /dev/null @@ -1,48 +0,0 @@ -#!/usr/bin/env python - -from __future__ import print_function -import glob -import io -import re -import sys -import itertools - -def do_exist(file_name, lines, imported): - if not any(not re.match(fr'using \w+::{imported};', line) and - re.search(fr'\b{imported}\b', line) for line in lines): - print(f'File "{file_name}" does not use "{imported}"') - return False - return True - - -def is_valid(file_name): - with io.open(file_name, encoding='utf-8') as source_file: - lines = [line.strip() for line in source_file] - - usings, importeds, line_numbers, valid = [], [], [], True - for idx, line in enumerate(lines, 1): - matches = re.search(r'^using (\w+::(\w+));$', line) - if matches: - line_numbers.append(idx) - usings.append(matches.group(1)) - importeds.append(matches.group(2)) - - valid = all(do_exist(file_name, lines, imported) for imported in importeds) - - sorted_usings = sorted(usings, key=lambda x: x.lower()) - if sorted_usings != usings: - print(f"using statements aren't sorted in '{file_name}'.") - for num, actual, expected in zip(line_numbers, usings, sorted_usings): - if actual != expected: - print(f'\tLine {num}: Actual: {actual}, Expected: {expected}') - return False - return valid - -if __name__ == '__main__': - if len(sys.argv) > 1: - files = [] - for pattern in sys.argv[1:]: - files = itertools.chain(files, glob.iglob(pattern)) - else: - files = glob.iglob('src/*.cc') - sys.exit(0 if all(list(map(is_valid, files))) else 1) diff --git a/tools/clang-format/package-lock.json b/tools/clang-format/package-lock.json deleted file mode 100644 index 10ee47a7626..00000000000 --- a/tools/clang-format/package-lock.json +++ /dev/null @@ -1,319 +0,0 @@ -{ - "name": "node-core-clang-format", - "version": "1.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "node-core-clang-format", - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "clang-format": "^1.8.0" - } - }, - "node_modules/async": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", - "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==" - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/brace-expansion": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", - "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/clang-format": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.8.0.tgz", - "integrity": "sha512-pK8gzfu55/lHzIpQ1givIbWfn3eXnU7SfxqIwVgnn5jEM6j4ZJYjpFqFs4iSBPNedzRMmfjYjuQhu657WAXHXw==", - "dependencies": { - "async": "^3.2.3", - "glob": "^7.0.0", - "resolve": "^1.1.6" - }, - "bin": { - "check-clang-format": "bin/check-clang-format.js", - "clang-format": "index.js", - "git-clang-format": "bin/git-clang-format" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dependencies": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - } - }, - "dependencies": { - "async": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", - "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==" - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "brace-expansion": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", - "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "clang-format": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.8.0.tgz", - "integrity": "sha512-pK8gzfu55/lHzIpQ1givIbWfn3eXnU7SfxqIwVgnn5jEM6j4ZJYjpFqFs4iSBPNedzRMmfjYjuQhu657WAXHXw==", - "requires": { - "async": "^3.2.3", - "glob": "^7.0.0", - "resolve": "^1.1.6" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", - "requires": { - "has": "^1.0.3" - } - }, - "minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "requires": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - } - } -} diff --git a/tools/clang-format/package.json b/tools/clang-format/package.json deleted file mode 100644 index 4ae7d36a33c..00000000000 --- a/tools/clang-format/package.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "node-core-clang-format", - "version": "1.0.0", - "description": "Formatting C++ files for Node.js core", - "license": "MIT", - "dependencies": { - "clang-format": "^1.8.0" - } -} diff --git a/tools/compress_json.py b/tools/compress_json.py deleted file mode 100644 index fdb3d536cf3..00000000000 --- a/tools/compress_json.py +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env python - -import json -import struct -import sys -import zlib - -try: - xrange # Python 2 - PY2 = True -except NameError: - PY2 = False - xrange = range # Python 3 - - -if __name__ == '__main__': - with open(sys.argv[1]) as fp: - obj = json.load(fp) - text = json.dumps(obj, separators=(',', ':')).encode('utf-8') - data = zlib.compress(text, zlib.Z_BEST_COMPRESSION) - - # To make decompression a little easier, we prepend the compressed data - # with the size of the uncompressed data as a 24 bits BE unsigned integer. - assert len(text) < 1 << 24, 'Uncompressed JSON must be < 16 MiB.' - data = struct.pack('>I', len(text))[1:4] + data - - step = 20 - slices = (data[i:i+step] for i in xrange(0, len(data), step)) - slices = [','.join(str(ord(c) if PY2 else c) for c in s) for s in slices] - text = ',\n'.join(slices) - - with open(sys.argv[2], 'w') as fp: - fp.write(text) diff --git a/tools/configure.d/nodedownload.py b/tools/configure.d/nodedownload.py deleted file mode 100644 index 0d65c33606b..00000000000 --- a/tools/configure.d/nodedownload.py +++ /dev/null @@ -1,138 +0,0 @@ -#!/usr/bin/env python -# Moved some utilities here from ../../configure - -from __future__ import print_function -import hashlib -import sys -import zipfile -import tarfile -import contextlib -from urllib.request import build_opener, install_opener, urlretrieve - -def formatSize(amt): - """Format a size as a string in MB""" - return "%.1f" % (amt / 1024000.) - -def spin(c): - """print out an ASCII 'spinner' based on the value of counter 'c'""" - spin = ".:|'" - return (spin[c % len(spin)]) - -def reporthook(count, size, total): - """internal hook used by retrievefile""" - sys.stdout.write(' Fetch: %c %sMB total, %sMB downloaded \r' % - (spin(count), - formatSize(total), - formatSize(count*size))) - -def retrievefile(url, targetfile): - """fetch file 'url' as 'targetfile'. Return targetfile or throw.""" - try: - sys.stdout.write(' <%s>\nConnecting...\r' % url) - sys.stdout.flush() - opener = build_opener() - opener.addheaders = [('User-agent', f'Python-urllib/{sys.version_info.major}.{sys.version_info.minor} node.js/configure')] - install_opener(opener) - urlretrieve(url, targetfile, reporthook=reporthook) - print('') # clear the line - return targetfile - except IOError as err: - print(' ** IOError %s\n' % err) - return None - except: - print(' ** Error occurred while downloading\n <%s>' % url) - raise - -def findHash(dict): - """Find an available hash type.""" - # choose from one of these - availAlgos = hashlib.algorithms_guaranteed - for hashAlgo in availAlgos: - if hashAlgo in dict: - return (dict[hashAlgo], hashAlgo, availAlgos) - # error - return (None, None, availAlgos) - -def checkHash(targetfile, hashAlgo): - """Check a file using hashAlgo. Return the hex digest.""" - digest = hashlib.new(hashAlgo) - with open(targetfile, 'rb') as f: - chunk = f.read(1024) - while len(chunk) > 0: - digest.update(chunk) - chunk = f.read(1024) - return digest.hexdigest() - -def unpack(packedfile, parent_path): - """Unpacks packedfile into parent_path. Assumes .zip. Returns parent_path""" - if zipfile.is_zipfile(packedfile): - with contextlib.closing(zipfile.ZipFile(packedfile, 'r')) as icuzip: - print(' Extracting zipfile: %s' % packedfile) - icuzip.extractall(parent_path) - return parent_path - elif tarfile.is_tarfile(packedfile): - with contextlib.closing(tarfile.TarFile.open(packedfile, 'r')) as icuzip: - print(' Extracting tarfile: %s' % packedfile) - icuzip.extractall(parent_path) - return parent_path - else: - packedsuffix = packedfile.lower().split('.')[-1] # .zip, .tgz etc - raise Exception('Error: Don\'t know how to unpack %s with extension %s' % (packedfile, packedsuffix)) - -# List of possible "--download=" types. -download_types = set(['icu']) - -# Default options for --download. -download_default = "none" - -def help(): - """This function calculates the '--help' text for '--download'.""" - return """Select which packages may be auto-downloaded. -valid values are: none, all, %s. (default is "%s").""" % (", ".join(download_types), download_default) - -def set2dict(keys, value=None): - """Convert some keys (iterable) to a dict.""" - return dict((key, value) for (key) in keys) - -def parse(opt): - """This function parses the options to --download and returns a set such as { icu: true }, etc. """ - if not opt: - opt = download_default - - theOpts = set(opt.split(',')) - - if 'all' in theOpts: - # all on - return set2dict(download_types, True) - elif 'none' in theOpts: - # all off - return set2dict(download_types, False) - - # OK. Now, process each of the opts. - theRet = set2dict(download_types, False) - for anOpt in opt.split(','): - if not anOpt or anOpt == "": - # ignore stray commas, etc. - continue - elif anOpt == 'all': - # all on - theRet = dict((key, True) for (key) in download_types) - else: - # turn this one on - if anOpt in download_types: - theRet[anOpt] = True - else: - # future proof: ignore unknown types - print('Warning: ignoring unknown --download= type "%s"' % anOpt) - # all done - return theRet - -def candownload(auto_downloads, package): - if not (package in auto_downloads.keys()): - raise Exception('Internal error: "%s" is not in the --downloads list. Check nodedownload.py' % package) - if auto_downloads[package]: - return True - else: - print("""Warning: Not downloading package "%s". You could pass "--download=all" - (Windows: "download-all") to try auto-downloading it.""" % package) - return False diff --git a/tools/copyfile.py b/tools/copyfile.py deleted file mode 100644 index 0ec642a0bf1..00000000000 --- a/tools/copyfile.py +++ /dev/null @@ -1,31 +0,0 @@ -# Copyright 2008 the V8 project authors. All rights reserved. -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following -# disclaimer in the documentation and/or other materials provided -# with the distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived -# from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -from shutil import copyfile -import sys -copyfile(sys.argv[1], sys.argv[2]) diff --git a/tools/cpplint.py b/tools/cpplint.py deleted file mode 100755 index 464d95b8824..00000000000 --- a/tools/cpplint.py +++ /dev/null @@ -1,8035 +0,0 @@ -#!/usr/bin/env python3 -# -# Copyright (c) 2009 Google Inc. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -"""Does google-lint on c++ files. - -The goal of this script is to identify places in the code that *may* -be in non-compliance with google style. It does not attempt to fix -up these problems -- the point is to educate. It does also not -attempt to find all problems, or to ensure that everything it does -find is legitimately a problem. - -In particular, we can get very confused by /* and // inside strings! -We do a small hack, which is to ignore //'s with "'s after them on the -same line, but it is far from perfect (in either direction). -""" - -from __future__ import annotations # PEP 604 not in 3.9 - -import codecs -import collections -import copy -import getopt -import glob -import itertools -import math # for log -import os -import re -import string -import sys -import sysconfig -import unicodedata -import xml.etree.ElementTree - -# if empty, use defaults -_valid_extensions: set[str] = set() - -__VERSION__ = "2.0.3-dev0" - -_USAGE = """ -Syntax: cpplint.py [--verbose=#] [--output=emacs|eclipse|vs7|junit|sed|gsed] - [--filter=-x,+y,...] - [--counting=total|toplevel|detailed] [--root=subdir] - [--repository=path] - [--linelength=digits] [--headers=x,y,...] [--third_party_headers=pattern] - [--recursive] - [--exclude=path] - [--extensions=hpp,cpp,...] - [--includeorder=default|standardcfirst] - [--config=filename] - [--quiet] - [--version] - [file] ... - - Style checker for C/C++ source files. - This is a fork of the Google style checker with minor extensions. - - The style guidelines this tries to follow are those in - https://google.github.io/styleguide/cppguide.html - - Every problem is given a confidence score from 1-5, with 5 meaning we are - certain of the problem, and 1 meaning it could be a legitimate construct. - This will miss some errors, and is not a substitute for a code review. - - To suppress false-positive errors of certain categories, add a - 'NOLINT(category[, category...])' comment to the line. NOLINT or NOLINT(*) - suppresses errors of all categories on that line. To suppress categories - on the next line use NOLINTNEXTLINE instead of NOLINT. To suppress errors in - a block of code 'NOLINTBEGIN(category[, category...])' comment to a line at - the start of the block and to end the block add a comment with 'NOLINTEND'. - NOLINT blocks are inclusive so any statements on the same line as a BEGIN - or END will have the error suppression applied. - - The files passed in will be linted; at least one file must be provided. - Default linted extensions are %s. - Other file types will be ignored. - Change the extensions with the --extensions flag. - - Flags: - - output=emacs|eclipse|vs7|junit|sed|gsed - By default, the output is formatted to ease emacs parsing. Visual Studio - compatible output (vs7) may also be used. Further support exists for - eclipse (eclipse), and JUnit (junit). XML parsers such as those used - in Jenkins and Bamboo may also be used. - The sed format outputs sed commands that should fix some of the errors. - Note that this requires gnu sed. If that is installed as gsed on your - system (common e.g. on macOS with homebrew) you can use the gsed output - format. Sed commands are written to stdout, not stderr, so you should be - able to pipe output straight to a shell to run the fixes. - - verbose=# - Specify a number 0-5 to restrict errors to certain verbosity levels. - Errors with lower verbosity levels have lower confidence and are more - likely to be false positives. - - quiet - Don't print anything if no errors are found. - - filter=-x,+y,... - Specify a comma-separated list of category-filters to apply: only - error messages whose category names pass the filters will be printed. - (Category names are printed with the message and look like - "[whitespace/indent]".) Filters are evaluated left to right. - "-FOO" means "do not print categories that start with FOO". - "+FOO" means "do print categories that start with FOO". - - Examples: --filter=-whitespace,+whitespace/braces - --filter=-whitespace,-runtime/printf,+runtime/printf_format - --filter=-,+build/include_what_you_use - - To see a list of all the categories used in cpplint, pass no arg: - --filter= - - Filters can directly be limited to files and also line numbers. The - syntax is category:file:line , where line is optional. The filter limitation - works for both + and - and can be combined with ordinary filters: - - Examples: --filter=-whitespace:foo.h,+whitespace/braces:foo.h - --filter=-whitespace,-runtime/printf:foo.h:14,+runtime/printf_format:foo.h - --filter=-,+build/include_what_you_use:foo.h:321 - - counting=total|toplevel|detailed - The total number of errors found is always printed. If - 'toplevel' is provided, then the count of errors in each of - the top-level categories like 'build' and 'whitespace' will - also be printed. If 'detailed' is provided, then a count - is provided for each category like 'legal/copyright'. - - repository=path - The top level directory of the repository, used to derive the header - guard CPP variable. By default, this is determined by searching for a - path that contains .git, .hg, or .svn. When this flag is specified, the - given path is used instead. This option allows the header guard CPP - variable to remain consistent even if members of a team have different - repository root directories (such as when checking out a subdirectory - with SVN). In addition, users of non-mainstream version control systems - can use this flag to ensure readable header guard CPP variables. - - Examples: - Assuming that Alice checks out ProjectName and Bob checks out - ProjectName/trunk and trunk contains src/chrome/ui/browser.h, then - with no --repository flag, the header guard CPP variable will be: - - Alice => TRUNK_SRC_CHROME_BROWSER_UI_BROWSER_H_ - Bob => SRC_CHROME_BROWSER_UI_BROWSER_H_ - - If Alice uses the --repository=trunk flag and Bob omits the flag or - uses --repository=. then the header guard CPP variable will be: - - Alice => SRC_CHROME_BROWSER_UI_BROWSER_H_ - Bob => SRC_CHROME_BROWSER_UI_BROWSER_H_ - - root=subdir - The root directory used for deriving header guard CPP variable. - This directory is relative to the top level directory of the repository - which by default is determined by searching for a directory that contains - .git, .hg, or .svn but can also be controlled with the --repository flag. - If the specified directory does not exist, this flag is ignored. - - Examples: - Assuming that src is the top level directory of the repository (and - cwd=top/src), the header guard CPP variables for - src/chrome/browser/ui/browser.h are: - - No flag => CHROME_BROWSER_UI_BROWSER_H_ - --root=chrome => BROWSER_UI_BROWSER_H_ - --root=chrome/browser => UI_BROWSER_H_ - --root=.. => SRC_CHROME_BROWSER_UI_BROWSER_H_ - - linelength=digits - This is the allowed line length for the project. The default value is - 80 characters. - - Examples: - --linelength=120 - - recursive - Search for files to lint recursively. Each directory given in the list - of files to be linted is replaced by all files that descend from that - directory. Files with extensions not in the valid extensions list are - excluded. - - exclude=path - Exclude the given path from the list of files to be linted. Relative - paths are evaluated relative to the current directory and shell globbing - is performed. This flag can be provided multiple times to exclude - multiple files. - - Examples: - --exclude=one.cc - --exclude=src/*.cc - --exclude=src/*.cc --exclude=test/*.cc - - extensions=extension,extension,... - The allowed file extensions that cpplint will check - - Examples: - --extensions=%s - - includeorder=default|standardcfirst - For the build/include_order rule, the default is to blindly assume angle - bracket includes with file extension are c-system-headers (default), - even knowing this will have false classifications. - The default is established at google. - standardcfirst means to instead use an allow-list of known c headers and - treat all others as separate group of "other system headers". The C headers - included are those of the C-standard lib and closely related ones. - - config=filename - Search for config files with the specified name instead of CPPLINT.cfg - - headers=x,y,... - The header extensions that cpplint will treat as .h in checks. Values are - automatically added to --extensions list. - (by default, only files with extensions %s will be assumed to be headers) - third_party_headers=pattern - Regex for identifying third-party headers to exclude from include checks. - - Examples: - --headers=%s - --headers=hpp,hxx - --headers=hpp - - cpplint.py supports per-directory configurations specified in CPPLINT.cfg - files. CPPLINT.cfg file can contain a number of key=value pairs. - Currently the following options are supported: - - set noparent - filter=+filter1,-filter2,... - exclude_files=regex - linelength=80 - root=subdir - headers=x,y,... - third_party_headers=pattern - - "set noparent" option prevents cpplint from traversing directory tree - upwards looking for more .cfg files in parent directories. This option - is usually placed in the top-level project directory. - - The "filter" option is similar in function to --filter flag. It specifies - message filters in addition to the |_DEFAULT_FILTERS| and those specified - through --filter command-line flag. - - "exclude_files" allows to specify a regular expression to be matched against - a file name. If the expression matches, the file is skipped and not run - through the linter. - - "linelength" allows to specify the allowed line length for the project. - - The "root" option is similar in function to the --root flag (see example - above). Paths are relative to the directory of the CPPLINT.cfg. - - The "headers" option is similar in function to the --headers flag - (see example above). - - CPPLINT.cfg has an effect on files in the same directory and all - sub-directories, unless overridden by a nested configuration file. - - Example file: - filter=-build/include_order,+build/include_alpha - exclude_files=.*\\.cc - - The above example disables build/include_order warning and enables - build/include_alpha as well as excludes all .cc from being - processed by linter, in the current directory (where the .cfg - file is located) and all sub-directories. -""" - -# We categorize each error message we print. Here are the categories. -# We want an explicit list so we can list them all in cpplint --filter=. -# If you add a new error message with a new category, add it to the list -# here! cpplint_unittest.py should tell you if you forget to do this. -_ERROR_CATEGORIES = [ - "build/c++11", - "build/c++17", - "build/deprecated", - "build/endif_comment", - "build/explicit_make_pair", - "build/forward_decl", - "build/header_guard", - "build/include", - "build/include_alpha", - "build/include_inline", - "build/include_order", - "build/include_subdir", - "build/include_what_you_use", - "build/namespaces_headers", - "build/namespaces/header/block/literals", - "build/namespaces/header/block/nonliterals", - "build/namespaces/header/namespace/literals", - "build/namespaces/header/namespace/nonliterals", - "build/namespaces/source/block/literals", - "build/namespaces/source/block/nonliterals", - "build/namespaces/source/namespace/literals", - "build/namespaces/source/namespace/nonliterals", - "build/printf_format", - "build/storage_class", - "legal/copyright", - "readability/alt_tokens", - "readability/braces", - "readability/casting", - "readability/check", - "readability/constructors", - "readability/fn_size", - "readability/inheritance", - "readability/multiline_comment", - "readability/multiline_string", - "readability/namespace", - "readability/nolint", - "readability/nul", - "readability/todo", - "readability/utf8", - "runtime/arrays", - "runtime/casting", - "runtime/explicit", - "runtime/int", - "runtime/init", - "runtime/invalid_increment", - "runtime/member_string_references", - "runtime/memset", - "runtime/operator", - "runtime/printf", - "runtime/printf_format", - "runtime/references", - "runtime/string", - "runtime/threadsafe_fn", - "runtime/vlog", - "runtime/v8_persistent", - "whitespace/blank_line", - "whitespace/braces", - "whitespace/comma", - "whitespace/comments", - "whitespace/empty_conditional_body", - "whitespace/empty_if_body", - "whitespace/empty_loop_body", - "whitespace/end_of_line", - "whitespace/ending_newline", - "whitespace/forcolon", - "whitespace/indent", - "whitespace/indent_namespace", - "whitespace/line_length", - "whitespace/newline", - "whitespace/operators", - "whitespace/parens", - "whitespace/semicolon", - "whitespace/tab", - "whitespace/todo", -] - -# keywords to use with --outputs which generate stdout for machine processing -_MACHINE_OUTPUTS = ["junit", "sed", "gsed"] - -# These error categories are no longer enforced by cpplint, but for backwards- -# compatibility they may still appear in NOLINT comments. -_LEGACY_ERROR_CATEGORIES = [ - "build/class", - "readability/streams", - "readability/function", -] - -# These prefixes for categories should be ignored since they relate to other -# tools which also use the NOLINT syntax, e.g. clang-tidy. -_OTHER_NOLINT_CATEGORY_PREFIXES = [ - "clang-analyzer-", - "abseil-", - "altera-", - "android-", - "boost-", - "bugprone-", - "cert-", - "concurrency-", - "cppcoreguidelines-", - "darwin-", - "fuchsia-", - "google-", - "hicpp-", - "linuxkernel-", - "llvm-", - "llvmlibc-", - "misc-", - "modernize-", - "mpi-", - "objc-", - "openmp-", - "performance-", - "portability-", - "readability-", - "zircon-", -] - -# The default state of the category filter. This is overridden by the --filter= -# flag. By default all errors are on, so only add here categories that should be -# off by default (i.e., categories that must be enabled by the --filter= flags). -# All entries here should start with a '-' or '+', as in the --filter= flag. -_DEFAULT_FILTERS = [ - "-build/include_alpha", - "-readability/fn_size", - "-runtime/references", -] - -# The default list of categories suppressed for C (not C++) files. -_DEFAULT_C_SUPPRESSED_CATEGORIES = [ - "readability/casting", -] - -# The default list of categories suppressed for Linux Kernel files. -_DEFAULT_KERNEL_SUPPRESSED_CATEGORIES = [ - "whitespace/tab", -] - -# We used to check for high-bit characters, but after much discussion we -# decided those were OK, as long as they were in UTF-8 and didn't represent -# hard-coded international strings, which belong in a separate i18n file. - -# C++ headers -_CPP_HEADERS = frozenset( - [ - # Legacy - "algobase.h", - "algo.h", - "alloc.h", - "builtinbuf.h", - "bvector.h", - # 'complex.h', collides with System C header "complex.h" since C11 - "defalloc.h", - "deque.h", - "editbuf.h", - "fstream.h", - "function.h", - "hash_map", - "hash_map.h", - "hash_set", - "hash_set.h", - "hashtable.h", - "heap.h", - "indstream.h", - "iomanip.h", - "iostream.h", - "istream.h", - "iterator.h", - "list.h", - "map.h", - "multimap.h", - "multiset.h", - "ostream.h", - "pair.h", - "parsestream.h", - "pfstream.h", - "procbuf.h", - "pthread_alloc", - "pthread_alloc.h", - "rope", - "rope.h", - "ropeimpl.h", - "set.h", - "slist", - "slist.h", - "stack.h", - "stdiostream.h", - "stl_alloc.h", - "stl_relops.h", - "streambuf.h", - "stream.h", - "strfile.h", - "strstream.h", - "tempbuf.h", - "tree.h", - "type_traits.h", - "vector.h", - # C++ library headers - "algorithm", - "array", - "atomic", - "bitset", - "chrono", - "codecvt", - "complex", - "condition_variable", - "deque", - "exception", - "forward_list", - "fstream", - "functional", - "future", - "initializer_list", - "iomanip", - "ios", - "iosfwd", - "iostream", - "istream", - "iterator", - "limits", - "list", - "locale", - "map", - "memory", - "mutex", - "new", - "numeric", - "ostream", - "queue", - "random", - "ratio", - "regex", - "scoped_allocator", - "set", - "sstream", - "stack", - "stdexcept", - "streambuf", - "string", - "strstream", - "system_error", - "thread", - "tuple", - "typeindex", - "typeinfo", - "type_traits", - "unordered_map", - "unordered_set", - "utility", - "valarray", - "vector", - # C++14 headers - "shared_mutex", - # C++17 headers - "any", - "charconv", - "codecvt", - "execution", - "filesystem", - "memory_resource", - "optional", - "string_view", - "variant", - # C++20 headers - "barrier", - "bit", - "compare", - "concepts", - "coroutine", - "format", - "latch", - "numbers", - "ranges", - "semaphore", - "source_location", - "span", - "stop_token", - "syncstream", - "version", - # C++23 headers - "expected", - "flat_map", - "flat_set", - "generator", - "mdspan", - "print", - "spanstream", - "stacktrace", - "stdfloat", - # C++ headers for C library facilities - "cassert", - "ccomplex", - "cctype", - "cerrno", - "cfenv", - "cfloat", - "cinttypes", - "ciso646", - "climits", - "clocale", - "cmath", - "csetjmp", - "csignal", - "cstdalign", - "cstdarg", - "cstdbool", - "cstddef", - "cstdint", - "cstdio", - "cstdlib", - "cstring", - "ctgmath", - "ctime", - "cuchar", - "cwchar", - "cwctype", - ] -) - -# C headers -_C_HEADERS = frozenset( - [ - # System C headers - "assert.h", - "complex.h", - "ctype.h", - "errno.h", - "fenv.h", - "float.h", - "inttypes.h", - "iso646.h", - "limits.h", - "locale.h", - "math.h", - "setjmp.h", - "signal.h", - "stdalign.h", - "stdarg.h", - "stdatomic.h", - "stdbool.h", - "stddef.h", - "stdint.h", - "stdio.h", - "stdlib.h", - "stdnoreturn.h", - "string.h", - "tgmath.h", - "threads.h", - "time.h", - "uchar.h", - "wchar.h", - "wctype.h", - # C23 headers - "stdbit.h", - "stdckdint.h", - # additional POSIX C headers - "aio.h", - "arpa/inet.h", - "cpio.h", - "dirent.h", - "dlfcn.h", - "fcntl.h", - "fmtmsg.h", - "fnmatch.h", - "ftw.h", - "glob.h", - "grp.h", - "iconv.h", - "langinfo.h", - "libgen.h", - "monetary.h", - "mqueue.h", - "ndbm.h", - "net/if.h", - "netdb.h", - "netinet/in.h", - "netinet/tcp.h", - "nl_types.h", - "poll.h", - "pthread.h", - "pwd.h", - "regex.h", - "sched.h", - "search.h", - "semaphore.h", - "setjmp.h", - "signal.h", - "spawn.h", - "strings.h", - "stropts.h", - "syslog.h", - "tar.h", - "termios.h", - "trace.h", - "ulimit.h", - "unistd.h", - "utime.h", - "utmpx.h", - "wordexp.h", - # additional GNUlib headers - "a.out.h", - "aliases.h", - "alloca.h", - "ar.h", - "argp.h", - "argz.h", - "byteswap.h", - "crypt.h", - "endian.h", - "envz.h", - "err.h", - "error.h", - "execinfo.h", - "fpu_control.h", - "fstab.h", - "fts.h", - "getopt.h", - "gshadow.h", - "ieee754.h", - "ifaddrs.h", - "libintl.h", - "mcheck.h", - "mntent.h", - "obstack.h", - "paths.h", - "printf.h", - "pty.h", - "resolv.h", - "shadow.h", - "sysexits.h", - "ttyent.h", - # Additional linux glibc headers - "dlfcn.h", - "elf.h", - "features.h", - "gconv.h", - "gnu-versions.h", - "lastlog.h", - "libio.h", - "link.h", - "malloc.h", - "memory.h", - "netash/ash.h", - "netatalk/at.h", - "netax25/ax25.h", - "neteconet/ec.h", - "netipx/ipx.h", - "netiucv/iucv.h", - "netpacket/packet.h", - "netrom/netrom.h", - "netrose/rose.h", - "nfs/nfs.h", - "nl_types.h", - "nss.h", - "re_comp.h", - "regexp.h", - "sched.h", - "sgtty.h", - "stab.h", - "stdc-predef.h", - "stdio_ext.h", - "syscall.h", - "termio.h", - "thread_db.h", - "ucontext.h", - "ustat.h", - "utmp.h", - "values.h", - "wait.h", - "xlocale.h", - # Hardware specific headers - "arm_neon.h", - "emmintrin.h", - "xmmintin.h", - ] -) - -# Folders of C libraries so commonly used in C++, -# that they have parity with standard C libraries. -C_STANDARD_HEADER_FOLDERS = frozenset( - [ - # standard C library - "sys", - # glibc for linux - "arpa", - "asm-generic", - "bits", - "gnu", - "net", - "netinet", - "protocols", - "rpc", - "rpcsvc", - "scsi", - # linux kernel header - "drm", - "linux", - "misc", - "mtd", - "rdma", - "sound", - "video", - "xen", - ] -) - -# Type names -_TYPES = re.compile( - r"^(?:" - # [dcl.type.simple] - r"(char(16_t|32_t)?)|wchar_t|" - r"bool|short|int|long|signed|unsigned|float|double|" - # [support.types] - r"(ptrdiff_t|size_t|max_align_t|nullptr_t)|" - # [cstdint.syn] - r"(u?int(_fast|_least)?(8|16|32|64)_t)|" - r"(u?int(max|ptr)_t)|" - r")$" -) - -# Pattern for matching FileInfo.BaseName() against test file name -_test_suffixes = ["_test", "_regtest", "_unittest"] -_TEST_FILE_SUFFIX = "(" + "|".join(_test_suffixes) + r")$" - -# Pattern that matches only complete whitespace, possibly across multiple lines. -_EMPTY_CONDITIONAL_BODY_PATTERN = re.compile(r"^\s*$", re.DOTALL) - -# Assertion macros. These are defined in base/logging.h and -# testing/base/public/gunit.h. -_CHECK_MACROS = [ - "DCHECK", - "CHECK", - "EXPECT_TRUE", - "ASSERT_TRUE", - "EXPECT_FALSE", - "ASSERT_FALSE", -] - -# Replacement macros for CHECK/DCHECK/EXPECT_TRUE/EXPECT_FALSE -_CHECK_REPLACEMENT: dict[str, dict[str, str]] = {macro_var: {} for macro_var in _CHECK_MACROS} - -for op, replacement in [ - ("==", "EQ"), - ("!=", "NE"), - (">=", "GE"), - (">", "GT"), - ("<=", "LE"), - ("<", "LT"), -]: - _CHECK_REPLACEMENT["DCHECK"][op] = f"DCHECK_{replacement}" - _CHECK_REPLACEMENT["CHECK"][op] = f"CHECK_{replacement}" - _CHECK_REPLACEMENT["EXPECT_TRUE"][op] = f"EXPECT_{replacement}" - _CHECK_REPLACEMENT["ASSERT_TRUE"][op] = f"ASSERT_{replacement}" - -for op, inv_replacement in [ - ("==", "NE"), - ("!=", "EQ"), - (">=", "LT"), - (">", "LE"), - ("<=", "GT"), - ("<", "GE"), -]: - _CHECK_REPLACEMENT["EXPECT_FALSE"][op] = f"EXPECT_{inv_replacement}" - _CHECK_REPLACEMENT["ASSERT_FALSE"][op] = f"ASSERT_{inv_replacement}" - -# Alternative tokens and their replacements. For full list, see section 2.5 -# Alternative tokens [lex.digraph] in the C++ standard. -# -# Digraphs (such as '%:') are not included here since it's a mess to -# match those on a word boundary. -_ALT_TOKEN_REPLACEMENT = { - "and": "&&", - "bitor": "|", - "or": "||", - "xor": "^", - "compl": "~", - "bitand": "&", - "and_eq": "&=", - "or_eq": "|=", - "xor_eq": "^=", - "not": "!", - "not_eq": "!=", -} - -# Compile regular expression that matches all the above keywords. The "[ =()]" -# bit is meant to avoid matching these keywords outside of boolean expressions. -# -# False positives include C-style multi-line comments and multi-line strings -# but those have always been troublesome for cpplint. -_ALT_TOKEN_REPLACEMENT_PATTERN = re.compile( - r"([ =()])(" + ("|".join(_ALT_TOKEN_REPLACEMENT.keys())) + r")([ (]|$)" -) - - -# These constants define types of headers for use with -# _IncludeState.CheckNextIncludeOrder(). -_C_SYS_HEADER = 1 -_CPP_SYS_HEADER = 2 -_OTHER_SYS_HEADER = 3 -_LIKELY_MY_HEADER = 4 -_POSSIBLE_MY_HEADER = 5 -_OTHER_HEADER = 6 - -# These constants define the current inline assembly state -_NO_ASM = 0 # Outside of inline assembly block -_INSIDE_ASM = 1 # Inside inline assembly block -_END_ASM = 2 # Last line of inline assembly block -_BLOCK_ASM = 3 # The whole block is an inline assembly block - -# Match start of assembly blocks -_MATCH_ASM = re.compile( - r"^\s*(?:asm|_asm|__asm|__asm__)" - r"(?:\s+(volatile|__volatile__))?" - r"\s*[{(]" -) - -# Match strings that indicate we're working on a C (not C++) file. -_SEARCH_C_FILE = re.compile( - r"\b(?:LINT_C_FILE|" - r"vim?:\s*.*(\s*|:)filetype=c(\s*|:|$))" -) - -# Match string that indicates we're working on a Linux Kernel file. -_SEARCH_KERNEL_FILE = re.compile(r"\b(?:LINT_KERNEL_FILE)") - -_NULL_TOKEN_PATTERN = re.compile(r'\bNULL\b') - -_V8_PERSISTENT_PATTERN = re.compile(r'\bv8::Persistent\b') - -_RIGHT_LEANING_POINTER_PATTERN = re.compile(r'[^=|(,\s><);&?:}]' - r'(?= other.end - - def __init__(self): - self._suppressions = collections.defaultdict(list) - self._open_block_suppression = None - - def _AddSuppression(self, category, line_range): - suppressed = self._suppressions[category] - if not (suppressed and suppressed[-1].ContainsRange(line_range)): - suppressed.append(line_range) - - def GetOpenBlockStart(self): - """:return: The start of the current open block or `-1` if there is not an open block""" - return self._open_block_suppression.begin if self._open_block_suppression else -1 - - def AddGlobalSuppression(self, category): - """Add a suppression for `category` which is suppressed for the whole file""" - self._AddSuppression(category, self.LineRange(0, math.inf)) - - def AddLineSuppression(self, category, linenum): - """Add a suppression for `category` which is suppressed only on `linenum`""" - self._AddSuppression(category, self.LineRange(linenum, linenum)) - - def StartBlockSuppression(self, category, linenum): - """Start a suppression block for `category` on `linenum`. inclusive""" - if self._open_block_suppression is None: - self._open_block_suppression = self.LineRange(linenum, math.inf) - self._AddSuppression(category, self._open_block_suppression) - - def EndBlockSuppression(self, linenum): - """End the current block suppression on `linenum`. inclusive""" - if self._open_block_suppression: - self._open_block_suppression.end = linenum - self._open_block_suppression = None - - def IsSuppressed(self, category, linenum): - """:return: `True` if `category` is suppressed for `linenum`""" - suppressed = self._suppressions[category] + self._suppressions[None] - return any(linenum in lr for lr in suppressed) - - def HasOpenBlock(self): - """:return: `True` if a block suppression was started but not ended""" - return self._open_block_suppression is not None - - def Clear(self): - """Clear all current error suppressions""" - self._suppressions.clear() - self._open_block_suppression = None - - -# {str, set(int)}: a map from error categories to sets of linenumbers -# on which those errors are expected and should be suppressed. -_error_suppressions = ErrorSuppressions() - - -def ProcessHppHeadersOption(val): - global _hpp_headers - try: - _hpp_headers = {ext.strip() for ext in val.split(",")} - except ValueError: - PrintUsage("Header extensions must be comma separated list.") - - -def ProcessIncludeOrderOption(val): - if val is None or val == "default": - pass - elif val == "standardcfirst": - global _include_order - _include_order = val - else: - PrintUsage("Invalid includeorder value %s. Expected default|standardcfirst") - - -def ProcessThirdPartyHeadersOption(val): - """Sets the regex pattern for third-party headers.""" - global _third_party_headers_pattern - try: - _third_party_headers_pattern = re.compile(val) - except re.error: - PrintUsage(f"Invalid third_party_headers pattern: {val}") - - -def IsHeaderExtension(file_extension): - return file_extension in GetHeaderExtensions() - - -def GetHeaderExtensions(): - if _hpp_headers: - return _hpp_headers - if _valid_extensions: - return {h for h in _valid_extensions if "h" in h} - return {"h", "hh", "hpp", "hxx", "h++", "cuh"} - - -# The allowed extensions for file names -# This is set by --extensions flag -def GetAllExtensions(): - return GetHeaderExtensions().union(_valid_extensions or {"c", "cc", "cpp", "cxx", "c++", "cu"}) - - -def ProcessExtensionsOption(val): - global _valid_extensions - try: - extensions = [ext.strip() for ext in val.split(",")] - _valid_extensions = set(extensions) - except ValueError: - PrintUsage( - "Extensions should be a comma-separated list of values;" - "for example: extensions=hpp,cpp\n" - f'This could not be parsed: "{val}"' - ) - - -def GetNonHeaderExtensions(): - return GetAllExtensions().difference(GetHeaderExtensions()) - - -def ParseNolintSuppressions(filename, raw_line, linenum, error): - """Updates the global list of line error-suppressions. - - Parses any NOLINT comments on the current line, updating the global - error_suppressions store. Reports an error if the NOLINT comment - was malformed. - - Args: - filename: str, the name of the input file. - raw_line: str, the line of input text, with comments. - linenum: int, the number of the current line. - error: function, an error handler. - """ - if matched := re.search(r"\bNOLINT(NEXTLINE|BEGIN|END)?\b(\([^)]+\))?", raw_line): - no_lint_type = matched.group(1) - if no_lint_type == "NEXTLINE": - - def ProcessCategory(category): - _error_suppressions.AddLineSuppression(category, linenum + 1) - elif no_lint_type == "BEGIN": - if _error_suppressions.HasOpenBlock(): - error( - filename, - linenum, - "readability/nolint", - 5, - ( - "NONLINT block already defined on line " - f"{_error_suppressions.GetOpenBlockStart()}" - ), - ) - - def ProcessCategory(category): - _error_suppressions.StartBlockSuppression(category, linenum) - elif no_lint_type == "END": - if not _error_suppressions.HasOpenBlock(): - error(filename, linenum, "readability/nolint", 5, "Not in a NOLINT block") - - def ProcessCategory(category): - if category is not None: - error( - filename, - linenum, - "readability/nolint", - 5, - f"NOLINT categories not supported in block END: {category}", - ) - _error_suppressions.EndBlockSuppression(linenum) - else: - - def ProcessCategory(category): - _error_suppressions.AddLineSuppression(category, linenum) - - categories = matched.group(2) - if categories in (None, "(*)"): # => "suppress all" - ProcessCategory(None) - elif categories.startswith("(") and categories.endswith(")"): - for category in {c.strip() for c in categories[1:-1].split(",")}: - if category in _ERROR_CATEGORIES: - ProcessCategory(category) - elif any(c for c in _OTHER_NOLINT_CATEGORY_PREFIXES if category.startswith(c)): - # Ignore any categories from other tools. - pass - elif category not in _LEGACY_ERROR_CATEGORIES: - error( - filename, - linenum, - "readability/nolint", - 5, - f"Unknown NOLINT error category: {category}", - ) - - -def ProcessGlobalSuppressions(filename: str, lines: list[str]) -> None: - """Updates the list of global error suppressions. - - Parses any lint directives in the file that have global effect. - - Args: - lines: An array of strings, each representing a line of the file, with the - last element being empty if the file is terminated with a newline. - filename: str, the name of the input file. - """ - for line in lines: - if _SEARCH_C_FILE.search(line) or filename.lower().endswith((".c", ".cu")): - for category in _DEFAULT_C_SUPPRESSED_CATEGORIES: - _error_suppressions.AddGlobalSuppression(category) - if _SEARCH_KERNEL_FILE.search(line): - for category in _DEFAULT_KERNEL_SUPPRESSED_CATEGORIES: - _error_suppressions.AddGlobalSuppression(category) - - -def ResetNolintSuppressions(): - """Resets the set of NOLINT suppressions to empty.""" - _error_suppressions.Clear() - - -def IsErrorSuppressedByNolint(category, linenum): - """Returns true if the specified error category is suppressed on this line. - - Consults the global error_suppressions map populated by - ParseNolintSuppressions/ProcessGlobalSuppressions/ResetNolintSuppressions. - - Args: - category: str, the category of the error. - linenum: int, the current line number. - Returns: - bool, True iff the error should be suppressed due to a NOLINT comment, - block suppression or global suppression. - """ - return _error_suppressions.IsSuppressed(category, linenum) - - -def _IsSourceExtension(s): - """File extension (excluding dot) matches a source file extension.""" - return s in GetNonHeaderExtensions() - - -class _IncludeState: - """Tracks line numbers for includes, and the order in which includes appear. - - include_list contains list of lists of (header, line number) pairs. - It's a lists of lists rather than just one flat list to make it - easier to update across preprocessor boundaries. - - Call CheckNextIncludeOrder() once for each header in the file, passing - in the type constants defined above. Calls in an illegal order will - raise an _IncludeError with an appropriate error message. - - """ - - # self._section will move monotonically through this set. If it ever - # needs to move backwards, CheckNextIncludeOrder will raise an error. - _INITIAL_SECTION = 0 - _MY_H_SECTION = 1 - _OTHER_H_SECTION = 2 - _C_SECTION = 3 - _CPP_SECTION = 4 - _OTHER_SYS_SECTION = 5 - - _TYPE_NAMES = { - _C_SYS_HEADER: "C system header", - _CPP_SYS_HEADER: "C++ system header", - _OTHER_SYS_HEADER: "other system header", - _LIKELY_MY_HEADER: "header this file implements", - _POSSIBLE_MY_HEADER: "header this file may implement", - _OTHER_HEADER: "other header", - } - _SECTION_NAMES = { - _INITIAL_SECTION: "... nothing. (This can't be an error.)", - _MY_H_SECTION: "a header this file implements", - _OTHER_H_SECTION: "other header", - _C_SECTION: "C system header", - _CPP_SECTION: "C++ system header", - _OTHER_SYS_SECTION: "other system header", - } - - def __init__(self): - self.include_list = [[]] - self._section = None - self._last_header = None - self.ResetSection("") - - def FindHeader(self, header): - """Check if a header has already been included. - - Args: - header: header to check. - Returns: - Line number of previous occurrence, or -1 if the header has not - been seen before. - """ - for section_list in self.include_list: - for f in section_list: - if f[0] == header: - return f[1] - return -1 - - def ResetSection(self, directive): - """Reset section checking for preprocessor directive. - - Args: - directive: preprocessor directive (e.g. "if", "else"). - """ - # The name of the current section. - self._section = self._INITIAL_SECTION - # The path of last found header. - self._last_header = "" - - # Update list of includes. Note that we never pop from the - # include list. - if directive in ("if", "ifdef", "ifndef"): - self.include_list.append([]) - elif directive in ("else", "elif"): - self.include_list[-1] = [] - - def SetLastHeader(self, header_path): - self._last_header = header_path - - def CanonicalizeAlphabeticalOrder(self, header_path): - """Returns a path canonicalized for alphabetical comparison. - - - replaces "-" with "_" so they both cmp the same. - - removes '-inl' since we don't require them to be after the main header. - - lowercase everything, just in case. - - Args: - header_path: Path to be canonicalized. - - Returns: - Canonicalized path. - """ - return header_path.replace("-inl.h", ".h").replace("-", "_").lower() - - def IsInAlphabeticalOrder(self, clean_lines, linenum, header_path): - """Check if a header is in alphabetical order with the previous header. - - Args: - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - header_path: Canonicalized header to be checked. - - Returns: - Returns true if the header is in alphabetical order. - """ - # If previous section is different from current section, _last_header will - # be reset to empty string, so it's always less than current header. - # - # If previous line was a blank line, assume that the headers are - # intentionally sorted the way they are. - return not ( - self._last_header > header_path - and re.match(r"^\s*#\s*include\b", clean_lines.elided[linenum - 1]) - ) - - def CheckNextIncludeOrder(self, header_type): - """Returns a non-empty error message if the next header is out of order. - - This function also updates the internal state to be ready to check - the next include. - - Args: - header_type: One of the _XXX_HEADER constants defined above. - - Returns: - The empty string if the header is in the right order, or an - error message describing what's wrong. - - """ - error_message = ( - f"Found {self._TYPE_NAMES[header_type]} after {self._SECTION_NAMES[self._section]}" - ) - - last_section = self._section - - if header_type == _C_SYS_HEADER: - if self._section <= self._C_SECTION: - self._section = self._C_SECTION - else: - self._last_header = "" - return error_message - elif header_type == _CPP_SYS_HEADER: - if self._section <= self._CPP_SECTION: - self._section = self._CPP_SECTION - else: - self._last_header = "" - return error_message - elif header_type == _OTHER_SYS_HEADER: - if self._section <= self._OTHER_SYS_SECTION: - self._section = self._OTHER_SYS_SECTION - else: - self._last_header = "" - return error_message - elif header_type == _LIKELY_MY_HEADER: - if self._section <= self._MY_H_SECTION: - self._section = self._MY_H_SECTION - else: - self._section = self._OTHER_H_SECTION - elif header_type == _POSSIBLE_MY_HEADER: - if self._section <= self._MY_H_SECTION: - self._section = self._MY_H_SECTION - else: - # This will always be the fallback because we're not sure - # enough that the header is associated with this file. - self._section = self._OTHER_H_SECTION - else: - assert header_type == _OTHER_HEADER - self._section = self._OTHER_H_SECTION - - if last_section != self._section: - self._last_header = "" - - return "" - - -class _CppLintState: - """Maintains module-wide state..""" - - def __init__(self): - self.verbose_level = 1 # global setting. - self.error_count = 0 # global count of reported errors - # filters to apply when emitting error messages - self.filters = _DEFAULT_FILTERS[:] - # backup of filter list. Used to restore the state after each file. - self._filters_backup = self.filters[:] - self.counting = "total" # In what way are we counting errors? - self.errors_by_category = {} # string to int dict storing error counts - self.quiet = False # Suppress non-error messages? - - # output format: - # "emacs" - format that emacs can parse (default) - # "eclipse" - format that eclipse can parse - # "vs7" - format that Microsoft Visual Studio 7 can parse - # "junit" - format that Jenkins, Bamboo, etc can parse - # "sed" - returns a gnu sed command to fix the problem - # "gsed" - like sed, but names the command gsed, e.g. for macOS homebrew users - self.output_format = "emacs" - - # For JUnit output, save errors and failures until the end so that they - # can be written into the XML - self._junit_errors = [] - self._junit_failures = [] - - def SetOutputFormat(self, output_format): - """Sets the output format for errors.""" - self.output_format = output_format - - def SetQuiet(self, quiet): - """Sets the module's quiet settings, and returns the previous setting.""" - last_quiet = self.quiet - self.quiet = quiet - return last_quiet - - def SetVerboseLevel(self, level): - """Sets the module's verbosity, and returns the previous setting.""" - last_verbose_level = self.verbose_level - self.verbose_level = level - return last_verbose_level - - def SetCountingStyle(self, counting_style): - """Sets the module's counting options.""" - self.counting = counting_style - - def SetFilters(self, filters): - """Sets the error-message filters. - - These filters are applied when deciding whether to emit a given - error message. - - Args: - filters: A string of comma-separated filters (eg "+whitespace/indent"). - Each filter should start with + or -; else we die. - - Raises: - ValueError: The comma-separated filters did not all start with '+' or '-'. - E.g. "-,+whitespace,-whitespace/indent,whitespace/badfilter" - """ - # Default filters always have less priority than the flag ones. - self.filters = _DEFAULT_FILTERS[:] - self.AddFilters(filters) - - def AddFilters(self, filters): - """Adds more filters to the existing list of error-message filters.""" - for filt in filters.split(","): - clean_filt = filt.strip() - if clean_filt: - if len(clean_filt) > 1 and clean_filt[1:] in _FILTER_SHORTCUTS: - starting_char = clean_filt[0] - new_filters = [starting_char + x for x in _FILTER_SHORTCUTS[clean_filt[1:]]] - self.filters.extend(new_filters) - else: - self.filters.append(clean_filt) - for filt in self.filters: - if not filt.startswith(("+", "-")): - msg = f"Every filter in --filters must start with + or - ({filt} does not)" - raise ValueError(msg) - - def BackupFilters(self): - """Saves the current filter list to backup storage.""" - self._filters_backup = self.filters[:] - - def RestoreFilters(self): - """Restores filters previously backed up.""" - self.filters = self._filters_backup[:] - - def ResetErrorCounts(self): - """Sets the module's error statistic back to zero.""" - self.error_count = 0 - self.errors_by_category = {} - - def IncrementErrorCount(self, category): - """Bumps the module's error statistic.""" - self.error_count += 1 - if self.counting in ("toplevel", "detailed"): - if self.counting != "detailed": - category = category.split("/")[0] - if category not in self.errors_by_category: - self.errors_by_category[category] = 0 - self.errors_by_category[category] += 1 - - def PrintErrorCounts(self): - """Print a summary of errors by category, and the total.""" - for category, count in sorted(dict.items(self.errors_by_category)): - self.PrintInfo(f"Category '{category}' errors found: {count}\n") - if self.error_count > 0: - self.PrintInfo(f"Total errors found: {self.error_count}\n") - - def PrintInfo(self, message): - # _quiet does not represent --quiet flag. - # Hide infos from stdout to keep stdout pure for machine consumption - if not _quiet and self.output_format not in _MACHINE_OUTPUTS: - sys.stdout.write(message) - - def PrintError(self, message): - if self.output_format == "junit": - self._junit_errors.append(message) - else: - sys.stderr.write(message) - - def AddJUnitFailure(self, filename, linenum, message, category, confidence): - self._junit_failures.append((filename, linenum, message, category, confidence)) - - def FormatJUnitXML(self): - num_errors = len(self._junit_errors) - num_failures = len(self._junit_failures) - - testsuite = xml.etree.ElementTree.Element("testsuite") - testsuite.attrib["errors"] = str(num_errors) - testsuite.attrib["failures"] = str(num_failures) - testsuite.attrib["name"] = "cpplint" - - if num_errors == 0 and num_failures == 0: - testsuite.attrib["tests"] = str(1) - xml.etree.ElementTree.SubElement(testsuite, "testcase", name="passed") - - else: - testsuite.attrib["tests"] = str(num_errors + num_failures) - if num_errors > 0: - testcase = xml.etree.ElementTree.SubElement(testsuite, "testcase") - testcase.attrib["name"] = "errors" - error = xml.etree.ElementTree.SubElement(testcase, "error") - error.text = "\n".join(self._junit_errors) - if num_failures > 0: - # Group failures by file - failed_file_order = [] - failures_by_file = {} - for failure in self._junit_failures: - failed_file = failure[0] - if failed_file not in failed_file_order: - failed_file_order.append(failed_file) - failures_by_file[failed_file] = [] - failures_by_file[failed_file].append(failure) - # Create a testcase for each file - for failed_file in failed_file_order: - failures = failures_by_file[failed_file] - testcase = xml.etree.ElementTree.SubElement(testsuite, "testcase") - testcase.attrib["name"] = failed_file - failure = xml.etree.ElementTree.SubElement(testcase, "failure") - template = "{0}: {1} [{2}] [{3}]" - texts = [template.format(f[1], f[2], f[3], f[4]) for f in failures] - failure.text = "\n".join(texts) - - xml_decl = '\n' - return xml_decl + xml.etree.ElementTree.tostring(testsuite, "utf-8").decode("utf-8") - - -_cpplint_state = _CppLintState() - - -def _OutputFormat(): - """Gets the module's output format.""" - return _cpplint_state.output_format - - -def _SetOutputFormat(output_format): - """Sets the module's output format.""" - _cpplint_state.SetOutputFormat(output_format) - - -def _Quiet(): - """Return's the module's quiet setting.""" - return _cpplint_state.quiet - - -def _SetQuiet(quiet): - """Set the module's quiet status, and return previous setting.""" - return _cpplint_state.SetQuiet(quiet) - - -def _VerboseLevel(): - """Returns the module's verbosity setting.""" - return _cpplint_state.verbose_level - - -def _SetVerboseLevel(level): - """Sets the module's verbosity, and returns the previous setting.""" - return _cpplint_state.SetVerboseLevel(level) - - -def _SetCountingStyle(level): - """Sets the module's counting options.""" - _cpplint_state.SetCountingStyle(level) - - -def _Filters(): - """Returns the module's list of output filters, as a list.""" - return _cpplint_state.filters - - -def _SetFilters(filters): - """Sets the module's error-message filters. - - These filters are applied when deciding whether to emit a given - error message. - - Args: - filters: A string of comma-separated filters (eg "whitespace/indent"). - Each filter should start with + or -; else we die. - """ - _cpplint_state.SetFilters(filters) - - -def _AddFilters(filters): - """Adds more filter overrides. - - Unlike _SetFilters, this function does not reset the current list of filters - available. - - Args: - filters: A string of comma-separated filters (eg "whitespace/indent"). - Each filter should start with + or -; else we die. - """ - _cpplint_state.AddFilters(filters) - - -def _BackupFilters(): - """Saves the current filter list to backup storage.""" - _cpplint_state.BackupFilters() - - -def _RestoreFilters(): - """Restores filters previously backed up.""" - _cpplint_state.RestoreFilters() - - -class _FunctionState: - """Tracks current function name and the number of lines in its body.""" - - _NORMAL_TRIGGER = 250 # for --v=0, 500 for --v=1, etc. - _TEST_TRIGGER = 400 # about 50% more than _NORMAL_TRIGGER. - - def __init__(self): - self.in_a_function = False - self.lines_in_function = 0 - self.current_function = "" - - def Begin(self, function_name): - """Start analyzing function body. - - Args: - function_name: The name of the function being tracked. - """ - self.in_a_function = True - self.lines_in_function = 0 - self.current_function = function_name - - def Count(self): - """Count line in current function body.""" - if self.in_a_function: - self.lines_in_function += 1 - - def Check(self, error, filename, linenum): - """Report if too many lines in function body. - - Args: - error: The function to call with any errors found. - filename: The name of the current file. - linenum: The number of the line to check. - """ - if not self.in_a_function: - return - - if re.match(r"T(EST|est)", self.current_function): - base_trigger = self._TEST_TRIGGER - else: - base_trigger = self._NORMAL_TRIGGER - trigger = base_trigger * 2 ** _VerboseLevel() - - if self.lines_in_function > trigger: - error_level = int(math.log2(self.lines_in_function / base_trigger)) - # 50 => 0, 100 => 1, 200 => 2, 400 => 3, 800 => 4, 1600 => 5, ... - error_level = min(error_level, 5) - error( - filename, - linenum, - "readability/fn_size", - error_level, - "Small and focused functions are preferred:" - f" {self.current_function} has {self.lines_in_function} non-comment lines" - f" (error triggered by exceeding {trigger} lines).", - ) - - def End(self): - """Stop analyzing function body.""" - self.in_a_function = False - - -class _IncludeError(Exception): - """Indicates a problem with the include order in a file.""" - - pass - - -class FileInfo: - """Provides utility functions for filenames. - - FileInfo provides easy access to the components of a file's path - relative to the project root. - """ - - def __init__(self, filename): - self._filename = filename - - def FullName(self): - """Make Windows paths like Unix.""" - return os.path.abspath(self._filename).replace("\\", "/") - - def RepositoryName(self): - r"""FullName after removing the local path to the repository. - - If we have a real absolute path name here we can try to do something smart: - detecting the root of the checkout and truncating /path/to/checkout from - the name so that we get header guards that don't include things like - "C:\\Documents and Settings\\..." or "/home/username/..." in them and thus - people on different computers who have checked the source out to different - locations won't see bogus errors. - """ - fullname = self.FullName() - - if os.path.exists(fullname): - project_dir = os.path.dirname(fullname) - - # If the user specified a repository path, it exists, and the file is - # contained in it, use the specified repository path - if _repository: - repo = FileInfo(_repository).FullName() - root_dir = project_dir - while os.path.exists(root_dir): - # allow case insensitive compare on Windows - if os.path.normcase(root_dir) == os.path.normcase(repo): - return os.path.relpath(fullname, root_dir).replace("\\", "/") - one_up_dir = os.path.dirname(root_dir) - if one_up_dir == root_dir: - break - root_dir = one_up_dir - - if os.path.exists(os.path.join(project_dir, ".svn")): - # If there's a .svn file in the current directory, we recursively look - # up the directory tree for the top of the SVN checkout - root_dir = project_dir - one_up_dir = os.path.dirname(root_dir) - while os.path.exists(os.path.join(one_up_dir, ".svn")): - root_dir = os.path.dirname(root_dir) - one_up_dir = os.path.dirname(one_up_dir) - - prefix = os.path.commonprefix([root_dir, project_dir]) - return fullname[len(prefix) + 1 :] - - # Not SVN <= 1.6? Try to find a git, hg, or svn top level directory by - # searching up from the current path. - root_dir = current_dir = os.path.dirname(fullname) - while current_dir != os.path.dirname(current_dir): - if ( - os.path.exists(os.path.join(current_dir, ".git")) - or os.path.exists(os.path.join(current_dir, ".hg")) - or os.path.exists(os.path.join(current_dir, ".svn")) - ): - root_dir = current_dir - break - current_dir = os.path.dirname(current_dir) - - if ( - os.path.exists(os.path.join(root_dir, ".git")) - or os.path.exists(os.path.join(root_dir, ".hg")) - or os.path.exists(os.path.join(root_dir, ".svn")) - ): - prefix = os.path.commonprefix([root_dir, project_dir]) - return fullname[len(prefix) + 1 :] - - # Don't know what to do; header guard warnings may be wrong... - return fullname - - def Split(self): - """Splits the file into the directory, basename, and extension. - - For 'chrome/browser/browser.cc', Split() would - return ('chrome/browser', 'browser', '.cc') - - Returns: - A tuple of (directory, basename, extension). - """ - - googlename = self.RepositoryName() - project, rest = os.path.split(googlename) - return (project,) + os.path.splitext(rest) - - def BaseName(self): - """File base name - text after the final slash, before the final period.""" - return self.Split()[1] - - def Extension(self): - """File extension - text following the final period, includes that period.""" - return self.Split()[2] - - def NoExtension(self): - """File has no source file extension.""" - return "/".join(self.Split()[0:2]) - - def IsSource(self): - """File has a source file extension.""" - return _IsSourceExtension(self.Extension()[1:]) - - -def _ShouldPrintError(category, confidence, filename, linenum): - """If confidence >= verbose, category passes filter and is not suppressed.""" - - # There are three ways we might decide not to print an error message: - # a "NOLINT(category)" comment appears in the source, - # the verbosity level isn't high enough, or the filters filter it out. - if IsErrorSuppressedByNolint(category, linenum): - return False - - if confidence < _cpplint_state.verbose_level: - return False - - is_filtered = False - for one_filter in _Filters(): - filter_cat, filter_file, filter_line = _ParseFilterSelector(one_filter[1:]) - category_match = category.startswith(filter_cat) - file_match = filter_file in ("", filename) - line_match = filter_line in (linenum, -1) - - if one_filter.startswith("-"): - if category_match and file_match and line_match: - is_filtered = True - elif one_filter.startswith("+"): - if category_match and file_match and line_match: - is_filtered = False - else: - # should have been checked for in SetFilter. - msg = f"Invalid filter: {one_filter}" - raise ValueError(msg) - return not is_filtered - - -def Error(filename, linenum, category, confidence, message): - """Logs the fact we've found a lint error. - - We log where the error was found, and also our confidence in the error, - that is, how certain we are this is a legitimate style regression, and - not a misidentification or a use that's sometimes justified. - - False positives can be suppressed by the use of "NOLINT(category)" - comments, NOLINTNEXTLINE or in blocks started by NOLINTBEGIN. These - are parsed into _error_suppressions. - - Args: - filename: The name of the file containing the error. - linenum: The number of the line containing the error. - category: A string used to describe the "category" this bug - falls under: "whitespace", say, or "runtime". Categories - may have a hierarchy separated by slashes: "whitespace/indent". - confidence: A number from 1-5 representing a confidence score for - the error, with 5 meaning that we are certain of the problem, - and 1 meaning that it could be a legitimate construct. - message: The error message. - """ - if _ShouldPrintError(category, confidence, filename, linenum): - _cpplint_state.IncrementErrorCount(category) - if _cpplint_state.output_format == "vs7": - _cpplint_state.PrintError( - f"{filename}({linenum}): error cpplint: [{category}] {message} [{confidence}]\n" - ) - elif _cpplint_state.output_format == "eclipse": - sys.stderr.write( - f"{filename}:{linenum}: warning: {message} [{category}] [{confidence}]\n" - ) - elif _cpplint_state.output_format == "junit": - _cpplint_state.AddJUnitFailure(filename, linenum, message, category, confidence) - elif _cpplint_state.output_format in ["sed", "gsed"]: - if message in _SED_FIXUPS: - sys.stdout.write( - f"{_cpplint_state.output_format} -i" - f" '{linenum}{_SED_FIXUPS[message]}' {filename}" - f" # {message} [{category}] [{confidence}]\n" - ) - else: - sys.stderr.write( - f'# {filename}:{linenum}: "{message}" [{category}] [{confidence}]\n' - ) - else: - final_message = f"{filename}:{linenum}: {message} [{category}] [{confidence}]\n" - sys.stderr.write(final_message) - - -# Matches standard C++ escape sequences per 2.13.2.3 of the C++ standard. -_RE_PATTERN_CLEANSE_LINE_ESCAPES = re.compile(r'\\([abfnrtv?"\\\']|\d+|x[0-9a-fA-F]+)') -# Match a single C style comment on the same line. -_RE_PATTERN_C_COMMENTS = r"/\*(?:[^*]|\*(?!/))*\*/" -# Matches multi-line C style comments. -# This RE is a little bit more complicated than one might expect, because we -# have to take care of space removals tools so we can handle comments inside -# statements better. -# The current rule is: We only clear spaces from both sides when we're at the -# end of the line. Otherwise, we try to remove spaces from the right side, -# if this doesn't work we try on left side but only if there's a non-character -# on the right. -_RE_PATTERN_CLEANSE_LINE_C_COMMENTS = re.compile( - r"(\s*" - + _RE_PATTERN_C_COMMENTS - + r"\s*$|" - + _RE_PATTERN_C_COMMENTS - + r"\s+|" - + r"\s+" - + _RE_PATTERN_C_COMMENTS - + r"(?=\W)|" - + _RE_PATTERN_C_COMMENTS - + r")" -) - - -def IsCppString(line): - """Does line terminate so, that the next symbol is in string constant. - - This function does not consider single-line nor multi-line comments. - - Args: - line: is a partial line of code starting from the 0..n. - - Returns: - True, if next character appended to 'line' is inside a - string constant. - """ - - line = line.replace(r"\\", "XX") # after this, \\" does not match to \" - return ((line.count('"') - line.count(r"\"") - line.count("'\"'")) & 1) == 1 - - -def CleanseRawStrings(raw_lines): - """Removes C++11 raw strings from lines. - - Before: - static const char kData[] = R"( - multi-line string - )"; - - After: - static const char kData[] = "" - (replaced by blank line) - ""; - - Args: - raw_lines: list of raw lines. - - Returns: - list of lines with C++11 raw strings replaced by empty strings. - """ - - delimiter = None - lines_without_raw_strings = [] - for line in raw_lines: - if delimiter: - # Inside a raw string, look for the end - end = line.find(delimiter) - if end >= 0: - # Found the end of the string, match leading space for this - # line and resume copying the original lines, and also insert - # a "" on the last line. - leading_space = re.match(r"^(\s*)\S", line) - line = leading_space.group(1) + '""' + line[end + len(delimiter) :] - delimiter = None - else: - # Haven't found the end yet, append a blank line. - line = '""' - - # Look for beginning of a raw string, and replace them with - # empty strings. This is done in a loop to handle multiple raw - # strings on the same line. - while delimiter is None: - # Look for beginning of a raw string. - # See 2.14.15 [lex.string] for syntax. - # - # Once we have matched a raw string, we check the prefix of the - # line to make sure that the line is not part of a single line - # comment. It's done this way because we remove raw strings - # before removing comments as opposed to removing comments - # before removing raw strings. This is because there are some - # cpplint checks that requires the comments to be preserved, but - # we don't want to check comments that are inside raw strings. - matched = re.match(r'^(.*?)\b(?:R|u8R|uR|UR|LR)"([^\s\\()]*)\((.*)$', line) - if matched and not re.match( - r'^([^\'"]|\'(\\.|[^\'])*\'|"(\\.|[^"])*")*//', matched.group(1) - ): - delimiter = ")" + matched.group(2) + '"' - - end = matched.group(3).find(delimiter) - if end >= 0: - # Raw string ended on same line - line = matched.group(1) + '""' + matched.group(3)[end + len(delimiter) :] - delimiter = None - else: - # Start of a multi-line raw string - line = matched.group(1) + '""' - else: - break - - lines_without_raw_strings.append(line) - - # TODO(google): if delimiter is not None here, we might want to - # emit a warning for unterminated string. - return lines_without_raw_strings - - -def FindNextMultiLineCommentStart(lines, lineix): - """Find the beginning marker for a multiline comment.""" - while lineix < len(lines): - if lines[lineix].strip().startswith("/*"): - # Only return this marker if the comment goes beyond this line - if lines[lineix].strip().find("*/", 2) < 0: - return lineix - lineix += 1 - return len(lines) - - -def FindNextMultiLineCommentEnd(lines, lineix): - """We are inside a comment, find the end marker.""" - while lineix < len(lines): - if lines[lineix].strip().endswith("*/"): - return lineix - lineix += 1 - return len(lines) - - -def RemoveMultiLineCommentsFromRange(lines, begin, end): - """Clears a range of lines for multi-line comments.""" - # Having // comments makes the lines non-empty, so we will not get - # unnecessary blank line warnings later in the code. - for i in range(begin, end): - lines[i] = "/**/" - - -def RemoveMultiLineComments(filename, lines, error): - """Removes multiline (c-style) comments from lines.""" - lineix = 0 - while lineix < len(lines): - lineix_begin = FindNextMultiLineCommentStart(lines, lineix) - if lineix_begin >= len(lines): - return - lineix_end = FindNextMultiLineCommentEnd(lines, lineix_begin) - if lineix_end >= len(lines): - error( - filename, - lineix_begin + 1, - "readability/multiline_comment", - 5, - "Could not find end of multi-line comment", - ) - return - RemoveMultiLineCommentsFromRange(lines, lineix_begin, lineix_end + 1) - lineix = lineix_end + 1 - - -def CleanseComments(line): - """Removes //-comments and single-line C-style /* */ comments. - - Args: - line: A line of C++ source. - - Returns: - The line with single-line comments removed. - """ - commentpos = line.find("//") - if commentpos != -1 and not IsCppString(line[:commentpos]): - line = line[:commentpos].rstrip() - # get rid of /* ... */ - return _RE_PATTERN_CLEANSE_LINE_C_COMMENTS.sub("", line) - - -def ReplaceAlternateTokens(line): - """Replace any alternate token by its original counterpart. - - In order to comply with the google rule stating that unary operators should - never be followed by a space, an exception is made for the 'not' and 'compl' - alternate tokens. For these, any trailing space is removed during the - conversion. - - Args: - line: The line being processed. - - Returns: - The line with alternate tokens replaced. - """ - for match in _ALT_TOKEN_REPLACEMENT_PATTERN.finditer(line): - token = _ALT_TOKEN_REPLACEMENT[match.group(2)] - tail = "" if match.group(2) in ["not", "compl"] and match.group(3) == " " else r"\3" - line = re.sub(match.re, rf"\1{token}{tail}", line, count=1) - return line - - -class CleansedLines: - """Holds 4 copies of all lines with different preprocessing applied to them. - - 1) elided member contains lines without strings and comments. - 2) lines member contains lines without comments. - 3) raw_lines member contains all the lines without processing. - 4) lines_without_raw_strings member is same as raw_lines, but with C++11 raw - strings removed. - All these members are of , and of the same length. - """ - - def __init__(self, lines): - if "-readability/alt_tokens" in _cpplint_state.filters: - for i, line in enumerate(lines): - lines[i] = ReplaceAlternateTokens(line) - self.elided = [] - self.lines = [] - self.raw_lines = lines - self.num_lines = len(lines) - self.lines_without_raw_strings = CleanseRawStrings(lines) - for line in self.lines_without_raw_strings: - self.lines.append(CleanseComments(line)) - elided = self._CollapseStrings(line) - self.elided.append(CleanseComments(elided)) - - def NumLines(self): - """Returns the number of lines represented.""" - return self.num_lines - - @staticmethod - def _CollapseStrings(elided): - """Collapses strings and chars on a line to simple "" or '' blocks. - - We nix strings first so we're not fooled by text like '"http://"' - - Args: - elided: The line being processed. - - Returns: - The line with collapsed strings. - """ - if _RE_PATTERN_INCLUDE.match(elided): - return elided - - # Remove escaped characters first to make quote/single quote collapsing - # basic. Things that look like escaped characters shouldn't occur - # outside of strings and chars. - elided = _RE_PATTERN_CLEANSE_LINE_ESCAPES.sub("", elided) - - # Replace quoted strings and digit separators. Both single quotes - # and double quotes are processed in the same loop, otherwise - # nested quotes wouldn't work. - collapsed = "" - while True: - # Find the first quote character - match = re.match(r'^([^\'"]*)([\'"])(.*)$', elided) - if not match: - collapsed += elided - break - head, quote, tail = match.groups() - - if quote == '"': - # Collapse double quoted strings - second_quote = tail.find('"') - if second_quote >= 0: - collapsed += head + '""' - elided = tail[second_quote + 1 :] - else: - # Unmatched double quote, don't bother processing the rest - # of the line since this is probably a multiline string. - collapsed += elided - break - else: - # Found single quote, check nearby text to eliminate digit separators. - # - # There is no special handling for floating point here, because - # the integer/fractional/exponent parts would all be parsed - # correctly as long as there are digits on both sides of the - # separator. So we are fine as long as we don't see something - # like "0.'3" (gcc 4.9.0 will not allow this literal). - if re.search(r"\b(?:0[bBxX]?|[1-9])[0-9a-fA-F]*$", head): - match_literal = re.match(r"^((?:\'?[0-9a-zA-Z_])*)(.*)$", "'" + tail) - collapsed += head + match_literal.group(1).replace("'", "") - elided = match_literal.group(2) - else: - second_quote = tail.find("'") - if second_quote >= 0: - collapsed += head + "''" - elided = tail[second_quote + 1 :] - else: - # Unmatched single quote - collapsed += elided - break - - return collapsed - - -def FindEndOfExpressionInLine(line, startpos, stack): - """Find the position just after the end of current parenthesized expression. - - Args: - line: a CleansedLines line. - startpos: start searching at this position. - stack: nesting stack at startpos. - - Returns: - On finding matching end: (index just after matching end, None) - On finding an unclosed expression: (-1, None) - Otherwise: (-1, new stack at end of this line) - """ - for i in range(startpos, len(line)): - char = line[i] - if char in "([{": - # Found start of parenthesized expression, push to expression stack - stack.append(char) - elif char == "<": - # Found potential start of template argument list - if i > 0 and line[i - 1] == "<": - # Left shift operator - if stack and stack[-1] == "<": - stack.pop() - if not stack: - return (-1, None) - elif i > 0 and re.search(r"\boperator\s*$", line[0:i]): - # operator<, don't add to stack - continue - else: - # Tentative start of template argument list - stack.append("<") - elif char in ")]}": - # Found end of parenthesized expression. - # - # If we are currently expecting a matching '>', the pending '<' - # must have been an operator. Remove them from expression stack. - while stack and stack[-1] == "<": - stack.pop() - if not stack: - return (-1, None) - if ( - (stack[-1] == "(" and char == ")") - or (stack[-1] == "[" and char == "]") - or (stack[-1] == "{" and char == "}") - ): - stack.pop() - if not stack: - return (i + 1, None) - else: - # Mismatched parentheses - return (-1, None) - elif char == ">": - # Found potential end of template argument list. - - # Ignore "->" and operator functions - if i > 0 and (line[i - 1] == "-" or re.search(r"\boperator\s*$", line[0 : i - 1])): - continue - - # Pop the stack if there is a matching '<'. Otherwise, ignore - # this '>' since it must be an operator. - if stack and stack[-1] == "<": - stack.pop() - if not stack: - return (i + 1, None) - elif char == ";": - # Found something that look like end of statements. If we are currently - # expecting a '>', the matching '<' must have been an operator, since - # template argument list should not contain statements. - while stack and stack[-1] == "<": - stack.pop() - if not stack: - return (-1, None) - - # Did not find end of expression or unbalanced parentheses on this line - return (-1, stack) - - -def CloseExpression(clean_lines, linenum, pos): - """If input points to ( or { or [ or <, finds the position that closes it. - - If lines[linenum][pos] points to a '(' or '{' or '[' or '<', finds the - linenum/pos that correspond to the closing of the expression. - - TODO(google): cpplint spends a fair bit of time matching parentheses. - Ideally we would want to index all opening and closing parentheses once - and have CloseExpression be just a simple lookup, but due to preprocessor - tricks, this is not so easy. - - Args: - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - pos: A position on the line. - - Returns: - A tuple (line, linenum, pos) pointer *past* the closing brace, or - (line, len(lines), -1) if we never find a close. Note we ignore - strings and comments when matching; and the line we return is the - 'cleansed' line at linenum. - """ - - line = clean_lines.elided[linenum] - if (line[pos] not in "({[<") or re.match(r"<[<=]", line[pos:]): - return (line, clean_lines.NumLines(), -1) - - # Check first line - (end_pos, stack) = FindEndOfExpressionInLine(line, pos, []) - if end_pos > -1: - return (line, linenum, end_pos) - - # Continue scanning forward - while stack and linenum < clean_lines.NumLines() - 1: - linenum += 1 - line = clean_lines.elided[linenum] - (end_pos, stack) = FindEndOfExpressionInLine(line, 0, stack) - if end_pos > -1: - return (line, linenum, end_pos) - - # Did not find end of expression before end of file, give up - return (line, clean_lines.NumLines(), -1) - - -def FindStartOfExpressionInLine(line, endpos, stack): - """Find position at the matching start of current expression. - - This is almost the reverse of FindEndOfExpressionInLine, but note - that the input position and returned position differs by 1. - - Args: - line: a CleansedLines line. - endpos: start searching at this position. - stack: nesting stack at endpos. - - Returns: - On finding matching start: (index at matching start, None) - On finding an unclosed expression: (-1, None) - Otherwise: (-1, new stack at beginning of this line) - """ - i = endpos - while i >= 0: - char = line[i] - if char in ")]}": - # Found end of expression, push to expression stack - stack.append(char) - elif char == ">": - # Found potential end of template argument list. - # - # Ignore it if it's a "->" or ">=" or "operator>" - if i > 0 and ( - line[i - 1] == "-" - or re.match(r"\s>=\s", line[i - 1 :]) - or re.search(r"\boperator\s*$", line[0:i]) - ): - i -= 1 - else: - stack.append(">") - elif char == "<": - # Found potential start of template argument list - if i > 0 and line[i - 1] == "<": - # Left shift operator - i -= 1 - else: - # If there is a matching '>', we can pop the expression stack. - # Otherwise, ignore this '<' since it must be an operator. - if stack and stack[-1] == ">": - stack.pop() - if not stack: - return (i, None) - elif char in "([{": - # Found start of expression. - # - # If there are any unmatched '>' on the stack, they must be - # operators. Remove those. - while stack and stack[-1] == ">": - stack.pop() - if not stack: - return (-1, None) - if ( - (char == "(" and stack[-1] == ")") - or (char == "[" and stack[-1] == "]") - or (char == "{" and stack[-1] == "}") - ): - stack.pop() - if not stack: - return (i, None) - else: - # Mismatched parentheses - return (-1, None) - elif char == ";": - # Found something that look like end of statements. If we are currently - # expecting a '<', the matching '>' must have been an operator, since - # template argument list should not contain statements. - while stack and stack[-1] == ">": - stack.pop() - if not stack: - return (-1, None) - - i -= 1 - - return (-1, stack) - - -def ReverseCloseExpression(clean_lines, linenum, pos): - """If input points to ) or } or ] or >, finds the position that opens it. - - If lines[linenum][pos] points to a ')' or '}' or ']' or '>', finds the - linenum/pos that correspond to the opening of the expression. - - Args: - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - pos: A position on the line. - - Returns: - A tuple (line, linenum, pos) pointer *at* the opening brace, or - (line, 0, -1) if we never find the matching opening brace. Note - we ignore strings and comments when matching; and the line we - return is the 'cleansed' line at linenum. - """ - line = clean_lines.elided[linenum] - if line[pos] not in ")}]>": - return (line, 0, -1) - - # Check last line - (start_pos, stack) = FindStartOfExpressionInLine(line, pos, []) - if start_pos > -1: - return (line, linenum, start_pos) - - # Continue scanning backward - while stack and linenum > 0: - linenum -= 1 - line = clean_lines.elided[linenum] - (start_pos, stack) = FindStartOfExpressionInLine(line, len(line) - 1, stack) - if start_pos > -1: - return (line, linenum, start_pos) - - # Did not find start of expression before beginning of file, give up - return (line, 0, -1) - - -def CheckForCopyright(filename, lines, error): - """Logs an error if no Copyright message appears at the top of the file.""" - - # We'll say it should occur by line 10. Don't forget there's a - # placeholder line at the front. - for line in range(1, min(len(lines), 11)): - if re.search(r"Copyright", lines[line], re.IGNORECASE): - break - else: # means no copyright line was found - error( - filename, - 0, - "legal/copyright", - 5, - "No copyright message found. " - 'You should have a line: "Copyright [year] "', - ) - - -def GetIndentLevel(line): - """Return the number of leading spaces in line. - - Args: - line: A string to check. - - Returns: - An integer count of leading spaces, possibly zero. - """ - if indent := re.match(r"^( *)\S", line): - return len(indent.group(1)) - return 0 - - -def PathSplitToList(path): - """Returns the path split into a list by the separator. - - Args: - path: An absolute or relative path (e.g. '/a/b/c/' or '../a') - - Returns: - A list of path components (e.g. ['a', 'b', 'c]). - """ - lst = [] - while True: - (head, tail) = os.path.split(path) - if head == path: # absolute paths end - lst.append(head) - break - if tail == path: # relative paths end - lst.append(tail) - break - - path = head - lst.append(tail) - - lst.reverse() - return lst - - -def GetHeaderGuardCPPVariable(filename): - """Returns the CPP variable that should be used as a header guard. - - Args: - filename: The name of a C++ header file. - - Returns: - The CPP variable that should be used as a header guard in the - named file. - - """ - - # Restores original filename in case that cpplint is invoked from Emacs's - # flymake. - filename = re.sub(r"_flymake\.h$", ".h", filename) - filename = re.sub(r"/\.flymake/([^/]*)$", r"/\1", filename) - # Replace 'c++' with 'cpp'. - filename = filename.replace("C++", "cpp").replace("c++", "cpp") - - fileinfo = FileInfo(filename) - file_path_from_root = fileinfo.RepositoryName() - - def FixupPathFromRoot(): - if _root_debug: - sys.stderr.write( - f"\n_root fixup, _root = '{_root}'," - f" repository name = '{fileinfo.RepositoryName()}'\n" - ) - - # Process the file path with the --root flag if it was set. - if not _root: - if _root_debug: - sys.stderr.write("_root unspecified\n") - return file_path_from_root - - def StripListPrefix(lst, prefix): - # f(['x', 'y'], ['w, z']) -> None (not a valid prefix) - if lst[: len(prefix)] != prefix: - return None - # f(['a, 'b', 'c', 'd'], ['a', 'b']) -> ['c', 'd'] - return lst[(len(prefix)) :] - - # root behavior: - # --root=subdir , lstrips subdir from the header guard - maybe_path = StripListPrefix(PathSplitToList(file_path_from_root), PathSplitToList(_root)) - - if _root_debug: - sys.stderr.write( - ("_root lstrip (maybe_path=%s, file_path_from_root=%s," + " _root=%s)\n") - % (maybe_path, file_path_from_root, _root) - ) - - if maybe_path: - return os.path.join(*maybe_path) - - # --root=.. , will prepend the outer directory to the header guard - full_path = fileinfo.FullName() - # adapt slashes for windows - root_abspath = os.path.abspath(_root).replace("\\", "/") - - maybe_path = StripListPrefix(PathSplitToList(full_path), PathSplitToList(root_abspath)) - - if _root_debug: - sys.stderr.write( - ("_root prepend (maybe_path=%s, full_path=%s, " + "root_abspath=%s)\n") - % (maybe_path, full_path, root_abspath) - ) - - if maybe_path: - return os.path.join(*maybe_path) - - if _root_debug: - sys.stderr.write(f"_root ignore, returning {file_path_from_root}\n") - - # --root=FAKE_DIR is ignored - return file_path_from_root - - file_path_from_root = FixupPathFromRoot() - return re.sub(r"[^a-zA-Z0-9]", "_", file_path_from_root).upper() + "_" - - -def CheckForHeaderGuard(filename, clean_lines, error, cppvar): - """Checks that the file contains a header guard. - - Logs an error if no #ifndef header guard is present. For other - headers, checks that the full pathname is used. - - Args: - filename: The name of the C++ header file. - clean_lines: A CleansedLines instance containing the file. - error: The function to call with any errors found. - """ - - # Don't check for header guards if there are error suppression - # comments somewhere in this file. - # - # Because this is silencing a warning for a nonexistent line, we - # only support the very specific NOLINT(build/header_guard) syntax, - # and not the general NOLINT or NOLINT(*) syntax. - raw_lines = clean_lines.lines_without_raw_strings - for i in raw_lines: - if re.search(r"//\s*NOLINT\(build/header_guard\)", i): - return - - # Allow pragma once instead of header guards - for i in raw_lines: - if re.search(r"^\s*#pragma\s+once", i): - return - - ifndef = "" - ifndef_linenum = 0 - define = "" - endif = "" - endif_linenum = 0 - for linenum, line in enumerate(raw_lines): - linesplit = line.split() - if len(linesplit) >= 2: - # find the first occurrence of #ifndef and #define, save arg - if not ifndef and linesplit[0] == "#ifndef": - # set ifndef to the header guard presented on the #ifndef line. - ifndef = linesplit[1] - ifndef_linenum = linenum - if not define and linesplit[0] == "#define": - define = linesplit[1] - # find the last occurrence of #endif, save entire line - if line.startswith("#endif"): - endif = line - endif_linenum = linenum - - if not ifndef or not define or ifndef != define: - error( - filename, - 0, - "build/header_guard", - 5, - f"No #ifndef header guard found, suggested CPP variable is: {cppvar}", - ) - return - - # The guard should be PATH_FILE_H_, but we also allow PATH_FILE_H__ - # for backward compatibility. - if ifndef != cppvar: - error_level = 0 - if ifndef != cppvar + "_": - error_level = 5 - - ParseNolintSuppressions(filename, raw_lines[ifndef_linenum], ifndef_linenum, error) - error( - filename, - ifndef_linenum, - "build/header_guard", - error_level, - f"#ifndef header guard has wrong style, please use: {cppvar}", - ) - - # Check for "//" comments on endif line. - ParseNolintSuppressions(filename, raw_lines[endif_linenum], endif_linenum, error) - match = re.match(r"#endif\s*//\s*" + cppvar + r"(_)?\b", endif) - if match: - if match.group(1) == "_": - # Issue low severity warning for deprecated double trailing underscore - error( - filename, - endif_linenum, - "build/header_guard", - 0, - f'#endif line should be "#endif // {cppvar}"', - ) - return - - # Didn't find the corresponding "//" comment. If this file does not - # contain any "//" comments at all, it could be that the compiler - # only wants "/**/" comments, look for those instead. - no_single_line_comments = True - for i in range(1, len(raw_lines) - 1): - line = raw_lines[i] - if re.match(r'^(?:(?:\'(?:\.|[^\'])*\')|(?:"(?:\.|[^"])*")|[^\'"])*//', line): - no_single_line_comments = False - break - - if no_single_line_comments: - match = re.match(r"#endif\s*/\*\s*" + cppvar + r"(_)?\s*\*/", endif) - if match: - if match.group(1) == "_": - # Low severity warning for double trailing underscore - error( - filename, - endif_linenum, - "build/header_guard", - 0, - f'#endif line should be "#endif /* {cppvar} */"', - ) - return - - # Didn't find anything - error( - filename, - endif_linenum, - "build/header_guard", - 5, - f'#endif line should be "#endif // {cppvar}"', - ) - - -def CheckHeaderFileIncluded(filename, include_state, error): - """Logs an error if a source file does not include its header.""" - - # Do not check test files - fileinfo = FileInfo(filename) - if re.search(_TEST_FILE_SUFFIX, fileinfo.BaseName()): - return - - first_include = message = None - basefilename = filename[0 : len(filename) - len(fileinfo.Extension())] - for ext in GetHeaderExtensions(): - headerfile = basefilename + "." + ext - if not os.path.exists(headerfile): - continue - headername = FileInfo(headerfile).RepositoryName() - include_uses_unix_dir_aliases = False - for section_list in include_state.include_list: - for f in section_list: - include_text = f[0] - if "./" in include_text: - include_uses_unix_dir_aliases = True - if headername in include_text or include_text in headername: - return - if not first_include: - first_include = f[1] - - message = f"{fileinfo.RepositoryName()} should include its header file {headername}" - if include_uses_unix_dir_aliases: - message += ". Relative paths like . and .. are not allowed." - - if message: - error(filename, first_include, "build/include", 5, message) - - -def CheckForBadCharacters(filename, lines, error): - """Logs an error for each line containing bad characters. - - Two kinds of bad characters: - - 1. Unicode replacement characters: These indicate that either the file - contained invalid UTF-8 (likely) or Unicode replacement characters (which - it shouldn't). Note that it's possible for this to throw off line - numbering if the invalid UTF-8 occurred adjacent to a newline. - - 2. NUL bytes. These are problematic for some tools. - - Args: - filename: The name of the current file. - lines: An array of strings, each representing a line of the file. - error: The function to call with any errors found. - """ - for linenum, line in enumerate(lines): - if "\ufffd" in line: - error( - filename, - linenum, - "readability/utf8", - 5, - "Line contains invalid UTF-8 (or Unicode replacement character).", - ) - if "\0" in line: - error(filename, linenum, "readability/nul", 5, "Line contains NUL byte.") - - -def CheckInlineHeader(filename, include_state, error): - """Logs an error if both a header and its inline variant are included.""" - - all_headers = dict(item for sublist in include_state.include_list - for item in sublist) - bad_headers = set('%s.h' % name[:-6] for name in all_headers.keys() - if name.endswith('-inl.h')) - bad_headers &= set(all_headers.keys()) - - for name in bad_headers: - err = '%s includes both %s and %s-inl.h' % (filename, name, name) - linenum = all_headers[name] - error(filename, linenum, 'build/include_inline', 5, err) - - -def CheckForNewlineAtEOF(filename, lines, error): - """Logs an error if there is no newline char at the end of the file. - - Args: - filename: The name of the current file. - lines: An array of strings, each representing a line of the file. - error: The function to call with any errors found. - """ - - # The array lines() was created by adding two newlines to the - # original file (go figure), then splitting on \n. - # To verify that the file ends in \n, we just have to make sure the - # last-but-two element of lines() exists and is empty. - if len(lines) < 3 or lines[-2]: - error( - filename, - len(lines) - 2, - "whitespace/ending_newline", - 5, - "Could not find a newline character at the end of the file.", - ) - - -def CheckForMultilineCommentsAndStrings(filename, clean_lines, linenum, error): - """Logs an error if we see /* ... */ or "..." that extend past one line. - - /* ... */ comments are legit inside macros, for one line. - Otherwise, we prefer // comments, so it's ok to warn about the - other. Likewise, it's ok for strings to extend across multiple - lines, as long as a line continuation character (backslash) - terminates each line. Although not currently prohibited by the C++ - style guide, it's ugly and unnecessary. We don't do well with either - in this lint program, so we warn about both. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - line = clean_lines.elided[linenum] - - # Remove all \\ (escaped backslashes) from the line. They are OK, and the - # second (escaped) slash may trigger later \" detection erroneously. - line = line.replace("\\\\", "") - - if line.count("/*") > line.count("*/"): - error( - filename, - linenum, - "readability/multiline_comment", - 5, - "Complex multi-line /*...*/-style comment found. " - "Lint may give bogus warnings. " - "Consider replacing these with //-style comments, " - "with #if 0...#endif, " - "or with more clearly structured multi-line comments.", - ) - - if (line.count('"') - line.count('\\"')) % 2: - error( - filename, - linenum, - "readability/multiline_string", - 5, - 'Multi-line string ("...") found. This lint script doesn\'t ' - "do well with such strings, and may give bogus warnings. " - "Use C++11 raw strings or concatenation instead.", - ) - - -# (non-threadsafe name, thread-safe alternative, validation pattern) -# -# The validation pattern is used to eliminate false positives such as: -# _rand(); // false positive due to substring match. -# ->rand(); // some member function rand(). -# ACMRandom rand(seed); // some variable named rand. -# ISAACRandom rand(); // another variable named rand. -# -# Basically we require the return value of these functions to be used -# in some expression context on the same line by matching on some -# operator before the function name. This eliminates constructors and -# member function calls. -_UNSAFE_FUNC_PREFIX = r"(?:[-+*/=%^&|(<]\s*|>\s+)" -_THREADING_LIST = ( - ("asctime(", "asctime_r(", _UNSAFE_FUNC_PREFIX + r"asctime\([^)]+\)"), - ("ctime(", "ctime_r(", _UNSAFE_FUNC_PREFIX + r"ctime\([^)]+\)"), - ("getgrgid(", "getgrgid_r(", _UNSAFE_FUNC_PREFIX + r"getgrgid\([^)]+\)"), - ("getgrnam(", "getgrnam_r(", _UNSAFE_FUNC_PREFIX + r"getgrnam\([^)]+\)"), - ("getlogin(", "getlogin_r(", _UNSAFE_FUNC_PREFIX + r"getlogin\(\)"), - ("getpwnam(", "getpwnam_r(", _UNSAFE_FUNC_PREFIX + r"getpwnam\([^)]+\)"), - ("getpwuid(", "getpwuid_r(", _UNSAFE_FUNC_PREFIX + r"getpwuid\([^)]+\)"), - ("gmtime(", "gmtime_r(", _UNSAFE_FUNC_PREFIX + r"gmtime\([^)]+\)"), - ("localtime(", "localtime_r(", _UNSAFE_FUNC_PREFIX + r"localtime\([^)]+\)"), - ("rand(", "rand_r(", _UNSAFE_FUNC_PREFIX + r"rand\(\)"), - ("strtok(", "strtok_r(", _UNSAFE_FUNC_PREFIX + r"strtok\([^)]+\)"), - ("ttyname(", "ttyname_r(", _UNSAFE_FUNC_PREFIX + r"ttyname\([^)]+\)"), -) - - -def CheckPosixThreading(filename, clean_lines, linenum, error): - """Checks for calls to thread-unsafe functions. - - Much code has been originally written without consideration of - multi-threading. Also, engineers are relying on their old experience; - they have learned posix before threading extensions were added. These - tests guide the engineers to use thread-safe functions (when using - posix directly). - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - line = clean_lines.elided[linenum] - for single_thread_func, multithread_safe_func, pattern in _THREADING_LIST: - # Additional pattern matching check to confirm that this is the - # function we are looking for - if re.search(pattern, line): - error( - filename, - linenum, - "runtime/threadsafe_fn", - 2, - "Consider using " - + multithread_safe_func - + "...) instead of " - + single_thread_func - + "...) for improved thread safety.", - ) - - -def CheckVlogArguments(filename, clean_lines, linenum, error): - """Checks that VLOG() is only used for defining a logging level. - - For example, VLOG(2) is correct. VLOG(INFO), VLOG(WARNING), VLOG(ERROR), and - VLOG(FATAL) are not. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - line = clean_lines.elided[linenum] - if re.search(r"\bVLOG\((INFO|ERROR|WARNING|DFATAL|FATAL)\)", line): - error( - filename, - linenum, - "runtime/vlog", - 5, - "VLOG() should be used with numeric verbosity level. " - "Use LOG() if you want symbolic severity levels.", - ) - - -# Matches invalid increment: *count++, which moves pointer instead of -# incrementing a value. -_RE_PATTERN_INVALID_INCREMENT = re.compile(r"^\s*\*\w+(\+\+|--);") - - -def CheckInvalidIncrement(filename, clean_lines, linenum, error): - """Checks for invalid increment *count++. - - For example following function: - void increment_counter(int* count) { - *count++; - } - is invalid, because it effectively does count++, moving pointer, and should - be replaced with ++*count, (*count)++ or *count += 1. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - line = clean_lines.elided[linenum] - if _RE_PATTERN_INVALID_INCREMENT.match(line): - error( - filename, - linenum, - "runtime/invalid_increment", - 5, - "Changing pointer instead of value (or unused value of operator*).", - ) - - -def IsMacroDefinition(clean_lines, linenum): - if re.search(r"^#define", clean_lines[linenum]): - return True - - return bool(linenum > 0 and re.search(r"\\$", clean_lines[linenum - 1])) - - -def IsForwardClassDeclaration(clean_lines, linenum): - return re.match(r"^\s*(\btemplate\b)*.*class\s+\w+;\s*$", clean_lines[linenum]) - - -class _BlockInfo: - """Stores information about a generic block of code.""" - - def __init__(self, linenum, seen_open_brace): - self.starting_linenum = linenum - self.seen_open_brace = seen_open_brace - self.open_parentheses = 0 - self.inline_asm = _NO_ASM - self.check_namespace_indentation = False - - def CheckBegin(self, filename, clean_lines, linenum, error): - """Run checks that applies to text up to the opening brace. - - This is mostly for checking the text after the class identifier - and the "{", usually where the base class is specified. For other - blocks, there isn't much to check, so we always pass. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - pass - - def CheckEnd(self, filename, clean_lines, linenum, error): - """Run checks that applies to text after the closing brace. - - This is mostly used for checking end of namespace comments. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - pass - - def IsBlockInfo(self): - """Returns true if this block is a _BlockInfo. - - This is convenient for verifying that an object is an instance of - a _BlockInfo, but not an instance of any of the derived classes. - - Returns: - True for this class, False for derived classes. - """ - return self.__class__ == _BlockInfo - - -class _ExternCInfo(_BlockInfo): - """Stores information about an 'extern "C"' block.""" - - def __init__(self, linenum): - _BlockInfo.__init__(self, linenum, True) - - -class _ClassInfo(_BlockInfo): - """Stores information about a class.""" - - def __init__(self, name, class_or_struct, clean_lines, linenum): - _BlockInfo.__init__(self, linenum, False) - self.name = name - self.is_derived = False - self.check_namespace_indentation = True - if class_or_struct == "struct": - self.access = "public" - self.is_struct = True - else: - self.access = "private" - self.is_struct = False - - # Remember initial indentation level for this class. Using raw_lines here - # instead of elided to account for leading comments. - self.class_indent = GetIndentLevel(clean_lines.raw_lines[linenum]) - - # Try to find the end of the class. This will be confused by things like: - # class A { - # } *x = { ... - # - # But it's still good enough for CheckSectionSpacing. - self.last_line = 0 - depth = 0 - for i in range(linenum, clean_lines.NumLines()): - line = clean_lines.elided[i] - depth += line.count("{") - line.count("}") - if not depth: - self.last_line = i - break - - def CheckBegin(self, filename, clean_lines, linenum, error): - # Look for a bare ':' - if re.search("(^|[^:]):($|[^:])", clean_lines.elided[linenum]): - self.is_derived = True - - def CheckEnd(self, filename, clean_lines, linenum, error): - # If there is a DISALLOW macro, it should appear near the end of - # the class. - seen_last_thing_in_class = False - for i in range(linenum - 1, self.starting_linenum, -1): - match = re.search( - r"\b(DISALLOW_COPY_AND_ASSIGN|DISALLOW_IMPLICIT_CONSTRUCTORS)\(" - + self.name - + r"\)", - clean_lines.elided[i], - ) - if match: - if seen_last_thing_in_class: - error( - filename, - i, - "readability/constructors", - 3, - match.group(1) + " should be the last thing in the class", - ) - break - - if not re.match(r"^\s*$", clean_lines.elided[i]): - seen_last_thing_in_class = True - - # Check that closing brace is aligned with beginning of the class. - # Only do this if the closing brace is indented by only whitespaces. - # This means we will not check single-line class definitions. - indent = re.match(r"^( *)\}", clean_lines.elided[linenum]) - if indent and len(indent.group(1)) != self.class_indent: - if self.is_struct: - parent = "struct " + self.name - else: - parent = "class " + self.name - error( - filename, - linenum, - "whitespace/indent", - 3, - f"Closing brace should be aligned with beginning of {parent}", - ) - - -class _ConstructorInfo(_BlockInfo): - """Stores information about a constructor. - For detecting member initializer lists.""" - - def __init__(self, linenum: int): - _BlockInfo.__init__(self, linenum, seen_open_brace=False) - - -class _NamespaceInfo(_BlockInfo): - """Stores information about a namespace.""" - - def __init__(self, name, linenum): - _BlockInfo.__init__(self, linenum, False) - self.name = name or "" - self.check_namespace_indentation = True - - def CheckEnd(self, filename, clean_lines, linenum, error): - """Check end of namespace comments.""" - line = clean_lines.raw_lines[linenum] - - # Check how many lines is enclosed in this namespace. Don't issue - # warning for missing namespace comments if there aren't enough - # lines. However, do apply checks if there is already an end of - # namespace comment and it's incorrect. - # - # TODO(google): We always want to check end of namespace comments - # if a namespace is large, but sometimes we also want to apply the - # check if a short namespace contained nontrivial things (something - # other than forward declarations). There is currently no logic on - # deciding what these nontrivial things are, so this check is - # triggered by namespace size only, which works most of the time. - if linenum - self.starting_linenum < 10 and not re.match( - r"^\s*};*\s*(//|/\*).*\bnamespace\b", line - ): - return - - # Look for matching comment at end of namespace. - # - # Note that we accept C style "/* */" comments for terminating - # namespaces, so that code that terminate namespaces inside - # preprocessor macros can be cpplint clean. - # - # We also accept stuff like "// end of namespace ." with the - # period at the end. - # - # Besides these, we don't accept anything else, otherwise we might - # get false negatives when existing comment is a substring of the - # expected namespace. - if self.name: - # Named namespace - if not re.match( - (r"^\s*};*\s*(//|/\*).*\bnamespace\s+" + re.escape(self.name) + r"[\*/\.\\\s]*$"), - line, - ): - error( - filename, - linenum, - "readability/namespace", - 5, - f'Namespace should be terminated with "// namespace {self.name}"', - ) - else: - # Anonymous namespace - if not re.match(r"^\s*};*\s*(//|/\*).*\bnamespace[\*/\.\\\s]*$", line): - # If "// namespace anonymous" or "// anonymous namespace (more text)", - # mention "// anonymous namespace" as an acceptable form - if re.match(r"^\s*}.*\b(namespace anonymous|anonymous namespace)\b", line): - error( - filename, - linenum, - "readability/namespace", - 5, - 'Anonymous namespace should be terminated with "// namespace"' - ' or "// anonymous namespace"', - ) - else: - error( - filename, - linenum, - "readability/namespace", - 5, - 'Anonymous namespace should be terminated with "// namespace"', - ) - - -class _WrappedInfo(_BlockInfo): - """Stores information about parentheses, initializer lists, etc. - Not exactly a block but we do need the same signature. - Needed to avoid namespace indentation false positives, - though parentheses tracking would slow us down a lot - and is effectively already done by open_parentheses.""" - - pass - - -class _MemInitListInfo(_WrappedInfo): - """Stores information about member initializer lists.""" - - pass - - -class _PreprocessorInfo: - """Stores checkpoints of nesting stacks when #if/#else is seen.""" - - def __init__(self, stack_before_if): - # The entire nesting stack before #if - self.stack_before_if = stack_before_if - - # The entire nesting stack up to #else - self.stack_before_else = [] - - # Whether we have already seen #else or #elif - self.seen_else = False - - -class NestingState: - """Holds states related to parsing braces.""" - - def __init__(self): - # Stack for tracking all braces. An object is pushed whenever we - # see a "{", and popped when we see a "}". Only 3 types of - # objects are possible: - # - _ClassInfo: a class or struct. - # - _NamespaceInfo: a namespace. - # - _BlockInfo: some other type of block. - self.stack: list[_BlockInfo] = [] - - # Top of the previous stack before each Update(). - # - # Because the nesting_stack is updated at the end of each line, we - # had to do some convoluted checks to find out what is the current - # scope at the beginning of the line. This check is simplified by - # saving the previous top of nesting stack. - # - # We could save the full stack, but we only need the top. Copying - # the full nesting stack would slow down cpplint by ~10%. - self.previous_stack_top: _BlockInfo | None = None - - # The number of open parentheses in the previous stack top before the last update. - # Used to prevent false indentation detection when e.g. a function parameter is indented. - # We can't use previous_stack_top, a shallow copy whose open_parentheses value is updated. - self.previous_open_parentheses = 0 - - # The last stack item we popped. - self.popped_top: _BlockInfo | None = None - - # Stack of _PreprocessorInfo objects. - self.pp_stack = [] - - def SeenOpenBrace(self): - """Check if we have seen the opening brace for the innermost block. - - Returns: - True if we have seen the opening brace, False if the innermost - block is still expecting an opening brace. - """ - return (not self.stack) or self.stack[-1].seen_open_brace - - def InNamespaceBody(self): - """Check if we are currently one level inside a namespace body. - - Returns: - True if top of the stack is a namespace block, False otherwise. - """ - return self.stack and isinstance(self.stack[-1], _NamespaceInfo) - - def InExternC(self): - """Check if we are currently one level inside an 'extern "C"' block. - - Returns: - True if top of the stack is an extern block, False otherwise. - """ - return self.stack and isinstance(self.stack[-1], _ExternCInfo) - - def InClassDeclaration(self): - """Check if we are currently one level inside a class or struct declaration. - - Returns: - True if top of the stack is a class/struct, False otherwise. - """ - return self.stack and isinstance(self.stack[-1], _ClassInfo) - - def InAsmBlock(self): - """Check if we are currently one level inside an inline ASM block. - - Returns: - True if the top of the stack is a block containing inline ASM. - """ - return self.stack and self.stack[-1].inline_asm != _NO_ASM - - def InBlockScope(self): - """Check if we are currently one level inside a block scope. - - Returns: - True if top of the stack is a block scope, False otherwise. - """ - return len(self.stack) > 0 and not isinstance(self.stack[-1], _NamespaceInfo) - - def InTemplateArgumentList(self, clean_lines, linenum, pos): - """Check if current position is inside template argument list. - - Args: - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - pos: position just after the suspected template argument. - Returns: - True if (linenum, pos) is inside template arguments. - """ - while linenum < clean_lines.NumLines(): - # Find the earliest character that might indicate a template argument - line = clean_lines.elided[linenum] - match = re.match(r"^[^{};=\[\]\.<>]*(.)", line[pos:]) - if not match: - linenum += 1 - pos = 0 - continue - token = match.group(1) - pos += len(match.group(0)) - - # These things do not look like template argument list: - # class Suspect { - # class Suspect x; } - if token in ("{", "}", ";"): - return False - - # These things look like template argument list: - # template - # template - # template - # template - if token in (">", "=", "[", "]", "."): - return True - - # Check if token is an unmatched '<'. - # If not, move on to the next character. - if token != "<": - pos += 1 - if pos >= len(line): - linenum += 1 - pos = 0 - continue - - # We can't be sure if we just find a single '<', and need to - # find the matching '>'. - (_, end_line, end_pos) = CloseExpression(clean_lines, linenum, pos - 1) - if end_pos < 0: - # Not sure if template argument list or syntax error in file - return False - linenum = end_line - pos = end_pos - return False - - def UpdatePreprocessor(self, line): - """Update preprocessor stack. - - We need to handle preprocessors due to classes like this: - #ifdef SWIG - struct ResultDetailsPageElementExtensionPoint { - #else - struct ResultDetailsPageElementExtensionPoint : public Extension { - #endif - - We make the following assumptions (good enough for most files): - - Preprocessor condition evaluates to true from #if up to first - #else/#elif/#endif. - - - Preprocessor condition evaluates to false from #else/#elif up - to #endif. We still perform lint checks on these lines, but - these do not affect nesting stack. - - Args: - line: current line to check. - """ - if re.match(r"^\s*#\s*(if|ifdef|ifndef)\b", line): - # Beginning of #if block, save the nesting stack here. The saved - # stack will allow us to restore the parsing state in the #else case. - self.pp_stack.append(_PreprocessorInfo(copy.deepcopy(self.stack))) - elif re.match(r"^\s*#\s*(else|elif)\b", line): - # Beginning of #else block - if self.pp_stack: - if not self.pp_stack[-1].seen_else: - # This is the first #else or #elif block. Remember the - # whole nesting stack up to this point. This is what we - # keep after the #endif. - self.pp_stack[-1].seen_else = True - self.pp_stack[-1].stack_before_else = copy.deepcopy(self.stack) - - # Restore the stack to how it was before the #if - self.stack = copy.deepcopy(self.pp_stack[-1].stack_before_if) - else: - # TODO(google): unexpected #else, issue warning? - pass - elif re.match(r"^\s*#\s*endif\b", line): - # End of #if or #else blocks. - if self.pp_stack: - # If we saw an #else, we will need to restore the nesting - # stack to its former state before the #else, otherwise we - # will just continue from where we left off. - if self.pp_stack[-1].seen_else: - # Here we can just use a shallow copy since we are the last - # reference to it. - self.stack = self.pp_stack[-1].stack_before_else - # Drop the corresponding #if - self.pp_stack.pop() - else: - # TODO(google): unexpected #endif, issue warning? - pass - - def _Pop(self): - """Pop the innermost state (top of the stack) and remember the popped item.""" - self.popped_top = self.stack.pop() - - def _CountOpenParentheses(self, line: str): - # Count parentheses. This is to avoid adding struct arguments to - # the nesting stack. - if self.stack: - inner_block = self.stack[-1] - depth_change = line.count("(") - line.count(")") - inner_block.open_parentheses += depth_change - - # Also check if we are starting or ending an inline assembly block. - if inner_block.inline_asm in (_NO_ASM, _END_ASM): - if ( - depth_change != 0 - and inner_block.open_parentheses == 1 - and _MATCH_ASM.match(line) - ): - # Enter assembly block - inner_block.inline_asm = _INSIDE_ASM - else: - # Not entering assembly block. If previous line was _END_ASM, - # we will now shift to _NO_ASM state. - inner_block.inline_asm = _NO_ASM - elif inner_block.inline_asm == _INSIDE_ASM and inner_block.open_parentheses == 0: - # Exit assembly block - inner_block.inline_asm = _END_ASM - - def _UpdateNamesapce(self, line: str, linenum: int) -> str | None: - """ - Match start of namespace, append to stack, and consume line - Args: - line: Line to check and consume - linenum: Line number of the line to check - - Returns: - The consumed line if namespace matched; None otherwise - """ - # Match start of namespace. The "\b\s*" below catches namespace - # declarations even if it weren't followed by a whitespace, this - # is so that we don't confuse our namespace checker. The - # missing spaces will be flagged by CheckSpacing. - namespace_decl_match = re.match(r"^\s*namespace\b\s*([:\w]+)?(.*)$", line) - if not namespace_decl_match: - return None - - new_namespace = _NamespaceInfo(namespace_decl_match.group(1), linenum) - self.stack.append(new_namespace) - - line = namespace_decl_match.group(2) - if line.find("{") != -1: - new_namespace.seen_open_brace = True - line = line[line.find("{") + 1 :] - return line - - def _UpdateConstructor(self, line: str, linenum: int, class_name: str | None = None): - """ - Check if the given line is a constructor. - Args: - line: Line to check. - class_name: If line checked is inside of a class block, a str of the class's name; - otherwise, None. - """ - if not class_name: - if not re.match(r"\s*(\w*)\s*::\s*\1\s*\(", line): - return - elif not re.match(rf"\s*{re.escape(class_name)}\s*\(", line): - return - - self.stack.append(_ConstructorInfo(linenum)) - - # TODO(google): Update() is too long, but we will refactor later. - def Update(self, filename: str, clean_lines: CleansedLines, linenum: int, error): - """Update nesting state with current line. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - line = clean_lines.elided[linenum] - - # Remember top of the previous nesting stack. - # - # The stack is always pushed/popped and not modified in place, so - # we can just do a shallow copy instead of copy.deepcopy. Using - # deepcopy would slow down cpplint by ~28%. - if self.stack: - self.previous_stack_top = self.stack[-1] - self.previous_open_parentheses = self.stack[-1].open_parentheses - else: - self.previous_stack_top = None - - # Update pp_stack - self.UpdatePreprocessor(line) - - self._CountOpenParentheses(line) - - # Consume namespace declaration at the beginning of the line. Do - # this in a loop so that we catch same line declarations like this: - # namespace proto2 { namespace bridge { class MessageSet; } } - while (new_line := self._UpdateNamesapce(line, linenum)) is not None: # could be empty str - line = new_line - - # Look for a class declaration in whatever is left of the line - # after parsing namespaces. The regexp accounts for decorated classes - # such as in: - # class LOCKABLE API Object { - # }; - class_decl_match = re.match( - r"^(\s*(?:template\s*<[\w\s<>,:=]*>\s*)?" - r"(class|struct)\s+(?:[a-zA-Z0-9_]+\s+)*(\w+(?:::\w+)*))" - r"(.*)$", - line, - ) - if class_decl_match and (not self.stack or self.stack[-1].open_parentheses == 0): - # We do not want to accept classes that are actually template arguments: - # template , - # template class Ignore3> - # void Function() {}; - # - # To avoid template argument cases, we scan forward and look for - # an unmatched '>'. If we see one, assume we are inside a - # template argument list. - end_declaration = len(class_decl_match.group(1)) - if not self.InTemplateArgumentList(clean_lines, linenum, end_declaration): - self.stack.append( - _ClassInfo( - class_decl_match.group(3), class_decl_match.group(2), clean_lines, linenum - ) - ) - line = class_decl_match.group(4) - - # If we have not yet seen the opening brace for the innermost block, - # run checks here. - if not self.SeenOpenBrace(): - self.stack[-1].CheckBegin(filename, clean_lines, linenum, error) - - # Update access control if we are directly inside a class/struct - if self.stack and isinstance(self.stack[-1], _ClassInfo): - if self.stack[-1].seen_open_brace: - classinfo: _ClassInfo = self.stack[-1] - # Update access control - if access_match := re.match( - r"^(.*)\b(public|private|protected|signals)(\s+(?:slots\s*)?)?" - r":([^:].*|$)", - line, - ): - classinfo.access = access_match.group(2) - - # Check that access keywords are indented +1 space. Skip this - # check if the keywords are not preceded by whitespaces. - indent = access_match.group(1) - if len(indent) != classinfo.class_indent + 1 and re.match(r"^\s*$", indent): - if classinfo.is_struct: - parent = "struct " + classinfo.name - else: - parent = "class " + classinfo.name - slots = "" - if access_match.group(3): - slots = access_match.group(3) - error( - filename, - linenum, - "whitespace/indent", - 3, - f"{access_match.group(2)}{slots}:" - f" should be indented +1 space inside {parent}", - ) - - line = access_match.group(4) - else: - self._UpdateConstructor(line, linenum, class_name=classinfo.name) - else: # Not in class - self._UpdateConstructor(line, linenum) - - # If brace not open and we just finished a parenthetical definition, - # check if we're in a member initializer list following a constructor. - if ( - self.stack - and ( - isinstance(self.stack[-1], _ConstructorInfo) - or isinstance(self.previous_stack_top, _ConstructorInfo) - ) - and not self.stack[-1].seen_open_brace - and re.search(r"[^:]:[^:]", line) - ): - self.stack.append(_MemInitListInfo(linenum, seen_open_brace=False)) - - # Consume braces or semicolons from what's left of the line - while True: - # Match first brace, semicolon, or closed parenthesis. - matched = re.match(r"^[^{;)}]*([{;)}])(.*)$", line) - if not matched: - break - - token = matched.group(1) - if token == "{": - # If namespace or class hasn't seen an opening brace yet, mark - # namespace/class head as complete. Push a new block onto the - # stack otherwise. - if not self.SeenOpenBrace(): - # End of initializer list wrap if present - if isinstance(self.stack[-1], _MemInitListInfo): - self._Pop() - self.stack[-1].seen_open_brace = True - elif re.match(r'^extern\s*"[^"]*"\s*\{', line): - self.stack.append(_ExternCInfo(linenum)) - else: - self.stack.append(_BlockInfo(linenum, True)) - if _MATCH_ASM.match(line): - self.stack[-1].inline_asm = _BLOCK_ASM - elif token == ";": - # If we haven't seen an opening brace yet, but we already saw - # a semicolon, this is probably a forward declaration. Pop - # the stack for these. - if not self.SeenOpenBrace(): - self._Pop() - elif token == ")": - # Similarly, if we haven't seen an opening brace yet, but we - # already saw a closing parenthesis, then these are probably - # function arguments with extra "class" or "struct" keywords. - # Also pop these stack for these. - if ( - self.stack - and not self.stack[-1].seen_open_brace - and isinstance(self.stack[-1], _ClassInfo) - ): - self._Pop() - else: # token == '}' - # Perform end of block checks and pop the stack. - if self.stack: - self.stack[-1].CheckEnd(filename, clean_lines, linenum, error) - self._Pop() - line = matched.group(2) - - def InnermostClass(self): - """Get class info on the top of the stack. - - Returns: - A _ClassInfo object if we are inside a class, or None otherwise. - """ - for i in range(len(self.stack), 0, -1): - classinfo = self.stack[i - 1] - if isinstance(classinfo, _ClassInfo): - return classinfo - return None - - -def CheckForNonStandardConstructs(filename, clean_lines, linenum, nesting_state, error): - r"""Logs an error if we see certain non-ANSI constructs ignored by gcc-2. - - Complain about several constructs which gcc-2 accepts, but which are - not standard C++. Warning about these in lint is one way to ease the - transition to new compilers. - - put storage class first (e.g. "static const" instead of "const static"). - - "%lld" instead of %qd" in printf-type functions. - - "%1$d" is non-standard in printf-type functions. - - "\%" is an undefined character escape sequence. - - text after #endif is not allowed. - - invalid inner-style forward declaration. - - >? and ?= and )\?=?\s*(\w+|[+-]?\d+)(\.\d*)?", line): - error( - filename, - linenum, - "build/deprecated", - 3, - ">? and ))?' - # r'\s*const\s*' + type_name + '\s*&\s*\w+\s*;' - error( - filename, - linenum, - "runtime/member_string_references", - 2, - "const string& members are dangerous. It is much better to use " - "alternatives, such as pointers or simple constants.", - ) - - # Everything else in this function operates on class declarations. - # Return early if the top of the nesting stack is not a class, or if - # the class head is not completed yet. - classinfo = nesting_state.InnermostClass() - if not classinfo or not classinfo.seen_open_brace: - return - - # The class may have been declared with namespace or classname qualifiers. - # The constructor and destructor will not have those qualifiers. - base_classname = classinfo.name.split("::")[-1] - - # Look for single-argument constructors that aren't marked explicit. - # Technically a valid construct, but against style. - explicit_constructor_match = re.match( - r"\s+(?:(?:inline|constexpr)\s+)*(explicit\s+)?" - rf"(?:(?:inline|constexpr)\s+)*{re.escape(base_classname)}\s*" - r"\(((?:[^()]|\([^()]*\))*)\)", - line, - ) - - if explicit_constructor_match: - is_marked_explicit = explicit_constructor_match.group(1) - - if not explicit_constructor_match.group(2): - constructor_args = [] - else: - constructor_args = explicit_constructor_match.group(2).split(",") - - # collapse arguments so that commas in template parameter lists and function - # argument parameter lists don't split arguments in two - i = 0 - while i < len(constructor_args): - constructor_arg = constructor_args[i] - while constructor_arg.count("<") > constructor_arg.count(">") or constructor_arg.count( - "(" - ) > constructor_arg.count(")"): - constructor_arg += "," + constructor_args[i + 1] - del constructor_args[i + 1] - constructor_args[i] = constructor_arg - i += 1 - - variadic_args = [arg for arg in constructor_args if "&&..." in arg] - defaulted_args = [arg for arg in constructor_args if "=" in arg] - noarg_constructor = ( - not constructor_args # empty arg list - or - # 'void' arg specifier - (len(constructor_args) == 1 and constructor_args[0].strip() == "void") - ) - onearg_constructor = ( - ( - len(constructor_args) == 1 # exactly one arg - and not noarg_constructor - ) - or - # all but at most one arg defaulted - ( - len(constructor_args) >= 1 - and not noarg_constructor - and len(defaulted_args) >= len(constructor_args) - 1 - ) - or - # variadic arguments with zero or one argument - (len(constructor_args) <= 2 and len(variadic_args) >= 1) - ) - initializer_list_constructor = bool( - onearg_constructor - and re.search(r"\bstd\s*::\s*initializer_list\b", constructor_args[0]) - ) - copy_constructor = bool( - onearg_constructor - and re.match( - r"((const\s+(volatile\s+)?)?|(volatile\s+(const\s+)?))?" - rf"{re.escape(base_classname)}(\s*<[^>]*>)?(\s+const)?\s*(?:<\w+>\s*)?&", - constructor_args[0].strip(), - ) - ) - - if ( - not is_marked_explicit - and onearg_constructor - and not initializer_list_constructor - and not copy_constructor - ): - if defaulted_args or variadic_args: - error( - filename, - linenum, - "runtime/explicit", - 4, - "Constructors callable with one argument should be marked explicit.", - ) - else: - error( - filename, - linenum, - "runtime/explicit", - 4, - "Single-parameter constructors should be marked explicit.", - ) - - -def CheckSpacingForFunctionCall(filename, clean_lines, linenum, error): - """Checks for the correctness of various spacing around function calls. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - line = clean_lines.elided[linenum] - - # Since function calls often occur inside if/for/while/switch - # expressions - which have their own, more liberal conventions - we - # first see if we should be looking inside such an expression for a - # function call, to which we can apply more strict standards. - fncall = line # if there's no control flow construct, look at whole line - for pattern in ( - r"\bif\s*\((.*)\)\s*{", - r"\bfor\s*\((.*)\)\s*{", - r"\bwhile\s*\((.*)\)\s*[{;]", - r"\bswitch\s*\((.*)\)\s*{", - ): - match = re.search(pattern, line) - if match: - fncall = match.group(1) # look inside the parens for function calls - break - - # Except in if/for/while/switch, there should never be space - # immediately inside parens (eg "f( 3, 4 )"). We make an exception - # for nested parens ( (a+b) + c ). Likewise, there should never be - # a space before a ( when it's a function argument. I assume it's a - # function argument when the char before the whitespace is legal in - # a function name (alnum + _) and we're not starting a macro. Also ignore - # pointers and references to arrays and functions coz they're too tricky: - # we use a very simple way to recognize these: - # " (something)(maybe-something)" or - # " (something)(maybe-something," or - # " (something)[something]" - # Note that we assume the contents of [] to be short enough that - # they'll never need to wrap. - if ( # Ignore control structures. - not re.search(r"\b(if|elif|for|while|switch|return|new|delete|catch|sizeof)\b", fncall) - and - # Ignore pointers/references to functions. - not re.search(r" \([^)]+\)\([^)]*(\)|,$)", fncall) - and - # Ignore pointers/references to arrays. - not re.search(r" \([^)]+\)\[[^\]]+\]", fncall) - ): - if re.search(r"\w\s*\(\s(?!\s*\\$)", fncall): # a ( used for a fn call - error(filename, linenum, "whitespace/parens", 4, "Extra space after ( in function call") - elif re.search(r"\(\s+(?!(\s*\\)|\()", fncall): - error(filename, linenum, "whitespace/parens", 2, "Extra space after (") - if ( - re.search(r"\w\s+\(", fncall) - and not re.search(r"_{0,2}asm_{0,2}\s+_{0,2}volatile_{0,2}\s+\(", fncall) - and not re.search(r"#\s*define|typedef|using\s+\w+\s*=", fncall) - and not re.search(r"\w\s+\((\w+::)*\*\w+\)\(", fncall) - and not re.search(r"\bcase\s+\(", fncall) - ): - # TODO(google): Space after an operator function seem to be a common - # error, silence those for now by restricting them to highest verbosity. - if re.search(r"\boperator_*\b", line): - error( - filename, - linenum, - "whitespace/parens", - 0, - "Extra space before ( in function call", - ) - else: - error( - filename, - linenum, - "whitespace/parens", - 4, - "Extra space before ( in function call", - ) - # If the ) is followed only by a newline or a { + newline, assume it's - # part of a control statement (if/while/etc), and don't complain - if re.search(r"[^)]\s+\)\s*[^{\s]", fncall): - # If the closing parenthesis is preceded by only whitespaces, - # try to give a more descriptive error message. - if re.search(r"^\s+\)", fncall): - error( - filename, - linenum, - "whitespace/parens", - 2, - "Closing ) should be moved to the previous line", - ) - else: - error(filename, linenum, "whitespace/parens", 2, "Extra space before )") - - -def IsBlankLine(line): - """Returns true if the given line is blank. - - We consider a line to be blank if the line is empty or consists of - only white spaces. - - Args: - line: A line of a string. - - Returns: - True, if the given line is blank. - """ - return not line or line.isspace() - - -def CheckForNamespaceIndentation(filename, nesting_state, clean_lines, line, error): - is_namespace_indent_item = len(nesting_state.stack) >= 1 and ( - isinstance(nesting_state.stack[-1], _NamespaceInfo) - or (isinstance(nesting_state.previous_stack_top, _NamespaceInfo)) - ) - - if ShouldCheckNamespaceIndentation( - nesting_state, is_namespace_indent_item, clean_lines.elided, line - ): - CheckItemIndentationInNamespace(filename, clean_lines.elided, line, error) - - -def CheckForFunctionLengths(filename, clean_lines, linenum, function_state, error): - """Reports for long function bodies. - - For an overview why this is done, see: - https://google.github.io/styleguide/cppguide.html#Write_Short_Functions - - Uses a simplistic algorithm assuming other style guidelines - (especially spacing) are followed. - Only checks unindented functions, so class members are unchecked. - Trivial bodies are unchecked, so constructors with huge initializer lists - may be missed. - Blank/comment lines are not counted so as to avoid encouraging the removal - of vertical space and comments just to get through a lint check. - NOLINT *on the last line of a function* disables this check. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - function_state: Current function name and lines in body so far. - error: The function to call with any errors found. - """ - lines = clean_lines.lines - line = lines[linenum] - joined_line = "" - - starting_func = False - regexp = r"(\w(\w|::|\*|\&|\s)*)\(" # decls * & space::name( ... - if match_result := re.match(regexp, line): - # If the name is all caps and underscores, figure it's a macro and - # ignore it, unless it's TEST or TEST_F. - function_name = match_result.group(1).split()[-1] - if function_name in {"TEST", "TEST_F"} or not re.match(r"[A-Z_]+$", function_name): - starting_func = True - - if starting_func: - body_found = False - for start_linenum in range(linenum, clean_lines.NumLines()): - start_line = lines[start_linenum] - joined_line += " " + start_line.lstrip() - if re.search(r"(;|})", start_line): # Declarations and trivial functions - body_found = True - break # ... ignore - if re.search(r"{", start_line): - body_found = True - function = re.search(r"((\w|:)*)\(", line).group(1) - if re.match(r"TEST", function): # Handle TEST... macros - parameter_regexp = re.search(r"(\(.*\))", joined_line) - if parameter_regexp: # Ignore bad syntax - function += parameter_regexp.group(1) - else: - function += "()" - function_state.Begin(function) - break - if not body_found: - # No body for the function (or evidence of a non-function) was found. - error( - filename, - linenum, - "readability/fn_size", - 5, - "Lint failed to find start of function body.", - ) - elif re.match(r"^\}\s*$", line): # function end - function_state.Check(error, filename, linenum) - function_state.End() - elif not re.match(r"^\s*$", line): - function_state.Count() # Count non-blank/non-comment lines. - - -_RE_PATTERN_TODO = re.compile(r"^//(\s*)TODO(\(.+?\))?:?(\s|$)?") - - -def CheckComment(line, filename, linenum, next_line_start, error): - """Checks for common mistakes in comments. - - Args: - line: The line in question. - filename: The name of the current file. - linenum: The number of the line to check. - next_line_start: The first non-whitespace column of the next line. - error: The function to call with any errors found. - """ - commentpos = line.find("//") - if commentpos != -1: - # Check if the // may be in quotes. If so, ignore it - if re.sub(r"\\.", "", line[0:commentpos]).count('"') % 2 == 0: - # Allow one space for new scopes, two spaces otherwise: - if not (re.match(r"^.*{ *//", line) and next_line_start == commentpos) and ( - (commentpos >= 1 and line[commentpos - 1] not in string.whitespace) - or (commentpos >= 2 and line[commentpos - 2] not in string.whitespace) - ): - error( - filename, - linenum, - "whitespace/comments", - 2, - "At least two spaces is best between code and comments", - ) - - # Checks for common mistakes in TODO comments. - comment = line[commentpos:] - match = _RE_PATTERN_TODO.match(comment) - if match: - # One whitespace is correct; zero whitespace is handled elsewhere. - leading_whitespace = match.group(1) - if len(leading_whitespace) > 1: - error(filename, linenum, "whitespace/todo", 2, "Too many spaces before TODO") - - username = match.group(2) - if not username: - error( - filename, - linenum, - "readability/todo", - 2, - "Missing username in TODO; it should look like " - '"// TODO(my_username): Stuff."', - ) - - middle_whitespace = match.group(3) - # Comparisons made explicit for correctness - # -- pylint: disable=g-explicit-bool-comparison - if middle_whitespace not in {" ", ""}: - error( - filename, - linenum, - "whitespace/todo", - 2, - "TODO(my_username) should be followed by a space", - ) - - # If the comment contains an alphanumeric character, there - # should be a space somewhere between it and the // unless - # it's a /// or //! Doxygen comment. - if re.match(r"//[^ ]*\w", comment) and not re.match(r"(///|//\!)(\s+|$)", comment): - error( - filename, - linenum, - "whitespace/comments", - 4, - "Should have a space between // and comment", - ) - - -def CheckSpacing(filename, clean_lines, linenum, nesting_state, error): - """Checks for the correctness of various spacing issues in the code. - - Things we check for: spaces around operators, spaces after - if/for/while/switch, no spaces around parens in function calls, two - spaces between code and comment, don't start a block with a blank - line, don't end a function with a blank line, don't add a blank line - after public/protected/private, don't have too many blank lines in a row. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - nesting_state: A NestingState instance which maintains information about - the current stack of nested blocks being parsed. - error: The function to call with any errors found. - """ - - # Don't use "elided" lines here, otherwise we can't check commented lines. - # Don't want to use "raw" either, because we don't want to check inside C++11 - # raw strings, - raw = clean_lines.lines_without_raw_strings - line = raw[linenum] - - # Before nixing comments, check if the line is blank for no good - # reason. This includes the first line after a block is opened, and - # blank lines at the end of a function (ie, right before a line like '}' - # - # Skip all the blank line checks if we are immediately inside a - # namespace body. In other words, don't issue blank line warnings - # for this block: - # namespace { - # - # } - # - # A warning about missing end of namespace comments will be issued instead. - # - # Also skip blank line checks for 'extern "C"' blocks, which are formatted - # like namespaces. - if IsBlankLine(line) and not nesting_state.InNamespaceBody() and not nesting_state.InExternC(): - elided = clean_lines.elided - prev_line = elided[linenum - 1] - prevbrace = prev_line.rfind("{") - # TODO(google): Don't complain if line before blank line, and line after, - # both start with alnums and are indented the same amount. - # This ignores whitespace at the start of a namespace block - # because those are not usually indented. - if prevbrace != -1 and prev_line[prevbrace:].find("}") == -1: - # OK, we have a blank line at the start of a code block. Before we - # complain, we check if it is an exception to the rule: The previous - # non-empty line has the parameters of a function header that are indented - # 4 spaces (because they did not fit in a 80 column line when placed on - # the same line as the function name). We also check for the case where - # the previous line is indented 6 spaces, which may happen when the - # initializers of a constructor do not fit into a 80 column line. - exception = False - if re.match(r" {6}\w", prev_line): # Initializer list? - # We are looking for the opening column of initializer list, which - # should be indented 4 spaces to cause 6 space indentation afterwards. - search_position = linenum - 2 - while search_position >= 0 and re.match(r" {6}\w", elided[search_position]): - search_position -= 1 - exception = search_position >= 0 and elided[search_position][:5] == " :" - else: - # Search for the function arguments or an initializer list. We use a - # simple heuristic here: If the line is indented 4 spaces; and we have a - # closing paren, without the opening paren, followed by an opening brace - # or colon (for initializer lists) we assume that it is the last line of - # a function header. If we have a colon indented 4 spaces, it is an - # initializer list. - exception = re.match( - r" {4}\w[^\(]*\)\s*(const\s*)?(\{\s*$|:)", prev_line - ) or re.match(r" {4}:", prev_line) - - if not exception: - error( - filename, - linenum, - "whitespace/blank_line", - 2, - "Redundant blank line at the start of a code block should be deleted.", - ) - # Ignore blank lines at the end of a block in a long if-else - # chain, like this: - # if (condition1) { - # // Something followed by a blank line - # - # } else if (condition2) { - # // Something else - # } - if linenum + 1 < clean_lines.NumLines(): - next_line = raw[linenum + 1] - if next_line and re.match(r"\s*}", next_line) and next_line.find("} else ") == -1: - error( - filename, - linenum, - "whitespace/blank_line", - 3, - "Redundant blank line at the end of a code block should be deleted.", - ) - - matched = re.match(r"\s*(public|protected|private):", prev_line) - if matched: - error( - filename, - linenum, - "whitespace/blank_line", - 3, - f'Do not leave a blank line after "{matched.group(1)}:"', - ) - - # Next, check comments - next_line_start = 0 - if linenum + 1 < clean_lines.NumLines(): - next_line = raw[linenum + 1] - next_line_start = len(next_line) - len(next_line.lstrip()) - CheckComment(line, filename, linenum, next_line_start, error) - - # get rid of comments and strings - line = clean_lines.elided[linenum] - - # You shouldn't have spaces before your brackets, except for C++11 attributes - # or maybe after 'delete []', 'return []() {};', or 'auto [abc, ...] = ...;'. - if re.search(r"\w\s+\[(?!\[)", line) and not re.search(r"(?:auto&?|delete|return)\s+\[", line): - error(filename, linenum, "whitespace/braces", 5, "Extra space before [") - - # In range-based for, we wanted spaces before and after the colon, but - # not around "::" tokens that might appear. - if re.search(r"for *\(.*[^:]:[^: ]", line) or re.search(r"for *\(.*[^: ]:[^:]", line): - error( - filename, - linenum, - "whitespace/forcolon", - 2, - "Missing space around colon in range-based for loop", - ) - - -def CheckOperatorSpacing(filename, clean_lines, linenum, error): - """Checks for horizontal spacing around operators. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - line = clean_lines.elided[linenum] - - # Don't try to do spacing checks for operator methods. Do this by - # replacing the troublesome characters with something else, - # preserving column position for all other characters. - # - # The replacement is done repeatedly to avoid false positives from - # operators that call operators. - while True: - match = re.match(r"^(.*\boperator\b)(\S+)(\s*\(.*)$", line) - if match: - line = match.group(1) + ("_" * len(match.group(2))) + match.group(3) - else: - break - - # We allow no-spaces around = within an if: "if ( (a=Foo()) == 0 )". - # Otherwise not. Note we only check for non-spaces on *both* sides; - # sometimes people put non-spaces on one side when aligning ='s among - # many lines (not that this is behavior that I approve of...) - if ( - (re.search(r"[\w.]=", line) or re.search(r"=[\w.]", line)) - and not re.search(r"\b(if|while|for) ", line) - # Operators taken from [lex.operators] in C++11 standard. - and not re.search(r"(>=|<=|==|!=|&=|\^=|\|=|\+=|\*=|\/=|\%=)", line) - and not re.search(r"operator=", line) - ): - error(filename, linenum, "whitespace/operators", 4, "Missing spaces around =") - - # It's ok not to have spaces around binary operators like + - * /, but if - # there's too little whitespace, we get concerned. It's hard to tell, - # though, so we punt on this one for now. TODO(google). - - # You should always have whitespace around binary operators. - # - # Check <= and >= first to avoid false positives with < and >, then - # check non-include lines for spacing around < and >. - # - # If the operator is followed by a comma, assume it's be used in a - # macro context and don't do any checks. This avoids false - # positives. - # - # Note that && is not included here. This is because there are too - # many false positives due to RValue references. - match = re.search(r"[^<>=!\s](==|!=|<=|>=|\|\|)[^<>=!\s,;\)]", line) - if match: - # TODO(google): support alternate operators - error( - filename, linenum, "whitespace/operators", 3, f"Missing spaces around {match.group(1)}" - ) - elif not re.match(r"#.*include", line): - # Look for < that is not surrounded by spaces. This is only - # triggered if both sides are missing spaces, even though - # technically should should flag if at least one side is missing a - # space. This is done to avoid some false positives with shifts. - match = re.match(r"^(.*[^\s<])<[^\s=<,]", line) - if match: - (_, _, end_pos) = CloseExpression(clean_lines, linenum, len(match.group(1))) - if end_pos <= -1: - error(filename, linenum, "whitespace/operators", 3, "Missing spaces around <") - - # Look for > that is not surrounded by spaces. Similar to the - # above, we only trigger if both sides are missing spaces to avoid - # false positives with shifts. - match = re.match(r"^(.*[^-\s>])>[^\s=>,]", line) - if match: - (_, _, start_pos) = ReverseCloseExpression(clean_lines, linenum, len(match.group(1))) - if start_pos <= -1: - error(filename, linenum, "whitespace/operators", 3, "Missing spaces around >") - - # We allow no-spaces around << when used like this: 10<<20, but - # not otherwise (particularly, not when used as streams) - # - # We also allow operators following an opening parenthesis, since - # those tend to be macros that deal with operators. - match = re.search(r"(operator|[^\s(<])(?:L|UL|LL|ULL|l|ul|ll|ull)?<<([^\s,=<])", line) - if ( - match - and not (match.group(1).isdigit() and match.group(2).isdigit()) - and not (match.group(1) == "operator" and match.group(2) == ";") - ): - error(filename, linenum, "whitespace/operators", 3, "Missing spaces around <<") - - # We allow no-spaces around >> for almost anything. This is because - # C++11 allows ">>" to close nested templates, which accounts for - # most cases when ">>" is not followed by a space. - # - # We still warn on ">>" followed by alpha character, because that is - # likely due to ">>" being used for right shifts, e.g.: - # value >> alpha - # - # When ">>" is used to close templates, the alphanumeric letter that - # follows would be part of an identifier, and there should still be - # a space separating the template type and the identifier. - # type> alpha - match = re.search(r">>[a-zA-Z_]", line) - if match: - error(filename, linenum, "whitespace/operators", 3, "Missing spaces around >>") - - # There shouldn't be space around unary operators - match = re.search(r"(!\s|~\s|[\s]--[\s;]|[\s]\+\+[\s;])", line) - if match: - error( - filename, - linenum, - "whitespace/operators", - 4, - f"Extra space for operator {match.group(1)}", - ) - - -def CheckParenthesisSpacing(filename, clean_lines, linenum, error): - """Checks for horizontal spacing around parentheses. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - line = clean_lines.elided[linenum] - - # No spaces after an if, while, switch, or for - match = re.search(r" (if\(|for\(|while\(|switch\()", line) - if match: - error( - filename, linenum, "whitespace/parens", 5, f"Missing space before ( in {match.group(1)}" - ) - - # For if/for/while/switch, the left and right parens should be - # consistent about how many spaces are inside the parens, and - # there should either be zero or one spaces inside the parens. - # We don't want: "if ( foo)" or "if ( foo )". - # Exception: "for ( ; foo; bar)" and "for (foo; bar; )" are allowed. - match = re.search( - r"\b(if|for|while|switch)\s*" - r"\(([ ]*)(.).*[^ ]+([ ]*)\)\s*{\s*$", - line, - ) - if match: - if len(match.group(2)) != len(match.group(4)) and not ( - match.group(3) == ";" - and len(match.group(2)) == 1 + len(match.group(4)) - or not match.group(2) - and re.search(r"\bfor\s*\(.*; \)", line) - ): - error( - filename, - linenum, - "whitespace/parens", - 5, - f"Mismatching spaces inside () in {match.group(1)}", - ) - if len(match.group(2)) not in [0, 1]: - error( - filename, - linenum, - "whitespace/parens", - 5, - f"Should have zero or one spaces inside ( and ) in {match.group(1)}", - ) - - -def CheckCommaSpacing(filename, clean_lines, linenum, error): - """Checks for horizontal spacing near commas and semicolons. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - raw = clean_lines.lines_without_raw_strings - line = clean_lines.elided[linenum] - - # You should always have a space after a comma (either as fn arg or operator) - # - # This does not apply when the non-space character following the - # comma is another comma, since the only time when that happens is - # for empty macro arguments. - # - # We run this check in two passes: first pass on elided lines to - # verify that lines contain missing whitespaces, second pass on raw - # lines to confirm that those missing whitespaces are not due to - # elided comments. - match = re.search( - r",[^,\s]", re.sub(r"\b__VA_OPT__\s*\(,\)", "", re.sub(r"\boperator\s*,\s*\(", "F(", line)) - ) - if match and re.search(r",[^,\s]", raw[linenum]): - error(filename, linenum, "whitespace/comma", 3, "Missing space after ,") - - # You should always have a space after a semicolon - # except for few corner cases - # TODO(google): clarify if 'if (1) { return 1;}' is requires one more - # space after ; - if re.search(r";[^\s};\\)/]", line): - error(filename, linenum, "whitespace/semicolon", 3, "Missing space after ;") - - -def _IsType(clean_lines, nesting_state, expr): - """Check if expression looks like a type name, returns true if so. - - Args: - clean_lines: A CleansedLines instance containing the file. - nesting_state: A NestingState instance which maintains information about - the current stack of nested blocks being parsed. - expr: The expression to check. - Returns: - True, if token looks like a type. - """ - # Keep only the last token in the expression - if last_word := re.match(r"^.*(\b\S+)$", expr): - token = last_word.group(1) - else: - token = expr - - # Match native types and stdint types - if _TYPES.match(token): - return True - - # Try a bit harder to match templated types. Walk up the nesting - # stack until we find something that resembles a typename - # declaration for what we are looking for. - typename_pattern = r"\b(?:typename|class|struct)\s+" + re.escape(token) + r"\b" - block_index = len(nesting_state.stack) - 1 - while block_index >= 0: - if isinstance(nesting_state.stack[block_index], _NamespaceInfo): - return False - - # Found where the opening brace is. We want to scan from this - # line up to the beginning of the function, minus a few lines. - # template - # class C - # : public ... { // start scanning here - last_line = nesting_state.stack[block_index].starting_linenum - - next_block_start = 0 - if block_index > 0: - next_block_start = nesting_state.stack[block_index - 1].starting_linenum - first_line = last_line - while first_line >= next_block_start: - if clean_lines.elided[first_line].find("template") >= 0: - break - first_line -= 1 - if first_line < next_block_start: - # Didn't find any "template" keyword before reaching the next block, - # there are probably no template things to check for this block - block_index -= 1 - continue - - # Look for typename in the specified range - for i in range(first_line, last_line + 1, 1): - if re.search(typename_pattern, clean_lines.elided[i]): - return True - block_index -= 1 - - return False - - -def CheckBracesSpacing(filename, clean_lines, linenum, nesting_state, error): - """Checks for horizontal spacing near commas. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - nesting_state: A NestingState instance which maintains information about - the current stack of nested blocks being parsed. - error: The function to call with any errors found. - """ - line = clean_lines.elided[linenum] - - # Except after an opening paren, or after another opening brace (in case of - # an initializer list, for instance), you should have spaces before your - # braces when they are delimiting blocks, classes, namespaces etc. - # And since you should never have braces at the beginning of a line, - # this is an easy test. Except that braces used for initialization don't - # follow the same rule; we often don't want spaces before those. - - if match := re.match(r"^(.*[^ ({>]){", line): - # Try a bit harder to check for brace initialization. This - # happens in one of the following forms: - # Constructor() : initializer_list_{} { ... } - # Constructor{}.MemberFunction() - # Type variable{}; - # FunctionCall(type{}, ...); - # LastArgument(..., type{}); - # LOG(INFO) << type{} << " ..."; - # map_of_type[{...}] = ...; - # ternary = expr ? new type{} : nullptr; - # OuterTemplate{}> - # - # We check for the character following the closing brace, and - # silence the warning if it's one of those listed above, i.e. - # "{.;,)<>]:". - # - # To account for nested initializer list, we allow any number of - # closing braces up to "{;,)<". We can't simply silence the - # warning on first sight of closing brace, because that would - # cause false negatives for things that are not initializer lists. - # Silence this: But not this: - # Outer{ if (...) { - # Inner{...} if (...){ // Missing space before { - # }; } - # - # There is a false negative with this approach if people inserted - # spurious semicolons, e.g. "if (cond){};", but we will catch the - # spurious semicolon with a separate check. - leading_text = match.group(1) - (endline, endlinenum, endpos) = CloseExpression(clean_lines, linenum, len(match.group(1))) - trailing_text = "" - if endpos > -1: - trailing_text = endline[endpos:] - for offset in range(endlinenum + 1, min(endlinenum + 3, clean_lines.NumLines() - 1)): - trailing_text += clean_lines.elided[offset] - # We also suppress warnings for `uint64_t{expression}` etc., as the style - # guide recommends brace initialization for integral types to avoid - # overflow/truncation. - if not re.match(r"^[\s}]*[{.;,)<>\]:]", trailing_text) and not _IsType( - clean_lines, nesting_state, leading_text - ): - error(filename, linenum, "whitespace/braces", 5, "Missing space before {") - - # Make sure '} else {' has spaces. - if re.search(r"}else", line): - error(filename, linenum, "whitespace/braces", 5, "Missing space before else") - - # You shouldn't have a space before a semicolon at the end of the line. - # There's a special case for "for" since the style guide allows space before - # the semicolon there. - if re.search(r":\s*;\s*$", line): - error( - filename, - linenum, - "whitespace/semicolon", - 5, - "Semicolon defining empty statement. Use {} instead.", - ) - elif re.search(r"^\s*;\s*$", line): - error( - filename, - linenum, - "whitespace/semicolon", - 5, - "Line contains only semicolon. If this should be an empty statement, use {} instead.", - ) - elif re.search(r"\s+;\s*$", line) and not re.search(r"\bfor\b", line): - error( - filename, - linenum, - "whitespace/semicolon", - 5, - "Extra space before last semicolon. If this should be an empty " - "statement, use {} instead.", - ) - - -def IsDecltype(clean_lines, linenum, column): - """Check if the token ending on (linenum, column) is decltype(). - - Args: - clean_lines: A CleansedLines instance containing the file. - linenum: the number of the line to check. - column: end column of the token to check. - Returns: - True if this token is decltype() expression, False otherwise. - """ - (text, _, start_col) = ReverseCloseExpression(clean_lines, linenum, column) - if start_col < 0: - return False - return bool(re.search(r"\bdecltype\s*$", text[0:start_col])) - - -def CheckSectionSpacing(filename, clean_lines, class_info, linenum, error): - """Checks for additional blank line issues related to sections. - - Currently the only thing checked here is blank line before protected/private. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - class_info: A _ClassInfo objects. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - # Skip checks if the class is small, where small means 25 lines or less. - # 25 lines seems like a good cutoff since that's the usual height of - # terminals, and any class that can't fit in one screen can't really - # be considered "small". - # - # Also skip checks if we are on the first line. This accounts for - # classes that look like - # class Foo { public: ... }; - # - # If we didn't find the end of the class, last_line would be zero, - # and the check will be skipped by the first condition. - if ( - class_info.last_line - class_info.starting_linenum <= 24 - or linenum <= class_info.starting_linenum - ): - return - - matched = re.match(r"\s*(public|protected|private):", clean_lines.lines[linenum]) - if matched: - # Issue warning if the line before public/protected/private was - # not a blank line, but don't do this if the previous line contains - # "class" or "struct". This can happen two ways: - # - We are at the beginning of the class. - # - We are forward-declaring an inner class that is semantically - # private, but needed to be public for implementation reasons. - # Also ignores cases where the previous line ends with a backslash as can be - # common when defining classes in C macros. - prev_line = clean_lines.lines[linenum - 1] - if ( - not IsBlankLine(prev_line) - and not re.search(r"\b(class|struct)\b", prev_line) - and not re.search(r"\\$", prev_line) - ): - # Try a bit harder to find the beginning of the class. This is to - # account for multi-line base-specifier lists, e.g.: - # class Derived - # : public Base { - end_class_head = class_info.starting_linenum - for i in range(class_info.starting_linenum, linenum): - if re.search(r"\{\s*$", clean_lines.lines[i]): - end_class_head = i - break - if end_class_head < linenum - 1: - error( - filename, - linenum, - "whitespace/blank_line", - 3, - f'"{matched.group(1)}:" should be preceded by a blank line', - ) - - -def GetPreviousNonBlankLine(clean_lines, linenum): - """Return the most recent non-blank line and its line number. - - Args: - clean_lines: A CleansedLines instance containing the file contents. - linenum: The number of the line to check. - - Returns: - A tuple with two elements. The first element is the contents of the last - non-blank line before the current line, or the empty string if this is the - first non-blank line. The second is the line number of that line, or -1 - if this is the first non-blank line. - """ - - prevlinenum = linenum - 1 - while prevlinenum >= 0: - prevline = clean_lines.elided[prevlinenum] - if not IsBlankLine(prevline): # if not a blank line... - return (prevline, prevlinenum) - prevlinenum -= 1 - return ("", -1) - - -def CheckBraces(filename, clean_lines, linenum, error): - """Looks for misplaced braces (e.g. at the end of line). - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - - line = clean_lines.elided[linenum] # get rid of comments and strings - - if re.match(r"\s*{\s*$", line): - # We allow an open brace to start a line in the case where someone is using - # braces in a block to explicitly create a new scope, which is commonly used - # to control the lifetime of stack-allocated variables. Braces are also - # used for brace initializers inside function calls. We don't detect this - # perfectly: we just don't complain if the last non-whitespace character on - # the previous non-blank line is ',', ';', ':', '(', '{', or '}', or if the - # previous line starts a preprocessor block. We also allow a brace on the - # following line if it is part of an array initialization and would not fit - # within the 80 character limit of the preceding line. - prevline = GetPreviousNonBlankLine(clean_lines, linenum)[0] - if ( - not re.search(r"[,;:}{(]\s*$", prevline) - and not re.match(r"\s*#", prevline) - and not (GetLineWidth(prevline) > _line_length - 2 and "[]" in prevline) - ): - error( - filename, - linenum, - "whitespace/braces", - 4, - "{ should almost always be at the end of the previous line", - ) - - # An else clause should be on the same line as the preceding closing brace. - if last_wrong := re.match(r"\s*else\b\s*(?:if\b|\{|$)", line): - prevline = GetPreviousNonBlankLine(clean_lines, linenum)[0] - if re.match(r"\s*}\s*$", prevline): - error( - filename, - linenum, - "whitespace/newline", - 4, - "An else should appear on the same line as the preceding }", - ) - else: - last_wrong = False - - # If braces come on one side of an else, they should be on both. - # However, we have to worry about "else if" that spans multiple lines! - if re.search(r"else if\s*\(", line): # could be multi-line if - brace_on_left = bool(re.search(r"}\s*else if\s*\(", line)) - # find the ( after the if - pos = line.find("else if") - pos = line.find("(", pos) - if pos > 0: - (endline, _, endpos) = CloseExpression(clean_lines, linenum, pos) - brace_on_right = endline[endpos:].find("{") != -1 - if brace_on_left != brace_on_right: # must be brace after if - error( - filename, - linenum, - "readability/braces", - 5, - "If an else has a brace on one side, it should have it on both", - ) - # Prevent detection if statement has { and we detected an improper newline after } - elif re.search(r"}\s*else[^{]*$", line) or ( - re.match(r"[^}]*else\s*{", line) and not last_wrong - ): - error( - filename, - linenum, - "readability/braces", - 5, - "If an else has a brace on one side, it should have it on both", - ) - - # No control clauses with braces should have its contents on the same line - # Exclude } which will be covered by empty-block detect - # Exclude ; which may be used by while in a do-while - if ( - keyword := re.search( - r"\b(else if|if|while|for|switch)" # These have parens - r"\s*\(.*\)\s*(?:\[\[(?:un)?likely\]\]\s*)?{\s*[^\s\\};]", - line, - ) - ) or ( - keyword := re.search( - r"\b(else|do|try)" # These don't have parens - r"\s*(?:\[\[(?:un)?likely\]\]\s*)?{\s*[^\s\\}]", - line, - ) - ): - error( - filename, - linenum, - "whitespace/newline", - 5, - f"Controlled statements inside brackets of {keyword.group(1)} clause" - " should be on a separate line", - ) - - # TODO(aaronliu0130): Err on if...else and do...while statements without braces; - # style guide has changed since the below comment was written - - # Check single-line if/else bodies. The style guide says 'curly braces are not - # required for single-line statements'. We additionally allow multi-line, - # single statements, but we reject anything with more than one semicolon in - # it. This means that the first semicolon after the if should be at the end of - # its line, and the line after that should have an indent level equal to or - # lower than the if. We also check for ambiguous if/else nesting without - # braces. - if_else_match = re.search(r"\b(if\s*(|constexpr)\s*\(|else\b)", line) - if if_else_match and not re.match(r"\s*#", line): - if_indent = GetIndentLevel(line) - endline, endlinenum, endpos = line, linenum, if_else_match.end() - if_match = re.search(r"\bif\s*(|constexpr)\s*\(", line) - if if_match: - # This could be a multiline if condition, so find the end first. - pos = if_match.end() - 1 - (endline, endlinenum, endpos) = CloseExpression(clean_lines, linenum, pos) - # Check for an opening brace, either directly after the if or on the next - # line. If found, this isn't a single-statement conditional. - if not re.match(r"\s*(?:\[\[(?:un)?likely\]\]\s*)?{", endline[endpos:]) and not ( - re.match(r"\s*$", endline[endpos:]) - and endlinenum < (len(clean_lines.elided) - 1) - and re.match(r"\s*{", clean_lines.elided[endlinenum + 1]) - ): - while ( - endlinenum < len(clean_lines.elided) - and ";" not in clean_lines.elided[endlinenum][endpos:] - ): - endlinenum += 1 - endpos = 0 - if endlinenum < len(clean_lines.elided): - endline = clean_lines.elided[endlinenum] - # We allow a mix of whitespace and closing braces (e.g. for one-liner - # methods) and a single \ after the semicolon (for macros) - endpos = endline.find(";") - if not re.match(r";[\s}]*(\\?)$", endline[endpos:]): - # Semicolon isn't the last character, there's something trailing. - # Output a warning if the semicolon is not contained inside - # a lambda expression. - if not re.match(r"^[^{};]*\[[^\[\]]*\][^{}]*\{[^{}]*\}\s*\)*[;,]\s*$", endline): - error( - filename, - linenum, - "readability/braces", - 4, - "If/else bodies with multiple statements require braces", - ) - elif endlinenum < len(clean_lines.elided) - 1: - # Make sure the next line is dedented - next_line = clean_lines.elided[endlinenum + 1] - next_indent = GetIndentLevel(next_line) - # With ambiguous nested if statements, this will error out on the - # if that *doesn't* match the else, regardless of whether it's the - # inner one or outer one. - if if_match and re.match(r"\s*else\b", next_line) and next_indent != if_indent: - error( - filename, - linenum, - "readability/braces", - 4, - "Else clause should be indented at the same level as if. " - "Ambiguous nested if/else chains require braces.", - ) - elif next_indent > if_indent: - error( - filename, - linenum, - "readability/braces", - 4, - "If/else bodies with multiple statements require braces", - ) - - -def CheckTrailingSemicolon(filename, clean_lines, linenum, error): - """Looks for redundant trailing semicolon. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - - line = clean_lines.elided[linenum] - - # Block bodies should not be followed by a semicolon. Due to C++11 - # brace initialization, there are more places where semicolons are - # required than not, so we explicitly list the allowed rules rather - # than listing the disallowed ones. These are the places where "};" - # should be replaced by just "}": - # 1. Some flavor of block following closing parenthesis: - # for (;;) {}; - # while (...) {}; - # switch (...) {}; - # Function(...) {}; - # if (...) {}; - # if (...) else if (...) {}; - # - # 2. else block: - # if (...) else {}; - # - # 3. const member function: - # Function(...) const {}; - # - # 4. Block following some statement: - # x = 42; - # {}; - # - # 5. Block at the beginning of a function: - # Function(...) { - # {}; - # } - # - # Note that naively checking for the preceding "{" will also match - # braces inside multi-dimensional arrays, but this is fine since - # that expression will not contain semicolons. - # - # 6. Block following another block: - # while (true) {} - # {}; - # - # 7. End of namespaces: - # namespace {}; - # - # These semicolons seems far more common than other kinds of - # redundant semicolons, possibly due to people converting classes - # to namespaces. For now we do not warn for this case. - # - # Try matching case 1 first. - match = re.match(r"^(.*\)\s*)\{", line) - if match: - # Matched closing parenthesis (case 1). Check the token before the - # matching opening parenthesis, and don't warn if it looks like a - # macro. This avoids these false positives: - # - macro that defines a base class - # - multi-line macro that defines a base class - # - macro that defines the whole class-head - # - # But we still issue warnings for macros that we know are safe to - # warn, specifically: - # - TEST, TEST_F, TEST_P, MATCHER, MATCHER_P - # - TYPED_TEST - # - INTERFACE_DEF - # - EXCLUSIVE_LOCKS_REQUIRED, SHARED_LOCKS_REQUIRED, LOCKS_EXCLUDED: - # - # We implement a list of safe macros instead of a list of - # unsafe macros, even though the latter appears less frequently in - # google code and would have been easier to implement. This is because - # the downside for getting the allowed checks wrong means some extra - # semicolons, while the downside for getting disallowed checks wrong - # would result in compile errors. - # - # In addition to macros, we also don't want to warn on - # - Compound literals - # - Lambdas - # - alignas specifier with anonymous structs - # - decltype - # - concepts (requires expression) - closing_brace_pos = match.group(1).rfind(")") - opening_parenthesis = ReverseCloseExpression(clean_lines, linenum, closing_brace_pos) - if opening_parenthesis[2] > -1: - line_prefix = opening_parenthesis[0][0 : opening_parenthesis[2]] - macro = re.search(r"\b([A-Z_][A-Z0-9_]*)\s*$", line_prefix) - func = re.match(r"^(.*\])\s*$", line_prefix) - if ( - ( - macro - and macro.group(1) - not in ( - "TEST", - "TEST_F", - "MATCHER", - "MATCHER_P", - "TYPED_TEST", - "EXCLUSIVE_LOCKS_REQUIRED", - "SHARED_LOCKS_REQUIRED", - "LOCKS_EXCLUDED", - "INTERFACE_DEF", - ) - ) - or (func and not re.search(r"\boperator\s*\[\s*\]", func.group(1))) - or re.search(r"\b(?:struct|union)\s+alignas\s*$", line_prefix) - or re.search(r"\bdecltype$", line_prefix) - or re.search(r"\brequires.*$", line_prefix) - or re.search(r"\s+=\s*$", line_prefix) - ): - match = None - if ( - match - and opening_parenthesis[1] > 1 - and re.search(r"\]\s*$", clean_lines.elided[opening_parenthesis[1] - 1]) - ): - # Multi-line lambda-expression - match = None - - else: - # Try matching cases 2-3. - match = re.match(r"^(.*(?:else|\)\s*const)\s*)\{", line) - if not match: - # Try matching cases 4-6. These are always matched on separate lines. - # - # Note that we can't simply concatenate the previous line to the - # current line and do a single match, otherwise we may output - # duplicate warnings for the blank line case: - # if (cond) { - # // blank line - # } - prevline = GetPreviousNonBlankLine(clean_lines, linenum)[0] - if prevline and re.search(r"[;{}]\s*$", prevline): - match = re.match(r"^(\s*)\{", line) - - # Check matching closing brace - if match: - (endline, endlinenum, endpos) = CloseExpression(clean_lines, linenum, len(match.group(1))) - if endpos > -1 and re.match(r"^\s*;", endline[endpos:]): - # Current {} pair is eligible for semicolon check, and we have found - # the redundant semicolon, output warning here. - # - # Note: because we are scanning forward for opening braces, and - # outputting warnings for the matching closing brace, if there are - # nested blocks with trailing semicolons, we will get the error - # messages in reversed order. - - # We need to check the line forward for NOLINT - raw_lines = clean_lines.raw_lines - ParseNolintSuppressions(filename, raw_lines[endlinenum - 1], endlinenum - 1, error) - ParseNolintSuppressions(filename, raw_lines[endlinenum], endlinenum, error) - - error(filename, endlinenum, "readability/braces", 4, "You don't need a ; after a }") - - -def CheckEmptyBlockBody(filename, clean_lines, linenum, error): - """Look for empty loop/conditional body with only a single semicolon. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - - # Search for loop keywords at the beginning of the line. Because only - # whitespaces are allowed before the keywords, this will also ignore most - # do-while-loops, since those lines should start with closing brace. - # - # We also check "if" blocks here, since an empty conditional block - # is likely an error. - line = clean_lines.elided[linenum] - if matched := re.match(r"\s*(for|while|if)\s*\(", line): - # Find the end of the conditional expression. - (end_line, end_linenum, end_pos) = CloseExpression(clean_lines, linenum, line.find("(")) - - # Output warning if what follows the condition expression is a semicolon. - # No warning for all other cases, including whitespace or newline, since we - # have a separate check for semicolons preceded by whitespace. - if end_pos >= 0 and re.match(r";", end_line[end_pos:]): - if matched.group(1) == "if": - error( - filename, - end_linenum, - "whitespace/empty_conditional_body", - 5, - "Empty conditional bodies should use {}", - ) - else: - error( - filename, - end_linenum, - "whitespace/empty_loop_body", - 5, - "Empty loop bodies should use {} or continue", - ) - - # Check for if statements that have completely empty bodies (no comments) - # and no else clauses. - if end_pos >= 0 and matched.group(1) == "if": - # Find the position of the opening { for the if statement. - # Return without logging an error if it has no brackets. - opening_linenum = end_linenum - opening_line_fragment = end_line[end_pos:] - # Loop until EOF or find anything that's not whitespace or opening {. - while not re.search(r"^\s*\{", opening_line_fragment): - if re.search(r"^(?!\s*$)", opening_line_fragment): - # Conditional has no brackets. - return - opening_linenum += 1 - if opening_linenum == len(clean_lines.elided): - # Couldn't find conditional's opening { or any code before EOF. - return - opening_line_fragment = clean_lines.elided[opening_linenum] - # Set opening_line (opening_line_fragment may not be entire opening line). - opening_line = clean_lines.elided[opening_linenum] - - # Find the position of the closing }. - opening_pos = opening_line_fragment.find("{") - if opening_linenum == end_linenum: - # We need to make opening_pos relative to the start of the entire line. - opening_pos += end_pos - (closing_line, closing_linenum, closing_pos) = CloseExpression( - clean_lines, opening_linenum, opening_pos - ) - if closing_pos < 0: - return - - # Now construct the body of the conditional. This consists of the portion - # of the opening line after the {, all lines until the closing line, - # and the portion of the closing line before the }. - if clean_lines.raw_lines[opening_linenum] != CleanseComments( - clean_lines.raw_lines[opening_linenum] - ): - # Opening line ends with a comment, so conditional isn't empty. - return - if closing_linenum > opening_linenum: - # Opening line after the {. Ignore comments here since we checked above. - bodylist = list(opening_line[opening_pos + 1 :]) - # All lines until closing line, excluding closing line, with comments. - bodylist.extend(clean_lines.raw_lines[opening_linenum + 1 : closing_linenum]) - # Closing line before the }. Won't (and can't) have comments. - bodylist.append(clean_lines.elided[closing_linenum][: closing_pos - 1]) - body = "\n".join(bodylist) - else: - # If statement has brackets and fits on a single line. - body = opening_line[opening_pos + 1 : closing_pos - 1] - - # Check if the body is empty - if not _EMPTY_CONDITIONAL_BODY_PATTERN.search(body): - return - # The body is empty. Now make sure there's not an else clause. - current_linenum = closing_linenum - current_line_fragment = closing_line[closing_pos:] - # Loop until EOF or find anything that's not whitespace or else clause. - while re.search(r"^\s*$|^(?=\s*else)", current_line_fragment): - if re.search(r"^(?=\s*else)", current_line_fragment): - # Found an else clause, so don't log an error. - return - current_linenum += 1 - if current_linenum == len(clean_lines.elided): - break - current_line_fragment = clean_lines.elided[current_linenum] - - # The body is empty and there's no else clause until EOF or other code. - error( - filename, - end_linenum, - "whitespace/empty_if_body", - 4, - ("If statement had no body and no else clause"), - ) - - -def FindCheckMacro(line): - """Find a replaceable CHECK-like macro. - - Args: - line: line to search on. - Returns: - (macro name, start position), or (None, -1) if no replaceable - macro is found. - """ - for macro in _CHECK_MACROS: - i = line.find(macro) - if i >= 0: - # Find opening parenthesis. Do a regular expression match here - # to make sure that we are matching the expected CHECK macro, as - # opposed to some other macro that happens to contain the CHECK - # substring. - matched = re.match(r"^(.*\b" + macro + r"\s*)\(", line) - if not matched: - continue - return (macro, len(matched.group(1))) - return (None, -1) - - -def CheckCheck(filename, clean_lines, linenum, error): - """Checks the use of CHECK and EXPECT macros. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - - # Decide the set of replacement macros that should be suggested - lines = clean_lines.elided - (check_macro, start_pos) = FindCheckMacro(lines[linenum]) - if not check_macro: - return - - # Find end of the boolean expression by matching parentheses - (last_line, end_line, end_pos) = CloseExpression(clean_lines, linenum, start_pos) - if end_pos < 0: - return - - # If the check macro is followed by something other than a - # semicolon, assume users will log their own custom error messages - # and don't suggest any replacements. - if not re.match(r"\s*;", last_line[end_pos:]): - return - - if linenum == end_line: - expression = lines[linenum][start_pos + 1 : end_pos - 1] - else: - expression = lines[linenum][start_pos + 1 :] - for i in range(linenum + 1, end_line): - expression += lines[i] - expression += last_line[0 : end_pos - 1] - - # Parse expression so that we can take parentheses into account. - # This avoids false positives for inputs like "CHECK((a < 4) == b)", - # which is not replaceable by CHECK_LE. - lhs = "" - rhs = "" - operator = None - while expression: - matched = re.match( - r"^\s*(<<|<<=|>>|>>=|->\*|->|&&|\|\||" - r"==|!=|>=|>|<=|<|\()(.*)$", - expression, - ) - if matched: - token = matched.group(1) - if token == "(": - # Parenthesized operand - expression = matched.group(2) - (end, _) = FindEndOfExpressionInLine(expression, 0, ["("]) - if end < 0: - return # Unmatched parenthesis - lhs += "(" + expression[0:end] - expression = expression[end:] - elif token in ("&&", "||"): - # Logical and/or operators. This means the expression - # contains more than one term, for example: - # CHECK(42 < a && a < b); - # - # These are not replaceable with CHECK_LE, so bail out early. - return - elif token in ("<<", "<<=", ">>", ">>=", "->*", "->"): - # Non-relational operator - lhs += token - expression = matched.group(2) - else: - # Relational operator - operator = token - rhs = matched.group(2) - break - else: - # Unparenthesized operand. Instead of appending to lhs one character - # at a time, we do another regular expression match to consume several - # characters at once if possible. Trivial benchmark shows that this - # is more efficient when the operands are longer than a single - # character, which is generally the case. - matched = re.match(r"^([^-=!<>()&|]+)(.*)$", expression) - if not matched: - matched = re.match(r"^(\s*\S)(.*)$", expression) - if not matched: - break - lhs += matched.group(1) - expression = matched.group(2) - - # Only apply checks if we got all parts of the boolean expression - if not (lhs and operator and rhs): - return - - # Check that rhs do not contain logical operators. We already know - # that lhs is fine since the loop above parses out && and ||. - if rhs.find("&&") > -1 or rhs.find("||") > -1: - return - - # At least one of the operands must be a constant literal. This is - # to avoid suggesting replacements for unprintable things like - # CHECK(variable != iterator) - # - # The following pattern matches decimal, hex integers, strings, and - # characters (in that order). - lhs = lhs.strip() - rhs = rhs.strip() - match_constant = r'^([-+]?(\d+|0[xX][0-9a-fA-F]+)[lLuU]{0,3}|".*"|\'.*\')$' - if re.match(match_constant, lhs) or re.match(match_constant, rhs): - # Note: since we know both lhs and rhs, we can provide a more - # descriptive error message like: - # Consider using CHECK_EQ(x, 42) instead of CHECK(x == 42) - # Instead of: - # Consider using CHECK_EQ instead of CHECK(a == b) - # - # We are still keeping the less descriptive message because if lhs - # or rhs gets long, the error message might become unreadable. - error( - filename, - linenum, - "readability/check", - 2, - f"Consider using {_CHECK_REPLACEMENT[check_macro][operator]}" - f" instead of {check_macro}(a {operator} b)", - ) - - -def CheckAltTokens(filename, clean_lines, linenum, error): - """Check alternative keywords being used in boolean expressions. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - line = clean_lines.elided[linenum] - - # Avoid preprocessor lines - if re.match(r"^\s*#", line): - return - - # Last ditch effort to avoid multi-line comments. This will not help - # if the comment started before the current line or ended after the - # current line, but it catches most of the false positives. At least, - # it provides a way to workaround this warning for people who use - # multi-line comments in preprocessor macros. - # - # TODO(google): remove this once cpplint has better support for - # multi-line comments. - if line.find("/*") >= 0 or line.find("*/") >= 0: - return - - for match in _ALT_TOKEN_REPLACEMENT_PATTERN.finditer(line): - error( - filename, - linenum, - "readability/alt_tokens", - 2, - f"Use operator {_ALT_TOKEN_REPLACEMENT[match.group(2)]} instead of {match.group(2)}", - ) - - -def CheckNullTokens(filename, clean_lines, linenum, error): - """Check NULL usage. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - line = clean_lines.elided[linenum] - - # Avoid preprocessor lines - if re.match(r'^\s*#', line): - return - - if line.find('/*') >= 0 or line.find('*/') >= 0: - return - - for match in _NULL_TOKEN_PATTERN.finditer(line): - error(filename, linenum, 'readability/null_usage', 2, - 'Use nullptr instead of NULL') - - -def CheckV8PersistentTokens(filename, clean_lines, linenum, error): - """Check v8::Persistent usage. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - line = clean_lines.elided[linenum] - - # Avoid preprocessor lines - if re.match(r'^\s*#', line): - return - - if line.find('/*') >= 0 or line.find('*/') >= 0: - return - - for match in _V8_PERSISTENT_PATTERN.finditer(line): - error(filename, linenum, 'runtime/v8_persistent', 2, - 'Use v8::Global instead of v8::Persistent') - - -def CheckLeftLeaningPointer(filename, clean_lines, linenum, error): - """Check for left-leaning pointer placement. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - line = clean_lines.elided[linenum] - - # Avoid preprocessor lines - if re.match(r'^\s*#', line): - return - - if '/*' in line or '*/' in line: - return - - for match in _RIGHT_LEANING_POINTER_PATTERN.finditer(line): - error(filename, linenum, 'readability/null_usage', 2, - 'Use left leaning pointer instead of right leaning') - - -def GetLineWidth(line): - """Determines the width of the line in column positions. - - Args: - line: A string, which may be a Unicode string. - - Returns: - The width of the line in column positions, accounting for Unicode - combining characters and wide characters. - """ - if isinstance(line, str): - width = 0 - for uc in unicodedata.normalize("NFC", line): - if unicodedata.east_asian_width(uc) in ("W", "F"): - width += 2 - elif not unicodedata.combining(uc): - # Issue 337 - # https://mail.python.org/pipermail/python-list/2012-August/628809.html - if (sys.version_info.major, sys.version_info.minor) <= (3, 2): - # https://github.com/python/cpython/blob/2.7/Include/unicodeobject.h#L81 - is_wide_build = sysconfig.get_config_var("Py_UNICODE_SIZE") >= 4 - # https://github.com/python/cpython/blob/2.7/Objects/unicodeobject.c#L564 - is_low_surrogate = 0xDC00 <= ord(uc) <= 0xDFFF - if not is_wide_build and is_low_surrogate: - width -= 1 - - width += 1 - return width - return len(line) - - -def CheckStyle(filename, clean_lines, linenum, file_extension, nesting_state, error, cppvar=None): - """Checks rules from the 'C++ style rules' section of cppguide.html. - - Most of these rules are hard to test (naming, comment style), but we - do what we can. In particular we check for 2-space indents, line lengths, - tab usage, spaces inside code, etc. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - file_extension: The extension (without the dot) of the filename. - nesting_state: A NestingState instance which maintains information about - the current stack of nested blocks being parsed. - error: The function to call with any errors found. - cppvar: The header guard variable returned by GetHeaderGuardCPPVar. - """ - - # Don't use "elided" lines here, otherwise we can't check commented lines. - # Don't want to use "raw" either, because we don't want to check inside C++11 - # raw strings, - raw_lines = clean_lines.lines_without_raw_strings - line = raw_lines[linenum] - prev = raw_lines[linenum - 1] if linenum > 0 else "" - - if line.find("\t") != -1: - error(filename, linenum, "whitespace/tab", 1, "Tab found; better to use spaces") - - # One or three blank spaces at the beginning of the line is weird; it's - # hard to reconcile that with 2-space indents. - # NOTE: here are the conditions rob pike used for his tests. Mine aren't - # as sophisticated, but it may be worth becoming so: RLENGTH==initial_spaces - # if(RLENGTH > 20) complain = 0; - # if(match($0, " +(error|private|public|protected):")) complain = 0; - # if(match(prev, "&& *$")) complain = 0; - # if(match(prev, "\\|\\| *$")) complain = 0; - # if(match(prev, "[\",=><] *$")) complain = 0; - # if(match($0, " <<")) complain = 0; - # if(match(prev, " +for \\(")) complain = 0; - # if(prevodd && match(prevprev, " +for \\(")) complain = 0; - scope_or_label_pattern = r"\s*(?:public|private|protected|signals)(?:\s+(?:slots\s*)?)?:\s*\\?$" - classinfo = nesting_state.InnermostClass() - initial_spaces = 0 - cleansed_line = clean_lines.elided[linenum] - while initial_spaces < len(line) and line[initial_spaces] == " ": - initial_spaces += 1 - # There are certain situations we allow one space, notably for - # section labels, and also lines containing multi-line raw strings. - # We also don't check for lines that look like continuation lines - # (of lines ending in double quotes, commas, equals, or angle brackets) - # because the rules for how to indent those are non-trivial. - if ( - not re.search(r'[",=><] *$', prev) - and (initial_spaces in {1, 3}) - and not re.match(scope_or_label_pattern, cleansed_line) - and not (clean_lines.raw_lines[linenum] != line and re.match(r'^\s*""', line)) - ): - error( - filename, - linenum, - "whitespace/indent", - 3, - "Weird number of spaces at line-start. Are you using a 2-space indent?", - ) - - if line and line[-1].isspace(): - error( - filename, - linenum, - "whitespace/end_of_line", - 4, - "Line ends in whitespace. Consider deleting these extra spaces.", - ) - - # Check if the line is a header guard. - is_header_guard = IsHeaderExtension(file_extension) and line.startswith( - (f"#ifndef {cppvar}", f"#define {cppvar}", f"#endif // {cppvar}") - ) - # #include lines and header guards can be long, since there's no clean way to - # split them. - # - # URLs can be long too. It's possible to split these, but it makes them - # harder to cut&paste. - # - # The "$Id:...$" comment may also get very long without it being the - # developers fault. - # - # Doxygen documentation copying can get pretty long when using an overloaded - # function declaration - if ( - not line.startswith("#include") - and not is_header_guard - and not re.match(r"^\s*//.*http(s?)://\S*$", line) - and not re.match(r"^\s*//\s*[^\s]*$", line) - and not re.match(r"^// \$Id:.*#[0-9]+ \$$", line) - and not re.match(r"^\s*/// [@\\](copydoc|copydetails|copybrief) .*$", line) - ): - line_width = GetLineWidth(line) - if line_width > _line_length: - error( - filename, - linenum, - "whitespace/line_length", - 2, - f"Lines should be <= {_line_length} characters long", - ) - - if ( - cleansed_line.count(";") > 1 - and - # allow simple single line lambdas - not re.match(r"^[^{};]*\[[^\[\]]*\][^{}]*\{[^{}\n\r]*\}", line) - and - # for loops are allowed two ;'s (and may run over two lines). - cleansed_line.find("for") == -1 - and ( - GetPreviousNonBlankLine(clean_lines, linenum)[0].find("for") == -1 - or GetPreviousNonBlankLine(clean_lines, linenum)[0].find(";") != -1 - ) - and - # It's ok to have many commands in a switch case that fits in 1 line - not ( - (cleansed_line.find("case ") != -1 or cleansed_line.find("default:") != -1) - and cleansed_line.find("break;") != -1 - ) - ): - error(filename, linenum, "whitespace/newline", 0, "More than one command on the same line") - - # Some more style checks - CheckBraces(filename, clean_lines, linenum, error) - CheckTrailingSemicolon(filename, clean_lines, linenum, error) - CheckEmptyBlockBody(filename, clean_lines, linenum, error) - CheckSpacing(filename, clean_lines, linenum, nesting_state, error) - CheckOperatorSpacing(filename, clean_lines, linenum, error) - CheckParenthesisSpacing(filename, clean_lines, linenum, error) - CheckCommaSpacing(filename, clean_lines, linenum, error) - CheckBracesSpacing(filename, clean_lines, linenum, nesting_state, error) - CheckSpacingForFunctionCall(filename, clean_lines, linenum, error) - CheckCheck(filename, clean_lines, linenum, error) - CheckAltTokens(filename, clean_lines, linenum, error) - CheckNullTokens(filename, clean_lines, linenum, error) - CheckV8PersistentTokens(filename, clean_lines, linenum, error) - CheckLeftLeaningPointer(filename, clean_lines, linenum, error) - classinfo = nesting_state.InnermostClass() - if classinfo: - CheckSectionSpacing(filename, clean_lines, classinfo, linenum, error) - - -_RE_PATTERN_INCLUDE = re.compile(r'^\s*#\s*include\s*([<"])([^>"]*)[>"].*$') -# Matches the first component of a filename delimited by -s and _s. That is: -# _RE_FIRST_COMPONENT.match('foo').group(0) == 'foo' -# _RE_FIRST_COMPONENT.match('foo.cc').group(0) == 'foo' -# _RE_FIRST_COMPONENT.match('foo-bar_baz.cc').group(0) == 'foo' -# _RE_FIRST_COMPONENT.match('foo_bar-baz.cc').group(0) == 'foo' -_RE_FIRST_COMPONENT = re.compile(r"^[^-_.]+") - - -def _DropCommonSuffixes(filename): - """Drops common suffixes like _test.cc or -inl.h from filename. - - For example: - >>> _DropCommonSuffixes('foo/foo-inl.h') - 'foo/foo' - >>> _DropCommonSuffixes('foo/bar/foo.cc') - 'foo/bar/foo' - >>> _DropCommonSuffixes('foo/foo_internal.h') - 'foo/foo' - >>> _DropCommonSuffixes('foo/foo_unusualinternal.h') - 'foo/foo_unusualinternal' - - Args: - filename: The input filename. - - Returns: - The filename with the common suffix removed. - """ - for suffix in itertools.chain( - ( - f"{test_suffix.lstrip('_')}.{ext}" - for test_suffix, ext in itertools.product(_test_suffixes, GetNonHeaderExtensions()) - ), - ( - f"{suffix}.{ext}" - for suffix, ext in itertools.product(["inl", "imp", "internal"], GetHeaderExtensions()) - ), - ): - if ( - filename.endswith(suffix) - and len(filename) > len(suffix) - and filename[-len(suffix) - 1] in ("-", "_") - ): - return filename[: -len(suffix) - 1] - return os.path.splitext(filename)[0] - - -def _ClassifyInclude(fileinfo, include, used_angle_brackets, include_order="default"): - """Figures out what kind of header 'include' is. - - Args: - fileinfo: The current file cpplint is running over. A FileInfo instance. - include: The path to a #included file. - used_angle_brackets: True if the #include used <> rather than "". - include_order: "default" or other value allowed in program arguments - - Returns: - One of the _XXX_HEADER constants. - - For example: - >>> _ClassifyInclude(FileInfo('foo/foo.cc'), 'stdio.h', True) - _C_SYS_HEADER - >>> _ClassifyInclude(FileInfo('foo/foo.cc'), 'string', True) - _CPP_SYS_HEADER - >>> _ClassifyInclude(FileInfo('foo/foo.cc'), 'foo/foo.h', True, "standardcfirst") - _OTHER_SYS_HEADER - >>> _ClassifyInclude(FileInfo('foo/foo.cc'), 'foo/foo.h', False) - _LIKELY_MY_HEADER - >>> _ClassifyInclude(FileInfo('foo/foo_unknown_extension.cc'), - ... 'bar/foo_other_ext.h', False) - _POSSIBLE_MY_HEADER - >>> _ClassifyInclude(FileInfo('foo/foo.cc'), 'foo/bar.h', False) - _OTHER_HEADER - """ - # This is a list of all standard c++ header files, except - # those already checked for above. - is_cpp_header = include in _CPP_HEADERS - - # Mark include as C header if in list or in a known folder for standard-ish C headers. - is_std_c_header = (include_order == "default") or ( - include in _C_HEADERS - # additional linux glibc header folders - or re.search(rf"(?:{'|'.join(C_STANDARD_HEADER_FOLDERS)})\/.*\.h", include) - ) - - # Headers with C++ extensions shouldn't be considered C system headers - include_ext = os.path.splitext(include)[1] - is_system = used_angle_brackets and include_ext not in [".hh", ".hpp", ".hxx", ".h++"] - - if is_system: - if is_cpp_header: - return _CPP_SYS_HEADER - if is_std_c_header: - return _C_SYS_HEADER - return _OTHER_SYS_HEADER - - # If the target file and the include we're checking share a - # basename when we drop common extensions, and the include - # lives in . , then it's likely to be owned by the target file. - target_dir, target_base = os.path.split(_DropCommonSuffixes(fileinfo.RepositoryName())) - include_dir, include_base = os.path.split(_DropCommonSuffixes(include)) - target_dir_pub = os.path.normpath(target_dir + "/../public") - target_dir_pub = target_dir_pub.replace("\\", "/") - if target_base == include_base and (include_dir in (target_dir, target_dir_pub)): - return _LIKELY_MY_HEADER - - # If the target and include share some initial basename - # component, it's possible the target is implementing the - # include, so it's allowed to be first, but we'll never - # complain if it's not there. - target_first_component = _RE_FIRST_COMPONENT.match(target_base) - include_first_component = _RE_FIRST_COMPONENT.match(include_base) - if ( - target_first_component - and include_first_component - and target_first_component.group(0) == include_first_component.group(0) - ): - return _POSSIBLE_MY_HEADER - - return _OTHER_HEADER - - -def CheckIncludeLine(filename, clean_lines, linenum, include_state, error): - """Check rules that are applicable to #include lines. - - Strings on #include lines are NOT removed from elided line, to make - certain tasks easier. However, to prevent false positives, checks - applicable to #include lines in CheckLanguage must be put here. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - include_state: An _IncludeState instance in which the headers are inserted. - error: The function to call with any errors found. - """ - fileinfo = FileInfo(filename) - line = clean_lines.lines[linenum] - - # "include" should use the new style "foo/bar.h" instead of just "bar.h" - # Only do this check if the included header follows google naming - # conventions. If not, assume that it's a 3rd party API that - # requires special include conventions. - # - # We also make an exception for Lua headers, which follow google - # naming convention but not the include convention. - match = re.match(r'#include\s*"([^/]+\.(.*))"', line) - if ( - match - and IsHeaderExtension(match.group(2)) - and not _third_party_headers_pattern.match(match.group(1)) - ): - error( - filename, - linenum, - "build/include_subdir", - 4, - "Include the directory when naming header files", - ) - - # we shouldn't include a file more than once. actually, there are a - # handful of instances where doing so is okay, but in general it's - # not. - match = _RE_PATTERN_INCLUDE.search(line) - if match: - include = match.group(2) - used_angle_brackets = match.group(1) == "<" - duplicate_line = include_state.FindHeader(include) - if duplicate_line >= 0: - error( - filename, - linenum, - "build/include", - 4, - f'"{include}" already included at {filename}:{duplicate_line}', - ) - return - - for extension in GetNonHeaderExtensions(): - if include.endswith("." + extension) and os.path.dirname( - fileinfo.RepositoryName() - ) != os.path.dirname(include): - error( - filename, - linenum, - "build/include", - 4, - "Do not include ." + extension + " files from other packages", - ) - return - - # We DO want to include a 3rd party looking header if it matches the - # filename. Otherwise we get an erroneous error "...should include its - # header" error later. - third_src_header = False - for ext in GetHeaderExtensions(): - basefilename = filename[0 : len(filename) - len(fileinfo.Extension())] - headerfile = basefilename + "." + ext - headername = FileInfo(headerfile).RepositoryName() - if headername in include or include in headername: - third_src_header = True - break - - if third_src_header or not _third_party_headers_pattern.match(include): - include_state.include_list[-1].append((include, linenum)) - - # We want to ensure that headers appear in the right order: - # 1) for foo.cc, foo.h (preferred location) - # 2) c system files - # 3) cpp system files - # 4) for foo.cc, foo.h (deprecated location) - # 5) other google headers - # - # We classify each include statement as one of those 5 types - # using a number of techniques. The include_state object keeps - # track of the highest type seen, and complains if we see a - # lower type after that. - error_message = include_state.CheckNextIncludeOrder( - _ClassifyInclude(fileinfo, include, used_angle_brackets, _include_order) - ) - if error_message: - error( - filename, - linenum, - "build/include_order", - 4, - f"{error_message}. Should be: {fileinfo.BaseName()}.h, c system," - " c++ system, other.", - ) - canonical_include = include_state.CanonicalizeAlphabeticalOrder(include) - if not include_state.IsInAlphabeticalOrder(clean_lines, linenum, canonical_include): - error( - filename, - linenum, - "build/include_alpha", - 4, - f'Include "{include}" not in alphabetical order', - ) - include_state.SetLastHeader(canonical_include) - - -def _GetTextInside(text, start_pattern): - r"""Retrieves all the text between matching open and close parentheses. - - Given a string of lines and a regular expression string, retrieve all the text - following the expression and between opening punctuation symbols like - (, [, or {, and the matching close-punctuation symbol. This properly nested - occurrences of the punctuation, so for the text like - printf(a(), b(c())); - a call to _GetTextInside(text, r'printf\(') will return 'a(), b(c())'. - start_pattern must match string having an open punctuation symbol at the end. - - Args: - text: The lines to extract text. Its comments and strings must be elided. - It can be single line and can span multiple lines. - start_pattern: The regexp string indicating where to start extracting - the text. - Returns: - The extracted text. - None if either the opening string or ending punctuation could not be found. - """ - # TODO(google): Audit cpplint.py to see what places could be profitably - # rewritten to use _GetTextInside (and use inferior regexp matching today). - - # Give opening punctuation to get the matching close-punctuation. - matching_punctuation = {"(": ")", "{": "}", "[": "]"} - closing_punctuation = set(dict.values(matching_punctuation)) - - # Find the position to start extracting text. - match = re.search(start_pattern, text, re.MULTILINE) - if not match: # start_pattern not found in text. - return None - start_position = match.end(0) - - assert start_position > 0, "start_pattern must ends with an opening punctuation." - assert text[start_position - 1] in matching_punctuation, ( - "start_pattern must ends with an opening punctuation." - ) - # Stack of closing punctuation we expect to have in text after position. - punctuation_stack = [matching_punctuation[text[start_position - 1]]] - position = start_position - while punctuation_stack and position < len(text): - if text[position] == punctuation_stack[-1]: - punctuation_stack.pop() - elif text[position] in closing_punctuation: - # A closing punctuation without matching opening punctuation. - return None - elif text[position] in matching_punctuation: - punctuation_stack.append(matching_punctuation[text[position]]) - position += 1 - if punctuation_stack: - # Opening punctuation left without matching close-punctuation. - return None - # punctuation match. - return text[start_position : position - 1] - - -# Patterns for matching call-by-reference parameters. -# -# Supports nested templates up to 2 levels deep using this messy pattern: -# < (?: < (?: < [^<>]* -# > -# | [^<>] )* -# > -# | [^<>] )* -# > -_RE_PATTERN_IDENT = r"[_a-zA-Z]\w*" # =~ [[:alpha:]][[:alnum:]]* -_RE_PATTERN_TYPE = ( - r"(?:const\s+)?(?:typename\s+|class\s+|struct\s+|union\s+|enum\s+)?" - r"(?:\w|" - r"\s*<(?:<(?:<[^<>]*>|[^<>])*>|[^<>])*>|" - r"::)+" -) -# A call-by-reference parameter ends with '& identifier'. -_RE_PATTERN_REF_PARAM = re.compile( - r"(" + _RE_PATTERN_TYPE + r"(?:\s*(?:\bconst\b|[*]))*\s*" - r"&\s*" + _RE_PATTERN_IDENT + r")\s*(?:=[^,()]+)?[,)]" -) -# A call-by-const-reference parameter either ends with 'const& identifier' -# or looks like 'const type& identifier' when 'type' is atomic. -_RE_PATTERN_CONST_REF_PARAM = ( - r"(?:.*\s*\bconst\s*&\s*" - + _RE_PATTERN_IDENT - + r"|const\s+" - + _RE_PATTERN_TYPE - + r"\s*&\s*" - + _RE_PATTERN_IDENT - + r")" -) -# Stream types. -_RE_PATTERN_REF_STREAM_PARAM = r"(?:.*stream\s*&\s*" + _RE_PATTERN_IDENT + r")" - - -def CheckLanguage( - filename, clean_lines, linenum, file_extension, include_state, nesting_state, error -): - """Checks rules from the 'C++ language rules' section of cppguide.html. - - Some of these rules are hard to test (function overloading, using - uint32_t inappropriately), but we do the best we can. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - file_extension: The extension (without the dot) of the filename. - include_state: An _IncludeState instance in which the headers are inserted. - nesting_state: A NestingState instance which maintains information about - the current stack of nested blocks being parsed. - error: The function to call with any errors found. - """ - # If the line is empty or consists of entirely a comment, no need to - # check it. - line = clean_lines.elided[linenum] - if not line: - return - - match = _RE_PATTERN_INCLUDE.search(line) - if match: - CheckIncludeLine(filename, clean_lines, linenum, include_state, error) - return - - # Reset include state across preprocessor directives. This is meant - # to silence warnings for conditional includes. - match = re.match(r"^\s*#\s*(if|ifdef|ifndef|elif|else|endif)\b", line) - if match: - include_state.ResetSection(match.group(1)) - - # Perform other checks now that we are sure that this is not an include line - CheckCasts(filename, clean_lines, linenum, error) - CheckGlobalStatic(filename, clean_lines, linenum, error) - CheckPrintf(filename, clean_lines, linenum, error) - - if IsHeaderExtension(file_extension): - # TODO(google): check that 1-arg constructors are explicit. - # How to tell it's a constructor? - # (handled in CheckForNonStandardConstructs for now) - # TODO(google): check that classes declare or disable copy/assign - # (level 1 error) - pass - - # Check if people are using the verboten C basic types. The only exception - # we regularly allow is "unsigned short port" for port. - if re.search(r"\bshort port\b", line): - if not re.search(r"\bunsigned short port\b", line): - error( - filename, linenum, "runtime/int", 4, 'Use "unsigned short" for ports, not "short"' - ) - else: - match = re.search(r"\b(short|long(?! +double)|long long)\b", line) - if match: - error( - filename, - linenum, - "runtime/int", - 4, - f"Use int16_t/int64_t/etc, rather than the C type {match.group(1)}", - ) - - # Check if some verboten operator overloading is going on - # TODO(google): catch out-of-line unary operator&: - # class X {}; - # int operator&(const X& x) { return 42; } // unary operator& - # The trick is it's hard to tell apart from binary operator&: - # class Y { int operator&(const Y& x) { return 23; } }; // binary operator& - if re.search(r"\boperator\s*&\s*\(\s*\)", line): - error( - filename, - linenum, - "runtime/operator", - 4, - "Unary operator& is dangerous. Do not use it.", - ) - - # Check for suspicious usage of "if" like - # } if (a == b) { - if re.search(r"\}\s*if\s*\(", line): - error( - filename, - linenum, - "readability/braces", - 4, - 'Did you mean "else if"? If not, start a new line for "if".', - ) - - # Check for potential format string bugs like printf(foo). - # We constrain the pattern not to pick things like DocidForPrintf(foo). - # Not perfect but it can catch printf(foo.c_str()) and printf(foo->c_str()) - # TODO(google): Catch the following case. Need to change the calling - # convention of the whole function to process multiple line to handle it. - # printf( - # boy_this_is_a_really_long_variable_that_cannot_fit_on_the_prev_line); - if printf_args := _GetTextInside(line, r"(?i)\b(string)?printf\s*\("): - match = re.match(r"([\w.\->()]+)$", printf_args) - if match and match.group(1) != "__VA_ARGS__": - function_name = re.search(r"\b((?:string)?printf)\s*\(", line, re.IGNORECASE).group(1) - error( - filename, - linenum, - "runtime/printf", - 4, - f'Potential format string bug. Do {function_name}("%s", {match.group(1)}) instead.', - ) - - # Check for potential memset bugs like memset(buf, sizeof(buf), 0). - match = re.search(r"memset\s*\(([^,]*),\s*([^,]*),\s*0\s*\)", line) - if match and not re.match(r"^''|-?[0-9]+|0x[0-9A-Fa-f]$", match.group(2)): - error( - filename, - linenum, - "runtime/memset", - 4, - f'Did you mean "memset({match.group(1)}, 0, {match.group(2)})"?', - ) - - if re.search(r"\busing namespace\b", line): - is_literals = re.search(r"\bliterals\b", line) is not None - is_header = not _IsSourceExtension(file_extension) - file_type = "header" if is_header else "source" - - # Check for the block scope for multiline blocks. - # Check if the line starts with the using directive as a heuristic in case it's all one line - is_block_scope = nesting_state.InBlockScope() or not line.startswith("using namespace") - - scope_type = "block" if is_block_scope else "namespace" - literal_type = "literals" if is_literals else "nonliterals" - - specific_category = f"build/namespaces/{file_type}/{scope_type}/{literal_type}" - - error( - filename, - linenum, - specific_category, - 5, - "Do not use namespace using-directives. Use using-declarations instead.", - ) - - # Detect variable-length arrays. - match = re.match(r"\s*(.+::)?(\w+) [a-z]\w*\[(.+)];", line) - if ( - match - and match.group(2) != "return" - and match.group(2) != "delete" - and match.group(3).find("]") == -1 - ): - # Split the size using space and arithmetic operators as delimiters. - # If any of the resulting tokens are not compile time constants then - # report the error. - tokens = re.split(r"\s|\+|\-|\*|\/|<<|>>]", match.group(3)) - is_const = True - skip_next = False - for tok in tokens: - if skip_next: - skip_next = False - continue - - if re.search(r"sizeof\(.+\)", tok): - continue - if re.search(r"arraysize\(\w+\)", tok): - continue - - tok = tok.lstrip("(") - tok = tok.rstrip(")") - if not tok: - continue - if re.match(r"\d+", tok): - continue - if re.match(r"0[xX][0-9a-fA-F]+", tok): - continue - if re.match(r"k[A-Z0-9]\w*", tok): - continue - if re.match(r"(.+::)?k[A-Z0-9]\w*", tok): - continue - if re.match(r"(.+::)?[A-Z][A-Z0-9_]*", tok): - continue - # A catch all for tricky sizeof cases, including 'sizeof expression', - # 'sizeof(*type)', 'sizeof(const type)', 'sizeof(struct StructName)' - # requires skipping the next token because we split on ' ' and '*'. - if tok.startswith("sizeof"): - skip_next = True - continue - is_const = False - break - if not is_const: - error( - filename, - linenum, - "runtime/arrays", - 1, - "Do not use variable-length arrays. Use an appropriately named " - "('k' followed by CamelCase) compile-time constant for the size.", - ) - - # Check for use of unnamed namespaces in header files. Registration - # macros are typically OK, so we allow use of "namespace {" on lines - # that end with backslashes. - if ( - IsHeaderExtension(file_extension) - and re.search(r"\bnamespace\s*{", line) - and line[-1] != "\\" - ): - error( - filename, - linenum, - "build/namespaces_headers", - 4, - "Do not use unnamed namespaces in header files. See " - "https://google.github.io/styleguide/cppguide.html#Namespaces" - " for more information.", - ) - - -def CheckGlobalStatic(filename, clean_lines, linenum, error): - """Check for unsafe global or static objects. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - line = clean_lines.elided[linenum] - - # Match two lines at a time to support multiline declarations - if linenum + 1 < clean_lines.NumLines() and not re.search(r"[;({]", line): - line += clean_lines.elided[linenum + 1].strip() - - # Check for people declaring static/global STL strings at the top level. - # This is dangerous because the C++ language does not guarantee that - # globals with constructors are initialized before the first access, and - # also because globals can be destroyed when some threads are still running. - # TODO(google): Generalize this to also find static unique_ptr instances. - # TODO(google): File bugs for clang-tidy to find these. - match = re.match( - r"((?:|static +)(?:|const +))(?::*std::)?string( +const)? +" - r"([a-zA-Z0-9_:]+)\b(.*)", - line, - ) - - # Remove false positives: - # - String pointers (as opposed to values). - # string *pointer - # const string *pointer - # string const *pointer - # string *const pointer - # - # - Functions and template specializations. - # string Function(... - # string Class::Method(... - # - # - Operators. These are matched separately because operator names - # cross non-word boundaries, and trying to match both operators - # and functions at the same time would decrease accuracy of - # matching identifiers. - # string Class::operator*() - if ( - match - and not re.search(r"\bstring\b(\s+const)?\s*[\*\&]\s*(const\s+)?\w", line) - and not re.search(r"\boperator\W", line) - and not re.match(r'\s*(<.*>)?(::[a-zA-Z0-9_]+)*\s*\(([^"]|$)', match.group(4)) - ): - if re.search(r"\bconst\b", line): - error( - filename, - linenum, - "runtime/string", - 4, - "For a static/global string constant, use a C style string instead:" - f' "{match.group(1)}char{match.group(2) or ""} {match.group(3)}[]".', - ) - else: - error( - filename, - linenum, - "runtime/string", - 4, - "Static/global string variables are not permitted.", - ) - - if re.search(r"\b([A-Za-z0-9_]*_)\(\1\)", line) or re.search( - r"\b([A-Za-z0-9_]*_)\(CHECK_NOTNULL\(\1\)\)", line - ): - error( - filename, - linenum, - "runtime/init", - 4, - "You seem to be initializing a member variable with itself.", - ) - - -def CheckPrintf(filename, clean_lines, linenum, error): - """Check for printf related issues. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - line = clean_lines.elided[linenum] - - # When snprintf is used, the second argument shouldn't be a literal. - match = re.search(r"snprintf\s*\(([^,]*),\s*([0-9]*)\s*,", line) - if match and match.group(2) != "0": - # If 2nd arg is zero, snprintf is used to calculate size. - error( - filename, - linenum, - "runtime/printf", - 3, - "If you can, use" - f" sizeof({match.group(1)}) instead of {match.group(2)}" - " as the 2nd arg to snprintf.", - ) - - # Check if some verboten C functions are being used. - if re.search(r"\bsprintf\s*\(", line): - error(filename, linenum, "runtime/printf", 5, "Never use sprintf. Use snprintf instead.") - match = re.search(r"\b(strcpy|strcat)\s*\(", line) - if match: - error( - filename, - linenum, - "runtime/printf", - 4, - f"Almost always, snprintf is better than {match.group(1)}", - ) - - -def IsDerivedFunction(clean_lines, linenum): - """Check if current line contains an inherited function. - - Args: - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - Returns: - True if current line contains a function with "override" - virt-specifier. - """ - # Scan back a few lines for start of current function - for i in range(linenum, max(-1, linenum - 10), -1): - match = re.match(r"^([^()]*\w+)\(", clean_lines.elided[i]) - if match: - # Look for "override" after the matching closing parenthesis - line, _, closing_paren = CloseExpression(clean_lines, i, len(match.group(1))) - return closing_paren >= 0 and re.search(r"\boverride\b", line[closing_paren:]) - return False - - -def IsOutOfLineMethodDefinition(clean_lines, linenum): - """Check if current line contains an out-of-line method definition. - - Args: - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - Returns: - True if current line contains an out-of-line method definition. - """ - # Scan back a few lines for start of current function - for i in range(linenum, max(-1, linenum - 10), -1): - if re.match(r"^([^()]*\w+)\(", clean_lines.elided[i]): - return re.match(r"^[^()]*\w+::\w+\(", clean_lines.elided[i]) is not None - return False - - -def IsInitializerList(clean_lines, linenum): - """Check if current line is inside constructor initializer list. - - Args: - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - Returns: - True if current line appears to be inside constructor initializer - list, False otherwise. - """ - for i in range(linenum, 1, -1): - line = clean_lines.elided[i] - if i == linenum: - remove_function_body = re.match(r"^(.*)\{\s*$", line) - if remove_function_body: - line = remove_function_body.group(1) - - if re.search(r"\s:\s*\w+[({]", line): - # A lone colon tend to indicate the start of a constructor - # initializer list. It could also be a ternary operator, which - # also tend to appear in constructor initializer lists as - # opposed to parameter lists. - return True - if re.search(r"\}\s*,\s*$", line): - # A closing brace followed by a comma is probably the end of a - # brace-initialized member in constructor initializer list. - return True - if re.search(r"[{};]\s*$", line): - # Found one of the following: - # - A closing brace or semicolon, probably the end of the previous - # function. - # - An opening brace, probably the start of current class or namespace. - # - # Current line is probably not inside an initializer list since - # we saw one of those things without seeing the starting colon. - return False - - # Got to the beginning of the file without seeing the start of - # constructor initializer list. - return False - - -def CheckForNonConstReference(filename, clean_lines, linenum, nesting_state, error): - """Check for non-const references. - - Separate from CheckLanguage since it scans backwards from current - line, instead of scanning forward. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - nesting_state: A NestingState instance which maintains information about - the current stack of nested blocks being parsed. - error: The function to call with any errors found. - """ - # Do nothing if there is no '&' on current line. - line = clean_lines.elided[linenum] - if "&" not in line: - return - - # If a function is inherited, current function doesn't have much of - # a choice, so any non-const references should not be blamed on - # derived function. - if IsDerivedFunction(clean_lines, linenum): - return - - # Don't warn on out-of-line method definitions, as we would warn on the - # in-line declaration, if it isn't marked with 'override'. - if IsOutOfLineMethodDefinition(clean_lines, linenum): - return - - # Long type names may be broken across multiple lines, usually in one - # of these forms: - # LongType - # ::LongTypeContinued &identifier - # LongType:: - # LongTypeContinued &identifier - # LongType< - # ...>::LongTypeContinued &identifier - # - # If we detected a type split across two lines, join the previous - # line to current line so that we can match const references - # accordingly. - # - # Note that this only scans back one line, since scanning back - # arbitrary number of lines would be expensive. If you have a type - # that spans more than 2 lines, please use a typedef. - if linenum > 1: - previous = None - if re.match(r"\s*::(?:[\w<>]|::)+\s*&\s*\S", line): - # previous_line\n + ::current_line - previous = re.search( - r"\b((?:const\s*)?(?:[\w<>]|::)+[\w<>])\s*$", clean_lines.elided[linenum - 1] - ) - elif re.match(r"\s*[a-zA-Z_]([\w<>]|::)+\s*&\s*\S", line): - # previous_line::\n + current_line - previous = re.search( - r"\b((?:const\s*)?(?:[\w<>]|::)+::)\s*$", clean_lines.elided[linenum - 1] - ) - if previous: - line = previous.group(1) + line.lstrip() - else: - # Check for templated parameter that is split across multiple lines - endpos = line.rfind(">") - if endpos > -1: - (_, startline, startpos) = ReverseCloseExpression(clean_lines, linenum, endpos) - if startpos > -1 and startline < linenum: - # Found the matching < on an earlier line, collect all - # pieces up to current line. - line = "" - for i in range(startline, linenum + 1): - line += clean_lines.elided[i].strip() - - # Check for non-const references in function parameters. A single '&' may - # found in the following places: - # inside expression: binary & for bitwise AND - # inside expression: unary & for taking the address of something - # inside declarators: reference parameter - # We will exclude the first two cases by checking that we are not inside a - # function body, including one that was just introduced by a trailing '{'. - # TODO(google): Doesn't account for 'catch(Exception& e)' [rare]. - if nesting_state.previous_stack_top and not ( - isinstance(nesting_state.previous_stack_top, (_ClassInfo, _NamespaceInfo)) - ): - # Not at toplevel, not within a class, and not within a namespace - return - - # Avoid initializer lists. We only need to scan back from the - # current line for something that starts with ':'. - # - # We don't need to check the current line, since the '&' would - # appear inside the second set of parentheses on the current line as - # opposed to the first set. - if linenum > 0: - for i in range(linenum - 1, max(0, linenum - 10), -1): - previous_line = clean_lines.elided[i] - if not re.search(r"[),]\s*$", previous_line): - break - if re.match(r"^\s*:\s+\S", previous_line): - return - - # Avoid preprocessors - if re.search(r"\\\s*$", line): - return - - # Avoid constructor initializer lists - if IsInitializerList(clean_lines, linenum): - return - - # We allow non-const references in a few standard places, like functions - # called "swap()" or iostream operators like "<<" or ">>". Do not check - # those function parameters. - # - # We also accept & in static_assert, which looks like a function but - # it's actually a declaration expression. - allowed_functions = ( - r"(?:[sS]wap(?:<\w:+>)?|" - r"operator\s*[<>][<>]|" - r"static_assert|COMPILE_ASSERT" - r")\s*\(" - ) - if re.search(allowed_functions, line): - return - if not re.search(r"\S+\([^)]*$", line): - # Don't see an allowed function on this line. Actually we - # didn't see any function name on this line, so this is likely a - # multi-line parameter list. Try a bit harder to catch this case. - for i in range(2): - if linenum > i and re.search(allowed_functions, clean_lines.elided[linenum - i - 1]): - return - - decls = re.sub(r"{[^}]*}", " ", line) # exclude function body - for parameter in re.findall(_RE_PATTERN_REF_PARAM, decls): - if not re.match(_RE_PATTERN_CONST_REF_PARAM, parameter) and not re.match( - _RE_PATTERN_REF_STREAM_PARAM, parameter - ): - error( - filename, - linenum, - "runtime/references", - 2, - "Is this a non-const reference? " - "If so, make const or use a pointer: " + re.sub(" *<", "<", parameter), - ) - - -def CheckCasts(filename, clean_lines, linenum, error): - """Various cast related checks. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - line = clean_lines.elided[linenum] - - # Check to see if they're using an conversion function cast. - # I just try to capture the most common basic types, though there are more. - # Parameterless conversion functions, such as bool(), are allowed as they are - # probably a member operator declaration or default constructor. - match = re.search( - r"(\bnew\s+(?:const\s+)?|\S<\s*(?:const\s+)?)?\b" - r"(int|float|double|bool|char|int16_t|uint16_t|int32_t|uint32_t|int64_t|uint64_t)" - r"(\([^)].*)", - line, - ) - expecting_function = ExpectingFunctionArgs(clean_lines, linenum) - if match and not expecting_function: - matched_type = match.group(2) - - # matched_new_or_template is used to silence two false positives: - # - New operators - # - Template arguments with function types - # - # For template arguments, we match on types immediately following - # an opening bracket without any spaces. This is a fast way to - # silence the common case where the function type is the first - # template argument. False negative with less-than comparison is - # avoided because those operators are usually followed by a space. - # - # function // bracket + no space = false positive - # value < double(42) // bracket + space = true positive - matched_new_or_template = match.group(1) - - # Avoid arrays by looking for brackets that come after the closing - # parenthesis. - if re.match(r"\([^()]+\)\s*\[", match.group(3)): - return - - # Other things to ignore: - # - Function pointers - # - Casts to pointer types - # - Placement new - # - Alias declarations - matched_funcptr = match.group(3) - if ( - matched_new_or_template is None - and not ( - matched_funcptr - and ( - re.match(r"\((?:[^() ]+::\s*\*\s*)?[^() ]+\)\s*\(", matched_funcptr) - or matched_funcptr.startswith("(*)") - ) - ) - and not re.match(r"\s*using\s+\S+\s*=\s*" + matched_type, line) - and not re.search(r"new\(\S+\)\s*" + matched_type, line) - ): - error( - filename, - linenum, - "readability/casting", - 4, - f"Using deprecated casting style. Use static_cast<{matched_type}>(...) instead", - ) - - if not expecting_function: - CheckCStyleCast( - filename, - clean_lines, - linenum, - "static_cast", - r"\((int|float|double|bool|char|u?int(16|32|64)_t|size_t)\)", - error, - ) - - # This doesn't catch all cases. Consider (const char * const)"hello". - # - # (char *) "foo" should always be a const_cast (reinterpret_cast won't - # compile). - if CheckCStyleCast( - filename, clean_lines, linenum, "const_cast", r'\((char\s?\*+\s?)\)\s*"', error - ): - pass - else: - # Check pointer casts for other than string constants - CheckCStyleCast( - filename, clean_lines, linenum, "reinterpret_cast", r"\((\w+\s?\*+\s?)\)", error - ) - - # In addition, we look for people taking the address of a cast. This - # is dangerous -- casts can assign to temporaries, so the pointer doesn't - # point where you think. - # - # Some non-identifier character is required before the '&' for the - # expression to be recognized as a cast. These are casts: - # expression = &static_cast(temporary()); - # function(&(int*)(temporary())); - # - # This is not a cast: - # reference_type&(int* function_param); - match = re.search( - r"(?:[^\w]&\(([^)*][^)]*)\)[\w(])|" - r"(?:[^\w]&(static|dynamic|down|reinterpret)_cast\b)", - line, - ) - if match: - # Try a better error message when the & is bound to something - # dereferenced by the casted pointer, as opposed to the casted - # pointer itself. - parenthesis_error = False - match = re.match(r"^(.*&(?:static|dynamic|down|reinterpret)_cast\b)<", line) - if match: - _, y1, x1 = CloseExpression(clean_lines, linenum, len(match.group(1))) - if x1 >= 0 and clean_lines.elided[y1][x1] == "(": - _, y2, x2 = CloseExpression(clean_lines, y1, x1) - if x2 >= 0: - extended_line = clean_lines.elided[y2][x2:] - if y2 < clean_lines.NumLines() - 1: - extended_line += clean_lines.elided[y2 + 1] - if re.match(r"\s*(?:->|\[)", extended_line): - parenthesis_error = True - - if parenthesis_error: - error( - filename, - linenum, - "readability/casting", - 4, - ( - "Are you taking an address of something dereferenced " - "from a cast? Wrapping the dereferenced expression in " - "parentheses will make the binding more obvious" - ), - ) - else: - error( - filename, - linenum, - "runtime/casting", - 4, - ( - "Are you taking an address of a cast? " - "This is dangerous: could be a temp var. " - "Take the address before doing the cast, rather than after" - ), - ) - - -def CheckCStyleCast(filename, clean_lines, linenum, cast_type, pattern, error): - """Checks for a C-style cast by looking for the pattern. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - cast_type: The string for the C++ cast to recommend. This is either - reinterpret_cast, static_cast, or const_cast, depending. - pattern: The regular expression used to find C-style casts. - error: The function to call with any errors found. - - Returns: - True if an error was emitted. - False otherwise. - """ - line = clean_lines.elided[linenum] - match = re.search(pattern, line) - if not match: - return False - - # Exclude lines with keywords that tend to look like casts - context = line[0 : match.start(1) - 1] - if re.match(r".*\b(?:sizeof|alignof|alignas|[_A-Z][_A-Z0-9]*)\s*$", context): - return False - - # Try expanding current context to see if we one level of - # parentheses inside a macro. - if linenum > 0: - for i in range(linenum - 1, max(0, linenum - 5), -1): - context = clean_lines.elided[i] + context - if re.match(r".*\b[_A-Z][_A-Z0-9]*\s*\((?:\([^()]*\)|[^()])*$", context): - return False - - # operator++(int) and operator--(int) - if context.endswith((" operator++", " operator--", "::operator++", "::operator--")): - return False - - # A single unnamed argument for a function tends to look like old style cast. - # If we see those, don't issue warnings for deprecated casts. - remainder = line[match.end(0) :] - if re.match(r"^\s*(?:;|const\b|throw\b|final\b|override\b|[=>{),]|->)", remainder): - return False - - # At this point, all that should be left is actual casts. - error( - filename, - linenum, - "readability/casting", - 4, - f"Using C-style cast. Use {cast_type}<{match.group(1)}>(...) instead", - ) - - return True - - -def ExpectingFunctionArgs(clean_lines, linenum): - """Checks whether where function type arguments are expected. - - Args: - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - - Returns: - True if the line at 'linenum' is inside something that expects arguments - of function types. - """ - line = clean_lines.elided[linenum] - return re.match(r"^\s*MOCK_(CONST_)?METHOD\d+(_T)?\(", line) or ( - linenum >= 2 - and ( - re.match( - r"^\s*MOCK_(?:CONST_)?METHOD\d+(?:_T)?\((?:\S+,)?\s*$", - clean_lines.elided[linenum - 1], - ) - or re.match( - r"^\s*MOCK_(?:CONST_)?METHOD\d+(?:_T)?\(\s*$", clean_lines.elided[linenum - 2] - ) - or re.search(r"\bstd::m?function\s*\<\s*$", clean_lines.elided[linenum - 1]) - ) - ) - - -_HEADERS_CONTAINING_TEMPLATES: tuple[tuple[str, tuple[str, ...]], ...] = ( - ("", ("deque",)), - ( - "", - ( - "unary_function", - "binary_function", - "plus", - "minus", - "multiplies", - "divides", - "modulus", - "negate", - "equal_to", - "not_equal_to", - "greater", - "less", - "greater_equal", - "less_equal", - "logical_and", - "logical_or", - "logical_not", - "unary_negate", - "not1", - "binary_negate", - "not2", - "bind1st", - "bind2nd", - "pointer_to_unary_function", - "pointer_to_binary_function", - "ptr_fun", - "mem_fun_t", - "mem_fun", - "mem_fun1_t", - "mem_fun1_ref_t", - "mem_fun_ref_t", - "const_mem_fun_t", - "const_mem_fun1_t", - "const_mem_fun_ref_t", - "const_mem_fun1_ref_t", - "mem_fun_ref", - ), - ), - ("", ("numeric_limits",)), - ("", ("list",)), - ("", ("multimap",)), - ( - "", - ("allocator", "make_shared", "make_unique", "shared_ptr", "unique_ptr", "weak_ptr"), - ), - ( - "", - ( - "queue", - "priority_queue", - ), - ), - ( - "", - ( - "set", - "multiset", - ), - ), - ("", ("stack",)), - ( - "", - ( - "char_traits", - "basic_string", - ), - ), - ("", ("tuple",)), - ("", ("unordered_map", "unordered_multimap")), - ("", ("unordered_set", "unordered_multiset")), - ("", ("pair",)), - ("", ("vector",)), - # gcc extensions. - # Note: std::hash is their hash, ::hash is our hash - ( - "", - ( - "hash_map", - "hash_multimap", - ), - ), - ( - "", - ( - "hash_set", - "hash_multiset", - ), - ), - ("", ("slist",)), -) - -_HEADERS_MAYBE_TEMPLATES: tuple[tuple[str, tuple[str, ...]], ...] = ( - ( - "", - ( - "copy", - "max", - "min", - "min_element", - "sort", - "transform", - ), - ), - ("", ("forward", "make_pair", "move", "swap")), -) - -# Non templated types or global objects -_HEADERS_TYPES_OR_OBJS: tuple[tuple[str, tuple[str, ...]], ...] = ( - # String and others are special -- it is a non-templatized type in STL. - ("", ("string",)), - ("", ("cin", "cout", "cerr", "clog", "wcin", "wcout", "wcerr", "wclog")), - ("", ("FILE", "fpos_t")), -) - -# Non templated functions -_HEADERS_FUNCTIONS: tuple[tuple[str, tuple[str, ...]], ...] = ( - ( - "", - ( - "fopen", - "freopen", - "fclose", - "fflush", - "setbuf", - "setvbuf", - "fread", - "fwrite", - "fgetc", - "getc", - "fgets", - "fputc", - "putc", - "fputs", - "getchar", - "gets", - "putchar", - "puts", - "ungetc", - "scanf", - "fscanf", - "sscanf", - "vscanf", - "vfscanf", - "vsscanf", - "printf", - "fprintf", - "sprintf", - "snprintf", - "vprintf", - "vfprintf", - "vsprintf", - "vsnprintf", - "ftell", - "fgetpos", - "fseek", - "fsetpos", - "clearerr", - "feof", - "ferror", - "perror", - "tmpfile", - "tmpnam", - ), - ), -) - -_re_pattern_headers_maybe_templates: list[tuple[re.Pattern, str, str]] = [] -for _header, _templates in _HEADERS_MAYBE_TEMPLATES: - # Match max(..., ...), max(..., ...), but not foo->max, foo.max or - # 'type::max()'. - _re_pattern_headers_maybe_templates.extend( - (re.compile(r"((\bstd::)|[^>.:])\b" + _template + r"(<.*?>)?\([^\)]"), _template, _header) - for _template in _templates - ) - -# Map is often overloaded. Only check, if it is fully qualified. -# Match 'std::map(...)', but not 'map(...)'' -_re_pattern_headers_maybe_templates.append( - (re.compile(r"(std\b::\bmap\s*\<)|(^(std\b::\b)map\b\(\s*\<)"), "map<>", "") -) - -# Other scripts may reach in and modify this pattern. -_re_pattern_templates: list[tuple[re.Pattern, str, str]] = [] -for _header, _templates in _HEADERS_CONTAINING_TEMPLATES: - _re_pattern_templates.extend( - ( - re.compile(r"((^|(^|\s|((^|\W)::))std::)|[^>.:]\b)" + _template + r"\s*\<"), - _template + "<>", - _header, - ) - for _template in _templates - ) - -_re_pattern_types_or_objs: list[tuple[re.Pattern, object | type, str]] = [] -for _header, _types_or_objs in _HEADERS_TYPES_OR_OBJS: - _re_pattern_types_or_objs.extend( - (re.compile(r"\b" + _type_or_obj + r"\b"), _type_or_obj, _header) - for _type_or_obj in _types_or_objs - ) - -_re_pattern_functions: list[tuple[re.Pattern, str, str]] = [] -for _header, _functions in _HEADERS_FUNCTIONS: - # Match printf(..., ...), but not foo->printf, foo.printf or - # 'type::printf()'. - _re_pattern_functions.extend( - (re.compile(r"([^>.]|^)\b" + _function + r"\([^\)]"), _function, _header) - for _function in _functions - ) - - -def FilesBelongToSameModule(filename_cc, filename_h): - """Check if these two filenames belong to the same module. - - The concept of a 'module' here is a as follows: - foo.h, foo-inl.h, foo.cc, foo_test.cc and foo_unittest.cc belong to the - same 'module' if they are in the same directory. - some/path/public/xyzzy and some/path/internal/xyzzy are also considered - to belong to the same module here. - - If the filename_cc contains a longer path than the filename_h, for example, - '/absolute/path/to/base/sysinfo.cc', and this file would include - 'base/sysinfo.h', this function also produces the prefix needed to open the - header. This is used by the caller of this function to more robustly open the - header file. We don't have access to the real include paths in this context, - so we need this guesswork here. - - Known bugs: tools/base/bar.cc and base/bar.h belong to the same module - according to this implementation. Because of this, this function gives - some false positives. This should be sufficiently rare in practice. - - Args: - filename_cc: is the path for the source (e.g. .cc) file - filename_h: is the path for the header path - - Returns: - Tuple with a bool and a string: - bool: True if filename_cc and filename_h belong to the same module. - string: the additional prefix needed to open the header file. - """ - fileinfo_cc = FileInfo(filename_cc) - if fileinfo_cc.Extension().lstrip(".") not in GetNonHeaderExtensions(): - return (False, "") - - fileinfo_h = FileInfo(filename_h) - if not IsHeaderExtension(fileinfo_h.Extension().lstrip(".")): - return (False, "") - - filename_cc = filename_cc[: -(len(fileinfo_cc.Extension()))] - if matched_test_suffix := re.search(_TEST_FILE_SUFFIX, fileinfo_cc.BaseName()): - filename_cc = filename_cc[: -len(matched_test_suffix.group(1))] - - filename_cc = filename_cc.replace("/public/", "/") - filename_cc = filename_cc.replace("/internal/", "/") - - filename_h = filename_h[: -(len(fileinfo_h.Extension()))] - filename_h = filename_h.removesuffix("-inl") - filename_h = filename_h.replace("/public/", "/") - filename_h = filename_h.replace("/internal/", "/") - - files_belong_to_same_module = filename_cc.endswith(filename_h) - common_path = "" - if files_belong_to_same_module: - common_path = filename_cc[: -len(filename_h)] - return files_belong_to_same_module, common_path - - -def CheckForIncludeWhatYouUse(filename, clean_lines, include_state, error, io=codecs): - """Reports for missing stl includes. - - This function will output warnings to make sure you are including the headers - necessary for the stl containers and functions that you use. We only give one - reason to include a header. For example, if you use both equal_to<> and - less<> in a .h file, only one (the latter in the file) of these will be - reported as a reason to include the . - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - include_state: An _IncludeState instance. - error: The function to call with any errors found. - io: The IO factory to use to read the header file. Provided for unittest - injection. - """ - required = {} # A map of header name to linenumber and the template entity. - # Example of required: { '': (1219, 'less<>') } - - for linenum in range(clean_lines.NumLines()): - line = clean_lines.elided[linenum] - if not line or line[0] == "#": - continue - - _re_patterns = [] - _re_patterns.extend(_re_pattern_types_or_objs) - _re_patterns.extend(_re_pattern_functions) - for pattern, item, header in _re_patterns: - matched = pattern.search(line) - if matched: - # Don't warn about strings in non-STL namespaces: - # (We check only the first match per line; good enough.) - prefix = line[: matched.start()] - if prefix.endswith("std::") or not prefix.endswith("::"): - required[header] = (linenum, item) - - for pattern, template, header in _re_pattern_headers_maybe_templates: - if pattern.search(line): - required[header] = (linenum, template) - - # The following function is just a speed up, no semantics are changed. - if "<" not in line: # Reduces the cpu time usage by skipping lines. - continue - - for pattern, template, header in _re_pattern_templates: - matched = pattern.search(line) - if matched: - # Don't warn about IWYU in non-STL namespaces: - # (We check only the first match per line; good enough.) - prefix = line[: matched.start()] - if prefix.endswith("std::") or not prefix.endswith("::"): - required[header] = (linenum, template) - - # Let's flatten the include_state include_list and copy it into a dictionary. - include_dict = dict([item for sublist in include_state.include_list for item in sublist]) - - # All the lines have been processed, report the errors found. - for header in sorted(required, key=required.__getitem__): - template = required[header][1] - header_stripped = header.strip('<>"') - if header_stripped not in include_dict and not ( - header_stripped[0] == "c" and (header_stripped[1:] + ".h") in include_dict - ): - error( - filename, - required[header][0], - "build/include_what_you_use", - 4, - "Add #include " + header + " for " + template, - ) - - -_RE_PATTERN_EXPLICIT_MAKEPAIR = re.compile(r"\bmake_pair\s*<") - - -def CheckMakePairUsesDeduction(filename, clean_lines, linenum, error): - """Check that make_pair's template arguments are deduced. - - G++ 4.6 in C++11 mode fails badly if make_pair's template arguments are - specified explicitly, and such use isn't intended in any case. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - line = clean_lines.elided[linenum] - match = _RE_PATTERN_EXPLICIT_MAKEPAIR.search(line) - if match: - error( - filename, - linenum, - "build/explicit_make_pair", - 4, # 4 = high confidence - "For C++11-compatibility, omit template arguments from make_pair" - " OR use pair directly OR if appropriate, construct a pair directly", - ) - - -def CheckRedundantVirtual(filename, clean_lines, linenum, error): - """Check if line contains a redundant "virtual" function-specifier. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - # Look for "virtual" on current line. - line = clean_lines.elided[linenum] - virtual = re.match(r"^(.*)(\bvirtual\b)(.*)$", line) - if not virtual: - return - - # Ignore "virtual" keywords that are near access-specifiers. These - # are only used in class base-specifier and do not apply to member - # functions. - if re.search(r"\b(public|protected|private)\s+$", virtual.group(1)) or re.match( - r"^\s+(public|protected|private)\b", virtual.group(3) - ): - return - - # Ignore the "virtual" keyword from virtual base classes. Usually - # there is a column on the same line in these cases (virtual base - # classes are rare in google3 because multiple inheritance is rare). - if re.match(r"^.*[^:]:[^:].*$", line): - return - - # Look for the next opening parenthesis. This is the start of the - # parameter list (possibly on the next line shortly after virtual). - # TODO(google): doesn't work if there are virtual functions with - # decltype() or other things that use parentheses, but csearch suggests - # that this is rare. - end_col = -1 - end_line = -1 - start_col = len(virtual.group(2)) - for start_line in range(linenum, min(linenum + 3, clean_lines.NumLines())): - line = clean_lines.elided[start_line][start_col:] - parameter_list = re.match(r"^([^(]*)\(", line) - if parameter_list: - # Match parentheses to find the end of the parameter list - (_, end_line, end_col) = CloseExpression( - clean_lines, start_line, start_col + len(parameter_list.group(1)) - ) - break - start_col = 0 - - if end_col < 0: - return # Couldn't find end of parameter list, give up - - # Look for "override" or "final" after the parameter list - # (possibly on the next few lines). - for i in range(end_line, min(end_line + 3, clean_lines.NumLines())): - line = clean_lines.elided[i][end_col:] - match = re.search(r"\b(override|final)\b", line) - if match: - error( - filename, - linenum, - "readability/inheritance", - 4, - ( - '"virtual" is redundant since function is ' - f'already declared as "{match.group(1)}"' - ), - ) - - # Set end_col to check whole lines after we are done with the - # first line. - end_col = 0 - if re.search(r"[^\w]\s*$", line): - break - - -def CheckRedundantOverrideOrFinal(filename, clean_lines, linenum, error): - """Check if line contains a redundant "override" or "final" virt-specifier. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - # Look for closing parenthesis nearby. We need one to confirm where - # the declarator ends and where the virt-specifier starts to avoid - # false positives. - line = clean_lines.elided[linenum] - if (declarator_end := line.rfind(")")) >= 0: - fragment = line[declarator_end:] - else: - if linenum > 1 and clean_lines.elided[linenum - 1].rfind(")") >= 0: - fragment = line - else: - return - - # Check that at most one of "override" or "final" is present, not both - if re.search(r"\boverride\b", fragment) and re.search(r"\bfinal\b", fragment): - error( - filename, - linenum, - "readability/inheritance", - 4, - ('"override" is redundant since function is already declared as "final"'), - ) - - -# Returns true if we are at a new block, and it is directly -# inside of a namespace. -def IsBlockInNameSpace(nesting_state: NestingState, is_forward_declaration: bool): # noqa: FBT001 - """Checks that the new block is directly in a namespace. - - Args: - nesting_state: The NestingState object that contains info about our state. - is_forward_declaration: If the class is a forward declared class. - Returns: - Whether or not the new block is directly in a namespace. - """ - if is_forward_declaration: - return len(nesting_state.stack) >= 1 and ( - isinstance(nesting_state.stack[-1], _NamespaceInfo) - ) - - if len(nesting_state.stack) >= 1: - if isinstance(nesting_state.stack[-1], _NamespaceInfo): - return True - if ( - len(nesting_state.stack) > 1 - and isinstance(nesting_state.previous_stack_top, _NamespaceInfo) - and ( - isinstance(nesting_state.stack[-2], _NamespaceInfo) - or len(nesting_state.stack) > 2 # Accommodate for WrappedInfo - and issubclass(type(nesting_state.stack[-1]), _WrappedInfo) - and not nesting_state.stack[-2].seen_open_brace - and isinstance(nesting_state.stack[-3], _NamespaceInfo) - ) - ): - return True - return False - - -def ShouldCheckNamespaceIndentation( - nesting_state: NestingState, is_namespace_indent_item, raw_lines_no_comments, linenum -): - """This method determines if we should apply our namespace indentation check. - - Args: - nesting_state: The current nesting state. - is_namespace_indent_item: If we just put a new class on the stack, True. - If the top of the stack is not a class, or we did not recently - add the class, False. - raw_lines_no_comments: The lines without the comments. - linenum: The current line number we are processing. - - Returns: - True if we should apply our namespace indentation check. Currently, it - only works for classes and namespaces inside of a namespace. - """ - - # Required by all checks involving nesting_state - if not nesting_state.stack: - return False - - is_forward_declaration = IsForwardClassDeclaration(raw_lines_no_comments, linenum) - - if not (is_namespace_indent_item or is_forward_declaration): - return False - - # If we are in a macro, we do not want to check the namespace indentation. - if IsMacroDefinition(raw_lines_no_comments, linenum): - return False - - # Skip if we are inside an open parenthesis block (e.g. function parameters). - if nesting_state.previous_stack_top and nesting_state.previous_open_parentheses > 0: - return False - - # Skip if we are extra-indenting a member initializer list. - if ( - isinstance(nesting_state.previous_stack_top, _ConstructorInfo) # F/N (A::A() : _a(0) {/{}) - and ( - isinstance(nesting_state.stack[-1], _MemInitListInfo) - or isinstance(nesting_state.popped_top, _MemInitListInfo) - ) - ) or ( # popping constructor after MemInitList on the same line (: _a(a) {}) - isinstance(nesting_state.previous_stack_top, _ConstructorInfo) - and isinstance(nesting_state.popped_top, _ConstructorInfo) - and re.search(r"[^:]:[^:]", raw_lines_no_comments[linenum]) - ): - return False - - return IsBlockInNameSpace(nesting_state, is_forward_declaration) - - -# Call this method if the line is directly inside of a namespace. -# If the line above is blank (excluding comments) or the start of -# an inner namespace, it cannot be indented. -def CheckItemIndentationInNamespace(filename, raw_lines_no_comments, linenum, error): - line = raw_lines_no_comments[linenum] - if re.match(r"^\s+", line): - error( - filename, linenum, "whitespace/indent_namespace", 4, "Do not indent within a namespace." - ) - - -def CheckLocalVectorUsage(filename, lines, error): - """Logs an error if std::vector> is used. - Args: - filename: The name of the current file. - lines: An array of strings, each representing a line of the file. - error: The function to call with any errors found. - """ - for linenum, line in enumerate(lines): - if (re.search(r'\bstd::vector]+>>', line) or - re.search(r'\bstd::vector]+>>', line)): - error(filename, linenum, 'runtime/local_vector', 5, - 'Do not use std::vector>. ' - 'Use v8::LocalVector instead.') - - -def CheckStringValueUsage(filename, lines, error): - """Logs an error if v8's String::Value/Utf8Value are used. - Args: - filename: The name of the current file. - lines: An array of strings, each representing a line of the file. - error: The function to call with any errors found. - """ - if filename.startswith('test/') or filename.startswith('test\\'): - return # Skip test files, where Node.js headers may not be available - - for linenum, line in enumerate(lines): - if re.search(r'\bString::Utf8Value\b', line): - error(filename, linenum, 'runtime/v8_string_value', 5, - 'Do not use v8::String::Utf8Value. ' - 'Use node::Utf8Value instead.') - if re.search(r'\bString::Value\b', line): - error(filename, linenum, 'runtime/v8_string_value', 5, - 'Do not use v8::String::Value. ' - 'Use node::TwoByteValue instead.') - - -def ProcessLine( - filename, - file_extension, - clean_lines, - line, - include_state, - function_state, - nesting_state, - error, - extra_check_functions=None, - cppvar=None, -): - """Processes a single line in the file. - - Args: - filename: Filename of the file that is being processed. - file_extension: The extension (dot not included) of the file. - clean_lines: An array of strings, each representing a line of the file, - with comments stripped. - line: Number of line being processed. - include_state: An _IncludeState instance in which the headers are inserted. - function_state: A _FunctionState instance which counts function lines, etc. - nesting_state: A NestingState instance which maintains information about - the current stack of nested blocks being parsed. - error: A callable to which errors are reported, which takes 4 arguments: - filename, line number, error level, and message - extra_check_functions: An array of additional check functions that will be - run on each source line. Each function takes 4 - arguments: filename, clean_lines, line, error - cppvar: The header guard variable returned by GetHeaderGuardCPPVar. - """ - raw_lines = clean_lines.raw_lines - ParseNolintSuppressions(filename, raw_lines[line], line, error) - nesting_state.Update(filename, clean_lines, line, error) - CheckForNamespaceIndentation(filename, nesting_state, clean_lines, line, error) - if nesting_state.InAsmBlock(): - return - CheckForFunctionLengths(filename, clean_lines, line, function_state, error) - CheckForMultilineCommentsAndStrings(filename, clean_lines, line, error) - CheckStyle(filename, clean_lines, line, file_extension, nesting_state, error, cppvar) - CheckLanguage(filename, clean_lines, line, file_extension, include_state, nesting_state, error) - CheckForNonConstReference(filename, clean_lines, line, nesting_state, error) - CheckForNonStandardConstructs(filename, clean_lines, line, nesting_state, error) - CheckVlogArguments(filename, clean_lines, line, error) - CheckPosixThreading(filename, clean_lines, line, error) - CheckInvalidIncrement(filename, clean_lines, line, error) - CheckMakePairUsesDeduction(filename, clean_lines, line, error) - CheckRedundantVirtual(filename, clean_lines, line, error) - CheckRedundantOverrideOrFinal(filename, clean_lines, line, error) - if extra_check_functions: - for check_fn in extra_check_functions: - check_fn(filename, clean_lines, line, error) - - -def FlagCxxHeaders(filename, clean_lines, linenum, error): - """Flag C++ headers that the styleguide restricts. - - Args: - filename: The name of the current file. - clean_lines: A CleansedLines instance containing the file. - linenum: The number of the line to check. - error: The function to call with any errors found. - """ - line = clean_lines.elided[linenum] - - include = re.match(r'\s*#\s*include\s+[<"]([^<"]+)[">]', line) - - # Flag unapproved C++11 headers. - if include and include.group(1) in ( - "cfenv", - "fenv.h", - "ratio", - ): - error( - filename, - linenum, - "build/c++11", - 5, - f"<{include.group(1)}> is an unapproved C++11 header.", - ) - - # filesystem is the only unapproved C++17 header - if include and include.group(1) == "filesystem": - error(filename, linenum, "build/c++17", 5, " is an unapproved C++17 header.") - - -def ProcessFileData(filename, file_extension, lines, error, extra_check_functions=None): - """Performs lint checks and reports any errors to the given error function. - - Args: - filename: Filename of the file that is being processed. - file_extension: The extension (dot not included) of the file. - lines: An array of strings, each representing a line of the file, with the - last element being empty if the file is terminated with a newline. - error: A callable to which errors are reported, which takes 4 arguments: - filename, line number, error level, and message - extra_check_functions: An array of additional check functions that will be - run on each source line. Each function takes 4 - arguments: filename, clean_lines, line, error - """ - lines = ( - ["// marker so line numbers and indices both start at 1"] - + lines - + ["// marker so line numbers end in a known way"] - ) - - include_state = _IncludeState() - function_state = _FunctionState() - nesting_state = NestingState() - - ResetNolintSuppressions() - - CheckForCopyright(filename, lines, error) - ProcessGlobalSuppressions(filename, lines) - RemoveMultiLineComments(filename, lines, error) - clean_lines = CleansedLines(lines) - - cppvar = None - if IsHeaderExtension(file_extension): - cppvar = GetHeaderGuardCPPVariable(filename) - CheckForHeaderGuard(filename, clean_lines, error, cppvar) - - for line in range(clean_lines.NumLines()): - ProcessLine( - filename, - file_extension, - clean_lines, - line, - include_state, - function_state, - nesting_state, - error, - extra_check_functions, - cppvar, - ) - FlagCxxHeaders(filename, clean_lines, line, error) - if _error_suppressions.HasOpenBlock(): - error( - filename, - _error_suppressions.GetOpenBlockStart(), - "readability/nolint", - 5, - "NONLINT block never ended", - ) - - CheckForIncludeWhatYouUse(filename, clean_lines, include_state, error) - - # Check that the .cc file has included its header if it exists. - if _IsSourceExtension(file_extension): - CheckHeaderFileIncluded(filename, include_state, error) - - # We check here rather than inside ProcessLine so that we see raw - # lines rather than "cleaned" lines. - CheckForBadCharacters(filename, lines, error) - - CheckForNewlineAtEOF(filename, lines, error) - - CheckInlineHeader(filename, include_state, error) - - CheckLocalVectorUsage(filename, lines, error) - - CheckStringValueUsage(filename, lines, error) - - -def ProcessConfigOverrides(filename): - """Loads the configuration files and processes the config overrides. - - Args: - filename: The name of the file being processed by the linter. - - Returns: - False if the current |filename| should not be processed further. - """ - - abs_filename = os.path.abspath(filename) - cfg_filters = [] - keep_looking = True - while keep_looking: - abs_path, base_name = os.path.split(abs_filename) - if not base_name: - break # Reached the root directory. - - cfg_file = os.path.join(abs_path, _config_filename) - abs_filename = abs_path - if not os.path.isfile(cfg_file): - continue - - try: - with open(cfg_file, encoding="utf8", errors="replace") as file_handle: - for line in file_handle: - line, _, _ = line.partition("#") # Remove comments. - if not line.strip(): - continue - - name, _, val = line.partition("=") - name = name.strip() - val = val.strip() - if name == "set noparent": - keep_looking = False - elif name == "filter": - cfg_filters.append(val) - elif name == "exclude_files": - # When matching exclude_files pattern, use the base_name of - # the current file name or the directory name we are processing. - # For example, if we are checking for lint errors in /foo/bar/baz.cc - # and we found the .cfg file at /foo/CPPLINT.cfg, then the config - # file's "exclude_files" filter is meant to be checked against "bar" - # and not "baz" nor "bar/baz.cc". - if base_name: - pattern = re.compile(val) - if pattern.match(base_name): - if _cpplint_state.quiet: - # Suppress "Ignoring file" warning when using --quiet. - return False - _cpplint_state.PrintInfo( - f'Ignoring "{filename}": file excluded by "{cfg_file}". ' - 'File path component "%s" matches ' - 'pattern "%s"\n' % (base_name, val) - ) - return False - elif name == "linelength": - global _line_length - try: - _line_length = int(val) - except ValueError: - _cpplint_state.PrintError("Line length must be numeric.") - elif name == "extensions": - ProcessExtensionsOption(val) - elif name == "root": - global _root - # root directories are specified relative to CPPLINT.cfg dir. - _root = os.path.join(os.path.dirname(cfg_file), val) - elif name == "headers": - ProcessHppHeadersOption(val) - elif name == "third_party_headers": - ProcessThirdPartyHeadersOption(val) - elif name == "includeorder": - ProcessIncludeOrderOption(val) - else: - _cpplint_state.PrintError( - f"Invalid configuration option ({name}) in file {cfg_file}\n" - ) - - except OSError: - _cpplint_state.PrintError( - f"Skipping config file '{cfg_file}': Can't open for reading\n" - ) - keep_looking = False - - # Apply all the accumulated filters in reverse order (top-level directory - # config options having the least priority). - for cfg_filter in reversed(cfg_filters): - _AddFilters(cfg_filter) - - return True - - -def ProcessFile(filename, vlevel, extra_check_functions=None): - """Does google-lint on a single file. - - Args: - filename: The name of the file to parse. - - vlevel: The level of errors to report. Every error of confidence - >= verbose_level will be reported. 0 is a good default. - - extra_check_functions: An array of additional check functions that will be - run on each source line. Each function takes 4 - arguments: filename, clean_lines, line, error - """ - - _SetVerboseLevel(vlevel) - _BackupFilters() - old_errors = _cpplint_state.error_count - - if not ProcessConfigOverrides(filename): - _RestoreFilters() - return - - try: - # Support the UNIX convention of using "-" for stdin. - if filename == "-": - lines = sys.stdin.read().split("\n") - else: - with open(filename, encoding="utf8", errors="replace", newline=None) as target_file: - lines = target_file.read().split("\n") - - except OSError: - # TODO(aaronliu0130): Maybe make this have an exit code of 2 after all is done - _cpplint_state.PrintError(f"Skipping input '{filename}': Can't open for reading\n") - _RestoreFilters() - return - - # Note, if no dot is found, this will give the entire filename as the ext. - file_extension = filename[filename.rfind(".") + 1 :] - - # When reading from stdin, the extension is unknown, so no cpplint tests - # should rely on the extension. - if filename != "-" and file_extension not in GetAllExtensions(): - _cpplint_state.PrintError( - f"Ignoring {filename}; not a valid file name ({(', '.join(GetAllExtensions()))})\n" - ) - else: - ProcessFileData(filename, file_extension, lines, Error, extra_check_functions) - - # Suppress printing anything if --quiet was passed unless the error - # count has increased after processing this file. - if not _cpplint_state.quiet or old_errors != _cpplint_state.error_count: - _cpplint_state.PrintInfo(f"Done processing {filename}\n") - _RestoreFilters() - - -def PrintUsage(message): - """Prints a brief usage string and exits, optionally with an error message. - - Args: - message: The optional error message. - """ - sys.stderr.write( - _USAGE - % ( - sorted(GetAllExtensions()), - ",".join(sorted(GetAllExtensions())), - sorted(GetHeaderExtensions()), - ",".join(sorted(GetHeaderExtensions())), - ) - ) - - if message: - sys.exit("\nFATAL ERROR: " + message) - else: - sys.exit(0) - - -def PrintVersion(): - sys.stdout.write("Cpplint fork (https://github.com/cpplint/cpplint)\n") - sys.stdout.write("cpplint " + __VERSION__ + "\n") - sys.stdout.write("Python " + sys.version + "\n") - sys.exit(0) - - -def PrintCategories(): - """Prints a list of all the error-categories used by error messages. - - These are the categories used to filter messages via --filter. - """ - sys.stderr.write("".join(f" {cat}\n" for cat in _ERROR_CATEGORIES)) - sys.exit(0) - - -def ParseArguments(args): - """Parses the command line arguments. - - This may set the output format and verbosity level as side-effects. - - Args: - args: The command line arguments: - - Returns: - The list of filenames to lint. - """ - try: - (opts, filenames) = getopt.getopt( - args, - "", - [ - "help", - "output=", - "verbose=", - "v=", - "version", - "counting=", - "filter=", - "root=", - "repository=", - "linelength=", - "extensions=", - "exclude=", - "recursive", - "headers=", - "third_party_headers=", - "includeorder=", - "config=", - "quiet", - ], - ) - except getopt.GetoptError: - PrintUsage("Invalid arguments.") - - verbosity = _VerboseLevel() - output_format = _OutputFormat() - filters = "" - quiet = _Quiet() - counting_style = "" - recursive = False - - for opt, val in opts: - if opt == "--help": - PrintUsage(None) - if opt == "--version": - PrintVersion() - elif opt == "--output": - if val not in ("emacs", "vs7", "eclipse", "junit", "sed", "gsed"): - PrintUsage( - "The only allowed output formats are emacs, vs7, eclipse sed, gsed and junit." - ) - output_format = val - elif opt == "--quiet": - quiet = True - elif opt in {"--verbose", "--v"}: - verbosity = int(val) - elif opt == "--filter": - filters = val - if not filters: - PrintCategories() - elif opt == "--counting": - if val not in ("total", "toplevel", "detailed"): - PrintUsage("Valid counting options are total, toplevel, and detailed") - counting_style = val - elif opt == "--root": - global _root - _root = val - elif opt == "--repository": - global _repository - _repository = val - elif opt == "--linelength": - global _line_length - try: - _line_length = int(val) - except ValueError: - PrintUsage("Line length must be digits.") - elif opt == "--exclude": - global _excludes - if not _excludes: - _excludes = set() - _excludes.update(glob.glob(val)) - elif opt == "--extensions": - ProcessExtensionsOption(val) - elif opt == "--headers": - ProcessHppHeadersOption(val) - elif opt == "--third_party_headers": - ProcessThirdPartyHeadersOption(val) - elif opt == "--recursive": - recursive = True - elif opt == "--includeorder": - ProcessIncludeOrderOption(val) - elif opt == "--config": - global _config_filename - _config_filename = val - if os.path.basename(_config_filename) != _config_filename: - PrintUsage("Config file name must not include directory components.") - - if not filenames: - PrintUsage("No files were specified.") - - if recursive: - filenames = _ExpandDirectories(filenames) - - if _excludes: - filenames = _FilterExcludedFiles(filenames) - - _SetOutputFormat(output_format) - _SetQuiet(quiet) - _SetVerboseLevel(verbosity) - _SetFilters(filters) - _SetCountingStyle(counting_style) - - filenames.sort() - return filenames - - -def _ParseFilterSelector(parameter): - """Parses the given command line parameter for file- and line-specific - exclusions. - readability/casting:file.cpp - readability/casting:file.cpp:43 - - Args: - parameter: The parameter value of --filter - - Returns: - [category, filename, line]. - Category is always given. - Filename is either a filename or empty if all files are meant. - Line is either a line in filename or -1 if all lines are meant. - """ - colon_pos = parameter.find(":") - if colon_pos == -1: - return parameter, "", -1 - category = parameter[:colon_pos] - second_colon_pos = parameter.find(":", colon_pos + 1) - if second_colon_pos == -1: - return category, parameter[colon_pos + 1 :], -1 - return ( - category, - parameter[colon_pos + 1 : second_colon_pos], - int(parameter[second_colon_pos + 1 :]), - ) - - -def _ExpandDirectories(filenames): - """Searches a list of filenames and replaces directories in the list with - all files descending from those directories. Files with extensions not in - the valid extensions list are excluded. - - Args: - filenames: A list of files or directories - - Returns: - A list of all files that are members of filenames or descended from a - directory in filenames - """ - expanded = set() - for filename in filenames: - if not os.path.isdir(filename): - expanded.add(filename) - continue - - for root, _, files in os.walk(filename): - for loopfile in files: - fullname = os.path.join(root, loopfile) - fullname = fullname.removeprefix("." + os.path.sep) - expanded.add(fullname) - - return [ - filename for filename in expanded if os.path.splitext(filename)[1][1:] in GetAllExtensions() - ] - - -def _FilterExcludedFiles(fnames): - """Filters out files listed in the --exclude command line switch. File paths - in the switch are evaluated relative to the current working directory - """ - exclude_paths = [os.path.abspath(f) for f in _excludes] - # because globbing does not work recursively, exclude all subpath of all excluded entries - return [ - f - for f in fnames - if not any(e for e in exclude_paths if _IsParentOrSame(e, os.path.abspath(f))) - ] - - -def _IsParentOrSame(parent, child): - """Return true if child is subdirectory of parent. - Assumes both paths are absolute and don't contain symlinks. - """ - parent = os.path.normpath(parent) - child = os.path.normpath(child) - if parent == child: - return True - - prefix = os.path.commonprefix([parent, child]) - if prefix != parent: - return False - # Note: os.path.commonprefix operates on character basis, so - # take extra care of situations like '/foo/ba' and '/foo/bar/baz' - child_suffix = child[len(prefix) :] - child_suffix = child_suffix.lstrip(os.sep) - return child == os.path.join(prefix, child_suffix) - - -def main(): - filenames = ParseArguments(sys.argv[1:]) - backup_err = sys.stderr - try: - # Change stderr to write with replacement characters so we don't die - # if we try to print something containing non-ASCII characters. - sys.stderr = codecs.StreamReader(sys.stderr, "replace") - - _cpplint_state.ResetErrorCounts() - for filename in filenames: - ProcessFile(filename, _cpplint_state.verbose_level) - # If --quiet is passed, suppress printing error count unless there are errors. - if not _cpplint_state.quiet or _cpplint_state.error_count > 0: - _cpplint_state.PrintErrorCounts() - - if _cpplint_state.output_format == "junit": - sys.stderr.write(_cpplint_state.FormatJUnitXML()) - - finally: - sys.stderr = backup_err - - sys.exit(_cpplint_state.error_count > 0) - - -if __name__ == "__main__": - main() diff --git a/tools/create_android_makefiles b/tools/create_android_makefiles deleted file mode 100755 index abf2ecf083c..00000000000 --- a/tools/create_android_makefiles +++ /dev/null @@ -1,46 +0,0 @@ -#!/bin/bash -# Run this script ONLY inside an Android build system -# and after you ran lunch command! - -if [ -z "$ANDROID_BUILD_TOP" ]; then - echo "Run lunch before running this script!" - exit 1 -fi - -if [ -z "$1" ]; then - ARCH="arm" -else - ARCH="$1" -fi - -if [ $ARCH = "x86" ]; then - TARGET_ARCH="ia32" -else - TARGET_ARCH="$ARCH" -fi - -cd $(dirname $0)/.. - -./configure \ - --without-snapshot \ - --openssl-no-asm \ - --dest-cpu=$TARGET_ARCH \ - --dest-os=android - -export GYP_GENERATORS="android" -export GYP_GENERATOR_FLAGS="limit_to_target_all=true" -GYP_DEFINES="target_arch=$TARGET_ARCH" -GYP_DEFINES+=" v8_target_arch=$TARGET_ARCH" -GYP_DEFINES+=" android_target_arch=$ARCH" -GYP_DEFINES+=" host_os=linux OS=android" -export GYP_DEFINES - -./deps/npm/node_modules/node-gyp/gyp/gyp \ - -Icommon.gypi \ - -Iconfig.gypi \ - --depth=. \ - -Dcomponent=static_library \ - -Dlibrary=static_library \ - node.gyp - -echo -e "LOCAL_PATH := \$(call my-dir)\n\ninclude \$(LOCAL_PATH)/GypAndroid.mk" > Android.mk diff --git a/tools/create_expfile.sh b/tools/create_expfile.sh deleted file mode 100755 index 977f509e2ec..00000000000 --- a/tools/create_expfile.sh +++ /dev/null @@ -1,87 +0,0 @@ -#!/bin/sh -# Writes out all of the exported symbols to a file. -# This is needed on AIX as symbols are not exported -# by an executable by default and need to be listed -# specifically for export so that they can be used -# by native add-ons. -# -# The raw symbol data is obtained by using dump -tov on -# the .a files which make up the node executable. -# -# dump -tov flags: -# -t: Display symbol table entries -# -o: Display object file headers -# -v: Display visibility information (HIDDEN/EXPORTED/PROTECTED) -# -X 32_64: Process both 32-bit and 64-bit symbols -# -# This approach is similar to CMake's ExportImportList module for AIX: -# https://github.com/Kitware/CMake/blob/45f4742cbfe6c25c7c801e3806c8af04a2c4b09b/Modules/Platform/AIX/ExportImportList#L67-L80 -# -# We filter for symbols in .text, .data, .tdata, and .bss sections -# with extern or weak linkage, excluding: -# - Symbols starting with dot (internal/local symbols) -# - __sinit/__sterm (static initialization/termination) -# - __[0-9]+__ (compiler-generated symbols) -# - HIDDEN visibility symbols (to avoid linker error 0711-407) -# -# The final sort allows removal of any duplicates. -# -# Symbols for the gtest libraries are excluded as -# they are not linked into the node executable. -# -echo "Searching $1 to write out expfile to $2" - -# This special sequence must be at the start of the exp file. -echo "#!." > "$2.tmp" - -# Pull the symbols from the .a files. -# Use dump -tov to get visibility information and exclude HIDDEN symbols. -# This prevents AIX linker error 0711-407 when addons try to import symbols -# with visibility attributes. -# -# IMPORTANT: AIX dump -tov output has a visibility column that contains either -# a visibility keyword (HIDDEN/EXPORTED/PROTECTED) or blank spaces when no -# visibility attribute is set. Since AWK splits fields on whitespace, this -# results in different field counts: -# -# With visibility keyword (8 fields after AWK splits): -# [137] m 0x00003290 .text 1 weak HIDDEN ._ZNKSt3__1... -# $1 $2 $3 $4 $5 $6 $7 $8 -# | | └─ Symbol name -# | └─ Visibility (HIDDEN/EXPORTED/PROTECTED) -# └─ Linkage (weak/extern) -# -# Without visibility keyword (7 fields after AWK splits, spaces collapsed): -# [77] m 0x00000000 .text 1 weak ._ZN8simdjson... -# $1 $2 $3 $4 $5 $6 $7 -# | └─ Symbol name -# └─ Linkage (weak/extern) -# -# The awk script handles both cases by using an associative array V[] -# to map field values to their export suffixes. For fields that don't match -# any key in V[], the lookup returns an empty string, which is perfect for -# handling the variable field positions caused by the blank visibility column. -# -find "$1" -name "*.a" | grep -v gtest | while read -r f; do - dump -tov -X 32_64 "$f" 2>/dev/null | \ - awk ' - BEGIN { - V["EXPORTED"]=" export" - V["PROTECTED"]=" protected" - V["HIDDEN"]=" hidden" - V["weak"]=" weak" - } - /^\[[0-9]+\]\tm +[^ ]+ +\.(text|data|tdata|bss) +[^ ]+ +(extern|weak)( +(EXPORTED|PROTECTED|HIDDEN))?/ { - # Exclude symbols starting with dot, __sinit, __sterm, __[0-9]+__ - # Also exclude HIDDEN symbols to avoid visibility attribute issues - if (!match($NF,/^(\.|__sinit|__sterm|__[0-9]+__)/)) { - # Skip if HIDDEN visibility (can be at $(NF-1) or $(NF-2)) - if ($(NF-1) != "HIDDEN" && $(NF-2) != "HIDDEN") { - print $NF V[$(NF-1)] V[$(NF-2)] - } - } - } - ' -done | sort -u >> "$2.tmp" - -mv -f "$2.tmp" "$2" diff --git a/tools/dep_updaters/README.md b/tools/dep_updaters/README.md deleted file mode 100644 index ba7a47d8a50..00000000000 --- a/tools/dep_updaters/README.md +++ /dev/null @@ -1,98 +0,0 @@ -# Dependency update scripts - -This folder contains scripts used to automatically update a Node.js dependency. -These scripts are usually run by CI (see `.github/workflows/tools.yml`) in order -to download a new dependency version, and replace the old version with it. - -Since these scripts only update to the upstream code, changes might be needed in -this repository in order to successfully update (e.g: changing API calls to -conform to upstream changes, updating GYP build files, etc.) - -## libuv - -The `update-libuv.sh` script takes the target version to update as its only -argument, downloads it from the [GitHub repo](https://github.com/libuv/libuv) -and uses it to replace the contents of `deps/uv/`. The contents are replaced -entirely except for the `*.gyp` and `*.gypi` build files, which are part of the -Node.js build definitions and are not present in the upstream repo. - -For example, in order to update to version `1.44.2`, the following command can -be run: - -```bash -./tools/dep_updaters/update-libuv.sh 1.44.2 -``` - -Once the script has run (either manually, or by CI in which case a PR will have -been created with the changes), do the following: - -1. Check the [changelog](https://github.com/libuv/libuv/blob/v1.x/ChangeLog) for - things that might require changes in Node.js. -2. If necessary, update `common.gypi` and `uv.gyp` with build-related changes. -3. Check that Node.js compiles without errors and the tests pass. -4. Create a commit for the update and in the commit message include the - important/relevant items from the changelog (see [`c61870c`][] for an - example). - -[`c61870c`]: https://github.com/nodejs/node/commit/c61870c376e2f5b0dbaa939972c46745e21cdbdd - -## OpenSSL - -The `update-openssl.sh` script automates the steps described in -[`maintaining-openssl.md`][]. The main difference is that the script downloads -the release tarball from GitHub, instead of cloning the repo and using that as -the source code. This is useful since the release tarball does not include -development-specific files and directories (e.g the `.github` folder). - -The script has to be run in two steps. The first one (using the `download` -sub-command) replaces the OpenSSL source code with the new version. The second -one (using the `regenerate` sub-command) regenerates the platform-specific -files. This makes it easier to create two separate git commits, making the git -history more descriptive. - -For example, in order to update to version `3.0.7+quic1`, the following commands -should be run: - -```bash -./tools/dep_updaters/update-openssl.sh download 3.0.7+quic1 -git add -A deps/openssl/openssl -git commit -m "deps: upgrade openssl sources to quictls/openssl-3.0.7+quic1" - -./tools/dep_updaters/update-openssl.sh regenerate 3.0.7+quic1 -git add -A deps/openssl/config/archs deps/openssl/openssl -git commit -m "deps: update archs files for openssl" -``` - -Once the script has run (either manually, or by CI in which case a PR will have -been created with the changes), do the following: - -1. Check the `CHANGES.md` file in the [repo](https://github.com/quictls/openssl) - for things that might require changes in Node.js. -2. Check the diffs to ensure the changes are right. Even if there are no changes - in the source, `buildinf.h` files will be updated because they have timestamp - data in them. -3. Check that Node.js compiles without errors and the tests pass. -4. Create a commit for the update and in the commit message include the - important/relevant items from the changelog. - -## postject - -The `update-postject.sh` script downloads postject from the [npm package](http://npmjs.com/package/postject) -and uses it to replace the contents of `test/fixtures/postject-copy`. - -In order to update, the following command can be run: - -```bash -./tools/dep_updaters/update-postject.sh -``` - -Once the script has run (either manually, or by CI in which case a PR will have -been created with the changes), do the following: - -1. Check the [changelog](https://github.com/nodejs/postject/releases/tag/v1.0.0-alpha.4) - for things that might require changes in Node.js. -2. Check that Node.js compiles without errors and the tests pass. -3. Create a commit for the update and in the commit message include the - important/relevant items from the changelog. - -[`maintaining-openssl.md`]: https://github.com/nodejs/node/blob/main/doc/contributing/maintaining/maintaining-openssl.md diff --git a/tools/dep_updaters/c-ares.kbx b/tools/dep_updaters/c-ares.kbx deleted file mode 100644 index 720f1df3691..00000000000 Binary files a/tools/dep_updaters/c-ares.kbx and /dev/null differ diff --git a/tools/dep_updaters/nghttp.kbx b/tools/dep_updaters/nghttp.kbx deleted file mode 100644 index 60ad5134ecc..00000000000 Binary files a/tools/dep_updaters/nghttp.kbx and /dev/null differ diff --git a/tools/dep_updaters/update-acorn-walk.sh b/tools/dep_updaters/update-acorn-walk.sh deleted file mode 100755 index bdad8a9b0c3..00000000000 --- a/tools/dep_updaters/update-acorn-walk.sh +++ /dev/null @@ -1,58 +0,0 @@ -#!/bin/sh - -# Shell script to update acorn-walk in the source tree to the latest release. - -# This script must be in the tools directory when it runs because it uses the -# script source file path to determine directories to work in. - -set -ex - -BASE_DIR=$(cd "$(dirname "$0")/../.." && pwd) -[ -z "$NODE" ] && NODE="$BASE_DIR/out/Release/node" -[ -x "$NODE" ] || NODE=$(command -v node) -NPM="$BASE_DIR/deps/npm/bin/npm-cli.js" -DEPS_DIR="$BASE_DIR/deps" - -# shellcheck disable=SC1091 -. "$BASE_DIR/tools/dep_updaters/utils.sh" - -NEW_VERSION=$("$NODE" "$NPM" view acorn-walk dist-tags.latest) -CURRENT_VERSION=$("$NODE" -p "require('./deps/acorn/acorn-walk/package.json').version") - -# This function exit with 0 if new version and current version are the same -compare_dependency_version "acorn-walk" "$NEW_VERSION" "$CURRENT_VERSION" - -cd "$( dirname "$0" )/../.." || exit - -echo "Making temporary workspace..." - -WORKSPACE=$(mktemp -d 2> /dev/null || mktemp -d -t 'tmp') - -cleanup () { - EXIT_CODE=$? - [ -d "$WORKSPACE" ] && rm -rf "$WORKSPACE" - exit $EXIT_CODE -} - -trap cleanup INT TERM EXIT - -cd "$WORKSPACE" - -echo "Fetching acorn-walk source archive..." - -"$NODE" "$NPM" pack "acorn-walk@$NEW_VERSION" - -ACORN_WALK_TGZ="acorn-walk-$NEW_VERSION.tgz" - -log_and_verify_sha256sum "acorn-walk" "$ACORN_WALK_TGZ" - -rm -r "$DEPS_DIR/acorn/acorn-walk"/* - -tar -xf "$ACORN_WALK_TGZ" - -mv package/* "$DEPS_DIR/acorn/acorn-walk" - -# Update the version number on maintaining-dependencies.md -# and print the new version as the last line of the script as we need -# to add it to $GITHUB_ENV variable -finalize_version_update "acorn-walk" "$NEW_VERSION" diff --git a/tools/dep_updaters/update-acorn.sh b/tools/dep_updaters/update-acorn.sh deleted file mode 100755 index ac7ef351c7a..00000000000 --- a/tools/dep_updaters/update-acorn.sh +++ /dev/null @@ -1,68 +0,0 @@ -#!/bin/sh - -# Shell script to update acorn in the source tree to the latest release. - -# This script must be in the tools directory when it runs because it uses the -# script source file path to determine directories to work in. - -set -ex - -BASE_DIR=$(cd "$(dirname "$0")/../.." && pwd) -[ -z "$NODE" ] && NODE="$BASE_DIR/out/Release/node" -[ -x "$NODE" ] || NODE=$(command -v node) -NPM="$BASE_DIR/deps/npm/bin/npm-cli.js" -DEPS_DIR="$BASE_DIR/deps" - -# shellcheck disable=SC1091 -. "$BASE_DIR/tools/dep_updaters/utils.sh" - -NEW_VERSION=$("$NODE" "$NPM" view acorn dist-tags.latest) -CURRENT_VERSION=$("$NODE" -p "require('./deps/acorn/acorn/package.json').version") - -# This function exit with 0 if new version and current version are the same -compare_dependency_version "acorn" "$NEW_VERSION" "$CURRENT_VERSION" - -cd "$( dirname "$0" )/../.." || exit - -echo "Making temporary workspace..." - -WORKSPACE=$(mktemp -d 2> /dev/null || mktemp -d -t 'tmp') - -cleanup () { - EXIT_CODE=$? - [ -d "$WORKSPACE" ] && rm -rf "$WORKSPACE" - exit $EXIT_CODE -} - -trap cleanup INT TERM EXIT - -cd "$WORKSPACE" - -echo "Fetching acorn source archive..." - -"$NODE" "$NPM" pack "acorn@$NEW_VERSION" - -ACORN_TGZ="acorn-$NEW_VERSION.tgz" - -log_and_verify_sha256sum "acorn" "$ACORN_TGZ" - -rm -r "$DEPS_DIR/acorn/acorn"/* - -tar -xf "$ACORN_TGZ" - -mv package/* "$DEPS_DIR/acorn/acorn" - -# update version information in src/acorn_version.h -cat > "$BASE_DIR/src/acorn_version.h" < /dev/null || mktemp -d -t 'tmp') - -cleanup () { - EXIT_CODE=$? - [ -d "$WORKSPACE" ] && rm -rf "$WORKSPACE" - exit $EXIT_CODE -} - -trap cleanup INT TERM EXIT - -ADA_REF="v$NEW_VERSION" -ADA_ZIP="ada-$ADA_REF.zip" -ADA_LICENSE="LICENSE-MIT" - -cd "$WORKSPACE" - -echo "Fetching ada source archive..." -curl -sL -o "$ADA_ZIP" "https://github.com/ada-url/ada/releases/download/$ADA_REF/singleheader.zip" -log_and_verify_sha256sum "ada" "$ADA_ZIP" -unzip "$ADA_ZIP" -rm "$ADA_ZIP" - -curl -sL -o "$ADA_LICENSE" "https://raw.githubusercontent.com/ada-url/ada/HEAD/LICENSE-MIT" - -echo "Replacing existing ada (except GYP and GN build files)" -mv "$DEPS_DIR/ada/"*.gyp "$DEPS_DIR/ada/"*.gn "$DEPS_DIR/ada/"*.gni "$DEPS_DIR/ada/README.md" "$WORKSPACE/" -rm -rf "$DEPS_DIR/ada" -mv "$WORKSPACE" "$DEPS_DIR/ada" - -# Update the version number on maintaining-dependencies.md -# and print the new version as the last line of the script as we need -# to add it to $GITHUB_ENV variable -finalize_version_update "ada" "$NEW_VERSION" diff --git a/tools/dep_updaters/update-amaro.sh b/tools/dep_updaters/update-amaro.sh deleted file mode 100755 index 0169e9304bc..00000000000 --- a/tools/dep_updaters/update-amaro.sh +++ /dev/null @@ -1,83 +0,0 @@ -#!/bin/sh - -# Shell script to update amaro in the source tree to the latest release. - -# This script must be in the tools directory when it runs because it uses the -# script source file path to determine directories to work in. - -set -ex - -BASE_DIR=$(cd "$(dirname "$0")/../.." && pwd) -[ -z "$NODE" ] && NODE="$BASE_DIR/out/Release/node" -[ -x "$NODE" ] || NODE=$(command -v node) -DEPS_DIR="$BASE_DIR/deps" -NPM="$DEPS_DIR/npm/bin/npm-cli.js" - -# shellcheck disable=SC1091 -. "$BASE_DIR/tools/dep_updaters/utils.sh" - -NEW_VERSION=$("$NODE" "$NPM" view amaro dist-tags.latest) - -CURRENT_VERSION=$("$NODE" -p "require('./deps/amaro/package.json').version") - -# This function exit with 0 if new version and current version are the same -compare_dependency_version "amaro" "$NEW_VERSION" "$CURRENT_VERSION" - -cd "$( dirname "$0" )/../.." || exit - -echo "Making temporary workspace..." - -WORKSPACE=$(mktemp -d 2> /dev/null || mktemp -d -t 'tmp') - -cleanup () { - EXIT_CODE=$? - [ -d "$WORKSPACE" ] && rm -rf "$WORKSPACE" - exit $EXIT_CODE -} - -trap cleanup INT TERM EXIT - -cd "$WORKSPACE" - -echo "Fetching amaro source archive..." - -"$NODE" "$NPM" pack "amaro@$NEW_VERSION" - -amaro_TGZ="amaro-$NEW_VERSION.tgz" - -log_and_verify_sha256sum "amaro" "$amaro_TGZ" - -cp ./* "$DEPS_DIR/amaro/LICENSE" - -rm -r "$DEPS_DIR/amaro"/* - -tar -xf "$amaro_TGZ" - -cd package - -rm -rf node_modules - -mv ./* "$DEPS_DIR/amaro" - -# update version information in src/undici_version.h -cat > "$ROOT/src/amaro_version.h" < /dev/null || mktemp -d -t 'tmp') - -cleanup () { - EXIT_CODE=$? - [ -d "$WORKSPACE" ] && rm -rf "$WORKSPACE" - exit $EXIT_CODE -} - -trap cleanup INT TERM EXIT - -cd "$WORKSPACE" - -BROTLI_TARBALL="brotli-v$NEW_VERSION.tar.gz" - -echo "Fetching brotli source archive" -curl -sL -o "$BROTLI_TARBALL" "https://github.com/google/brotli/archive/v$NEW_VERSION.tar.gz" -log_and_verify_sha256sum "brotli" "$BROTLI_TARBALL" -gzip -dc "$BROTLI_TARBALL" | tar xf - -rm "$BROTLI_TARBALL" -mv "brotli-$NEW_VERSION" "brotli" - -echo "Copying existing gyp file" -cp "$DEPS_DIR/brotli/brotli.gyp" "$WORKSPACE/brotli" - -echo "Copying existing GN files" -cp "$DEPS_DIR/brotli/"*.gn "$DEPS_DIR/brotli/"*.gni "$WORKSPACE/brotli" - -echo "Deleting existing brotli" -rm -rf "$DEPS_DIR/brotli" -mkdir "$DEPS_DIR/brotli" - -echo "Update c and LICENSE" -mv "$WORKSPACE/brotli/"*.gn "$WORKSPACE/brotli/"*.gni "$WORKSPACE/brotli/c" "$WORKSPACE/brotli/LICENSE" "$WORKSPACE/brotli/brotli.gyp" "$DEPS_DIR/brotli" - -# Update the version number on maintaining-dependencies.md -# and print the new version as the last line of the script as we need -# to add it to $GITHUB_ENV variable -finalize_version_update "brotli" "$NEW_VERSION" diff --git a/tools/dep_updaters/update-c-ares.mjs b/tools/dep_updaters/update-c-ares.mjs deleted file mode 100644 index bd99dfd3412..00000000000 --- a/tools/dep_updaters/update-c-ares.mjs +++ /dev/null @@ -1,39 +0,0 @@ -// Synchronize the sources for our c-ares gyp file from c-ares' Makefiles. -import { readFileSync, writeFileSync } from 'node:fs'; -import { join } from 'node:path'; -import { fileURLToPath } from 'node:url'; - -const srcroot = fileURLToPath(new URL('../../', import.meta.url)); -const options = { encoding: 'utf8' }; - -// Extract list of sources from the gyp file. -const gypFile = join(srcroot, 'deps', 'cares', 'cares.gyp'); -const contents = readFileSync(gypFile, options); -const sourcesRE = /^\s+'cares_sources_common':\s+\[\s*\n(?[\s\S]*?)\s+\],$/gm; -const sourcesCommon = sourcesRE.exec(contents); - -// Extract the list of sources from c-ares' Makefile.inc. -const makefile = join(srcroot, 'deps', 'cares', 'src', 'lib', 'Makefile.inc'); -const libSources = readFileSync(makefile, options).split('\n') - // Extract filenames (excludes comments and variable assignment). - .map((line) => line.match(/^(?:.*= |\s*)?([^#\s]*)\s*\\?/)?.[1]) - // Filter out empty lines. - .filter((line) => line !== '') - // Prefix with directory and format as list entry. - .map((line) => ` 'src/lib/${line}',`); - -// Extract include files. -const includeMakefile = join(srcroot, 'deps', 'cares', 'include', 'Makefile.am'); -const includeSources = readFileSync(includeMakefile, options) - .match(/include_HEADERS\s*=\s*(.*)/)[1] - .split(/\s/) - .map((header) => ` 'include/${header}',`); - -// Combine the lists. Alphabetically sort to minimize diffs. -const fileList = includeSources.concat(libSources).sort(); - -// Replace the list of sources. -const newContents = contents.replace(sourcesCommon.groups.files, fileList.join('\n')); -if (newContents !== contents) { - writeFileSync(gypFile, newContents, options); -} diff --git a/tools/dep_updaters/update-c-ares.sh b/tools/dep_updaters/update-c-ares.sh deleted file mode 100755 index ca77ee52183..00000000000 --- a/tools/dep_updaters/update-c-ares.sh +++ /dev/null @@ -1,81 +0,0 @@ -#!/bin/sh -set -ex -# Shell script to update c-ares in the source tree to a specific version - -BASE_DIR=$(cd "$(dirname "$0")/../.." && pwd) -DEPS_DIR="$BASE_DIR/deps" - -[ -z "$NODE" ] && NODE="$BASE_DIR/out/Release/node" -[ -x "$NODE" ] || NODE=$(command -v node) - -# shellcheck disable=SC1091 -. "$BASE_DIR/tools/dep_updaters/utils.sh" - -NEW_VERSION_METADATA="$("$NODE" --input-type=module <<'EOF' -const res = await fetch('https://api.github.com/repos/c-ares/c-ares/releases/latest', - process.env.GITHUB_TOKEN && { - headers: { - "Authorization": `Bearer ${process.env.GITHUB_TOKEN}` - }, - }); -if (!res.ok) throw new Error(`FetchError: ${res.status} ${res.statusText}`, { cause: res }); -const { tag_name, assets } = await res.json(); -const { browser_download_url, name } = assets.find(({ name }) => name.endsWith('.tar.gz')); -if(!browser_download_url || !name) throw new Error('No tarball found'); -console.log(`${tag_name.replace(/^v/, '')} ${browser_download_url}`); -EOF -)" - -IFS=' ' read -r NEW_VERSION NEW_VERSION_URL < /dev/null || mktemp -d -t 'tmp') -ARES_TARBALL="$WORKSPACE/c-ares.tgz" - -cleanup () { - EXIT_CODE=$? - [ -d "$WORKSPACE" ] && rm -rf "$WORKSPACE" - exit $EXIT_CODE -} - -trap cleanup INT TERM EXIT - -echo "Fetching c-ares source archive" -curl -sL -o "$ARES_TARBALL" "$NEW_VERSION_URL" - -echo "Verifying PGP signature" -curl -sL -o "$ARES_TARBALL.asc" "$NEW_VERSION_URL.asc" -gpgv --keyring "$BASE_DIR/tools/dep_updaters/c-ares.kbx" "${ARES_TARBALL}.asc" "${ARES_TARBALL}" - -log_and_verify_sha256sum "c-ares" "$ARES_TARBALL" -tar -C "$WORKSPACE" -xzf "$ARES_TARBALL" - -ARES_FOLDER=$(find "$WORKSPACE" -mindepth 1 -maxdepth 1 -type d -print -quit) - -echo "Removing tests" -rm -rf "$ARES_FOLDER/test" - -echo "Copying existing .gitignore, config, gyp and gn files" -cp -R "$DEPS_DIR/cares/config" "$ARES_FOLDER" -cp "$DEPS_DIR/cares/.gitignore" "$ARES_FOLDER" -cp "$DEPS_DIR/cares/cares.gyp" "$ARES_FOLDER" -cp "$DEPS_DIR/cares/"*.gn "$DEPS_DIR/cares/"*.gni "$ARES_FOLDER" - -echo "Replacing existing c-ares" -replace_dir "$DEPS_DIR/cares" "$ARES_FOLDER" - -echo "Updating cares.gyp" -"$NODE" "$ROOT/tools/dep_updaters/update-c-ares.mjs" - -# Update the version number on maintaining-dependencies.md -# and print the new version as the last line of the script as we need -# to add it to $GITHUB_ENV variable -finalize_version_update "c-ares" "$NEW_VERSION" diff --git a/tools/dep_updaters/update-googletest.sh b/tools/dep_updaters/update-googletest.sh deleted file mode 100755 index 42fa09c1b63..00000000000 --- a/tools/dep_updaters/update-googletest.sh +++ /dev/null @@ -1,89 +0,0 @@ -#!/bin/sh -set -e -# Shell script to update GoogleTest in the source tree to the most recent version. -# GoogleTest follows the Abseil Live at Head philosophy and rarely creates tags -# or GitHub releases, so instead, we use the latest commit on the main branch. - -BASE_DIR=$(cd "$(dirname "$0")/../.." && pwd) -DEPS_DIR="$BASE_DIR/deps" - -NEW_UPSTREAM_SHA1=$(git ls-remote "https://github.com/google/googletest.git" HEAD | awk '{print $1}') -NEW_VERSION=$(echo "$NEW_UPSTREAM_SHA1" | head -c 7) - -# shellcheck disable=SC1091 -. "$BASE_DIR/tools/dep_updaters/utils.sh" - -echo "Comparing $NEW_VERSION with current revision" - -git remote add googletest-upstream https://github.com/google/googletest.git -git fetch googletest-upstream "$NEW_UPSTREAM_SHA1" -git remote remove googletest-upstream - -DIFF_TREE=$( - git diff HEAD:deps/googletest/LICENSE "$NEW_UPSTREAM_SHA1:LICENSE" - git diff-tree HEAD:deps/googletest/include "$NEW_UPSTREAM_SHA1:googletest/include" - git diff-tree HEAD:deps/googletest/src "$NEW_UPSTREAM_SHA1:googletest/src" -) - -if [ -z "$DIFF_TREE" ]; then - echo "Skipped because googletest is on the latest version." - exit 0 -fi - -# This is a rather arbitrary restriction. This script is assumed to run on -# Sunday, shortly after midnight UTC. This check thus prevents pulling in the -# most recent commits if any changes were made on Friday or Saturday (UTC). -# Because of Google's own "Live at Head" philosophy, new bugs that are likely to -# affect Node.js tend to be fixed quickly, so we don't want to pull in a commit -# that was just pushed, and instead rather wait for the next week's update. If -# no commits have been pushed in the last two days, we assume that the most -# recent commit is stable enough to be pulled in. -LAST_CHANGE_DATE=$(git log -1 --format=%ct "$NEW_UPSTREAM_SHA1" -- LICENSE googletest/include googletest/src) -TWO_DAYS_AGO=$(date -d 'now - 2 days' '+%s') -if [ "$LAST_CHANGE_DATE" -gt "$TWO_DAYS_AGO" ]; then - echo "Skipped because the latest version is too recent." - exit 0 -fi - -echo "Creating temporary work tree" - -WORKSPACE=$(mktemp -d 2> /dev/null || mktemp -d -t 'tmp') -WORKTREE="$WORKSPACE/googletest" - -cleanup () { - EXIT_CODE=$? - [ -d "$WORKTREE" ] && git worktree remove -f "$WORKTREE" - [ -d "$WORKSPACE" ] && rm -rf "$WORKSPACE" - exit $EXIT_CODE -} - -trap cleanup INT TERM EXIT - -git worktree add "$WORKTREE" "$NEW_UPSTREAM_SHA1" - -echo "Copying LICENSE, include and src to deps/googletest" -for p in LICENSE googletest/include googletest/src ; do - rm -rf "$DEPS_DIR/googletest/$(basename "$p")" - cp -R "$WORKTREE/$p" "$DEPS_DIR/googletest/$(basename "$p")" -done - -echo "Updating googletest.gyp" - -NEW_GYP=$( - sed "/'googletest_sources': \[/q" "$DEPS_DIR/googletest/googletest.gyp" - for f in $( (cd deps/googletest/ && find include src -type f \( -iname '*.h' -o -iname '*.cc' \) ) | LANG=C LC_ALL=C sort --stable ); do - if [ "$(basename "$f")" != "gtest_main.cc" ] && - [ "$(basename "$f")" != "gtest-all.cc" ] && - [ "$(basename "$f")" != "gtest_prod.h" ] ; then - echo " '$f'," - fi - done - sed -ne '/\]/,$ p' "$DEPS_DIR/googletest/googletest.gyp" -) - -echo "$NEW_GYP" >"$DEPS_DIR/googletest/googletest.gyp" - -# Update the version number on maintaining-dependencies.md -# and print the new version as the last line of the script as we need -# to add it to $GITHUB_ENV variable -finalize_version_update "googletest" "$NEW_UPSTREAM_SHA1" diff --git a/tools/dep_updaters/update-gyp-next.sh b/tools/dep_updaters/update-gyp-next.sh deleted file mode 100755 index 731e91f3234..00000000000 --- a/tools/dep_updaters/update-gyp-next.sh +++ /dev/null @@ -1,68 +0,0 @@ -#!/bin/sh -set -e -# Shell script to update gyp-next in the source tree to specific version - -BASE_DIR=$(cd "$(dirname "$0")/../.." && pwd) - -[ -z "$NODE" ] && NODE="$BASE_DIR/out/Release/node" -[ -x "$NODE" ] || NODE=$(command -v node) - -# shellcheck disable=SC1091 -. "$BASE_DIR/tools/dep_updaters/utils.sh" - -NEW_VERSION="$("$NODE" --input-type=module <<'EOF' -const res = await fetch('https://api.github.com/repos/nodejs/gyp-next/releases/latest'); -if (!res.ok) throw new Error(`FetchError: ${res.status} ${res.statusText}`, { cause: res }); -const { tag_name } = await res.json(); -console.log(tag_name.replace('v', '')); -EOF -)" - -CURRENT_VERSION=$(grep -m 1 version ./tools/gyp/pyproject.toml | tr -s ' ' | tr -d '"' | tr -d "'" | cut -d' ' -f3) - -# This function exit with 0 if new version and current version are the same -compare_dependency_version "gyp-next" "$NEW_VERSION" "$CURRENT_VERSION" - -echo "Making temporary workspace" - -WORKSPACE=$(mktemp -d 2> /dev/null || mktemp -d -t 'tmp') - -cleanup () { - EXIT_CODE=$? - [ -d "$WORKSPACE" ] && rm -rf "$WORKSPACE" - exit $EXIT_CODE -} - -trap cleanup INT TERM EXIT - -GYP_NEXT_TARBALL="$NEW_VERSION.tar.gz" - -cd "$WORKSPACE" - -curl -sL -o "$GYP_NEXT_TARBALL" "https://github.com/nodejs/gyp-next/archive/refs/tags/v$NEW_VERSION.tar.gz" - -log_and_verify_sha256sum "gyp-next" "$GYP_NEXT_TARBALL" - -gzip -dc "$GYP_NEXT_TARBALL" | tar xf - - -rm "$GYP_NEXT_TARBALL" - -mv "gyp-next-$NEW_VERSION" gyp - -rm -rf "$WORKSPACE/gyp/.github" - -rm -rf "$BASE_DIR/tools/gyp" - -mv "$WORKSPACE/gyp" "$BASE_DIR/tools/" - -echo "All done!" -echo "" -echo "Please git add gyp-next and commit the new version:" -echo "" -echo "$ git add -A tools/gyp" -echo "$ git commit -m \"tools: update gyp-next to $NEW_VERSION\"" -echo "" - -# The last line of the script should always print the new version, -# as we need to add it to $GITHUB_ENV variable. -echo "NEW_VERSION=$NEW_VERSION" diff --git a/tools/dep_updaters/update-histogram.sh b/tools/dep_updaters/update-histogram.sh deleted file mode 100755 index 93f41a8c14a..00000000000 --- a/tools/dep_updaters/update-histogram.sh +++ /dev/null @@ -1,62 +0,0 @@ -#!/bin/sh -set -e -# Shell script to update histogram in the source tree to specific version - -BASE_DIR=$(cd "$(dirname "$0")/../.." && pwd) -DEPS_DIR="$BASE_DIR/deps" - -[ -z "$NODE" ] && NODE="$BASE_DIR/out/Release/node" -[ -x "$NODE" ] || NODE=$(command -v node) - -# shellcheck disable=SC1091 -. "$BASE_DIR/tools/dep_updaters/utils.sh" - -NEW_VERSION="$("$NODE" --input-type=module <<'EOF' -const res = await fetch('https://api.github.com/repos/HdrHistogram/HdrHistogram_c/releases/latest'); -if (!res.ok) throw new Error(`FetchError: ${res.status} ${res.statusText}`, { cause: res }); -const { tag_name } = await res.json(); -console.log(tag_name.replace('v', '')); -EOF -)" - -CURRENT_VERSION=$(grep "#define HDR_HISTOGRAM_VERSION" ./deps/histogram/include/hdr/hdr_histogram_version.h | sed -n "s/^.*VERSION \"\(.*\)\"/\1/p") - -# This function exit with 0 if new version and current version are the same -compare_dependency_version "histogram" "$NEW_VERSION" "$CURRENT_VERSION" - -echo "Making temporary workspace" - -WORKSPACE=$(mktemp -d 2> /dev/null || mktemp -d -t 'tmp') - -cleanup () { - EXIT_CODE=$? - [ -d "$WORKSPACE" ] && rm -rf "$WORKSPACE" - exit $EXIT_CODE -} - -trap cleanup INT TERM EXIT - -HISTOGRAM_TARBALL="$NEW_VERSION.tar.gz" - -cd "$WORKSPACE" - -echo "Fetching histogram source archive" - -curl -sL -o "$HISTOGRAM_TARBALL" "https://github.com/HdrHistogram/HdrHistogram_c/archive/refs/tags/$HISTOGRAM_TARBALL" - -log_and_verify_sha256sum "histogram" "$HISTOGRAM_TARBALL" - -gzip -dc "$HISTOGRAM_TARBALL" | tar xf - - -rm "$HISTOGRAM_TARBALL" - -mv "HdrHistogram_c-$NEW_VERSION" histogram - -cp "$WORKSPACE/histogram/include/hdr/hdr_histogram_version.h" "$WORKSPACE/histogram/include/hdr/hdr_histogram.h" "$DEPS_DIR/histogram/include/hdr" - -cp "$WORKSPACE/histogram/src/hdr_atomic.h" "$WORKSPACE/histogram/src/hdr_malloc.h" "$WORKSPACE/histogram/src/hdr_tests.h" "$WORKSPACE/histogram/src/hdr_histogram.c" "$DEPS_DIR/histogram/src" - -# Update the version number on maintaining-dependencies.md -# and print the new version as the last line of the script as we need -# to add it to $GITHUB_ENV variable -finalize_version_update "histogram" "$NEW_VERSION" diff --git a/tools/dep_updaters/update-icu.sh b/tools/dep_updaters/update-icu.sh deleted file mode 100755 index 8cd402d9326..00000000000 --- a/tools/dep_updaters/update-icu.sh +++ /dev/null @@ -1,67 +0,0 @@ -#!/bin/sh -set -e -# Shell script to update icu in the source tree to a specific version - -BASE_DIR=$(cd "$(dirname "$0")/../.." && pwd) -DEPS_DIR="$BASE_DIR/deps" -TOOLS_DIR="$BASE_DIR/tools" - -[ -z "$NODE" ] && NODE="$BASE_DIR/out/Release/node" -[ -x "$NODE" ] || NODE=$(command -v node) - -# shellcheck disable=SC1091 -. "$BASE_DIR/tools/dep_updaters/utils.sh" - -NEW_VERSION="$("$NODE" --input-type=module <<'EOF' -const res = await fetch('https://api.github.com/repos/unicode-org/icu/releases/latest', - process.env.GITHUB_TOKEN && { - headers: { - "Authorization": `Bearer ${process.env.GITHUB_TOKEN}` - }, - }); -if (!res.ok) throw new Error(`FetchError: ${res.status} ${res.statusText}`, { cause: res }); -const { tag_name } = await res.json(); -console.log(tag_name.replace('release-', '').replace('-','.')); -EOF -)" - -ICU_VERSION_H="$DEPS_DIR/icu-small/source/common/unicode/uvernum.h" - -CURRENT_VERSION="$(grep "#define U_ICU_VERSION " "$ICU_VERSION_H" | cut -d'"' -f2)" - -# This function exit with 0 if new version and current version are the same -compare_dependency_version "icu-small" "$NEW_VERSION" "$CURRENT_VERSION" - -NEW_VERSION_TGZ="icu4c-${NEW_VERSION}-sources.tgz" - -NEW_VERSION_TGZ_URL="https://github.com/unicode-org/icu/releases/download/release-${NEW_VERSION}/${NEW_VERSION_TGZ}" - -NEW_VERSION_MD5="https://github.com/unicode-org/icu/releases/download/release-${NEW_VERSION}/icu4c-${NEW_VERSION}-sources.md5" - -CHECKSUM=$(curl -sL "$NEW_VERSION_MD5" | grep "$NEW_VERSION_TGZ" | grep -v "\.asc$" | awk '{print $1}') - -GENERATED_CHECKSUM=$( curl -sL "$NEW_VERSION_TGZ_URL" | md5sum | cut -d ' ' -f1) - -echo "Comparing checksums: deposited '$CHECKSUM' with '$GENERATED_CHECKSUM'" - -if [ "$CHECKSUM" != "$GENERATED_CHECKSUM" ]; then - echo "Skipped because checksums do not match." - exit 0 -fi - -./configure --with-intl=full-icu --with-icu-source="$NEW_VERSION_TGZ_URL" - -"$TOOLS_DIR/icu/shrink-icu-src.py" - -rm -rf "$DEPS_DIR/icu" - -perl -i -pe "s|\"url\": .*|\"url\": \"$NEW_VERSION_TGZ_URL\",|" "$TOOLS_DIR/icu/current_ver.dep" - -perl -i -pe "s|\"md5\": .*|\"md5\": \"$CHECKSUM\"|" "$TOOLS_DIR/icu/current_ver.dep" - -rm -rf out "$DEPS_DIR/icu" "$DEPS_DIR/icu4c*" - -# Update the version number on maintaining-dependencies.md -# and print the new version as the last line of the script as we need -# to add it to $GITHUB_ENV variable -finalize_version_update "icu-small" "$NEW_VERSION" "tools/icu/current_ver.dep" diff --git a/tools/dep_updaters/update-inspector-protocol.sh b/tools/dep_updaters/update-inspector-protocol.sh deleted file mode 100755 index 8637647b23f..00000000000 --- a/tools/dep_updaters/update-inspector-protocol.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/sh -set -e -# Shell script to update inspector_protocol in the source tree to the version same with V8's. - -BASE_DIR=$(cd "$(dirname "$0")/../.." && pwd) -DEPS_DIR="$BASE_DIR/deps" - -# shellcheck disable=SC1091 -. "$BASE_DIR/tools/dep_updaters/utils.sh" - -echo "Making temporary workspace..." - -WORKSPACE=$(mktemp -d 2> /dev/null || mktemp -d -t 'tmp') - -cd "$WORKSPACE" - -git clone https://chromium.googlesource.com/deps/inspector_protocol.git - -INSPECTOR_PROTOCOL_DIR="$WORKSPACE/inspector_protocol" - -echo "Comparing latest upstream with current revision" - -set +e -python "$BASE_DIR/tools/inspector_protocol/roll.py" \ - --ip_src_upstream "$INSPECTOR_PROTOCOL_DIR" \ - --node_src_downstream "$BASE_DIR" -STATUS="$?" -set -e - -if [ "$STATUS" = "0" ]; then - echo "Skipped because inspector_protocol is on the latest version." - exit 0 -fi - -python "$BASE_DIR/tools/inspector_protocol/roll.py" \ - --ip_src_upstream "$INSPECTOR_PROTOCOL_DIR" \ - --node_src_downstream "$BASE_DIR" \ - --force - -NEW_VERSION=$(grep "Revision:" "$DEPS_DIR/inspector_protocol/README.node" | sed -n 's/^Revision: \([[:xdigit:]]\{36\}\).*$/\1/p') - -# Update the version number on maintaining-dependencies.md -# and print the new version as the last line of the script as we need -# to add it to $GITHUB_ENV variable -finalize_version_update "inspector_protocol" "$NEW_VERSION" diff --git a/tools/dep_updaters/update-libffi.sh b/tools/dep_updaters/update-libffi.sh deleted file mode 100755 index dc96c9c3244..00000000000 --- a/tools/dep_updaters/update-libffi.sh +++ /dev/null @@ -1,80 +0,0 @@ -#!/bin/sh -set -ex -# Shell script to update libffi in the source tree to a specific version - -BASE_DIR=$(cd "$(dirname "$0")/../.." && pwd) -DEPS_DIR="$BASE_DIR/deps" - -[ -z "$NODE" ] && NODE="$BASE_DIR/out/Release/node" -[ -x "$NODE" ] || NODE=$(command -v node) - -# shellcheck disable=SC1091 -. "$BASE_DIR/tools/dep_updaters/utils.sh" - -NEW_VERSION_METADATA="$($NODE --input-type=module <<'EOF' -const res = await fetch('https://api.github.com/repos/libffi/libffi/releases/latest', - process.env.GITHUB_TOKEN && { - headers: { - Authorization: `Bearer ${process.env.GITHUB_TOKEN}`, - }, - }); -if (!res.ok) throw new Error(`FetchError: ${res.status} ${res.statusText}`, { cause: res }); -const { tag_name, assets } = await res.json(); -const version = tag_name.replace(/^v/, ''); -const tarballName = `libffi-${version}.tar.gz`; -const tarball = assets.find(({ name }) => name === tarballName); -if (!tarball?.browser_download_url) throw new Error(`No release tarball found for ${tag_name}`); -console.log(`${version} ${tarball.browser_download_url} ${tarballName}`); -EOF -)" # " - -IFS=' ' read -r NEW_VERSION NEW_VERSION_URL LIBFFI_TARBALL < /dev/null || mktemp -d -t 'tmp') - -cleanup () { - EXIT_CODE=$? - [ -d "$WORKSPACE" ] && rm -rf "$WORKSPACE" - exit $EXIT_CODE -} - -trap cleanup INT TERM EXIT - -echo "Fetching libffi source archive..." -curl -fsSLo "$WORKSPACE/$LIBFFI_TARBALL" "$NEW_VERSION_URL" -log_and_verify_sha256sum "libffi" "$WORKSPACE/$LIBFFI_TARBALL" -tar -C "$WORKSPACE" -xzf "$WORKSPACE/$LIBFFI_TARBALL" -LIBFFI_STAGING=$(find "$WORKSPACE" -mindepth 1 -maxdepth 1 -type d -print -quit) - -echo "Copying existing Node.js-specific files" -cp "$DEPS_DIR/libffi/libffi.gyp" "$LIBFFI_STAGING" -cp "$DEPS_DIR/libffi/preprocess_asm.py" "$LIBFFI_STAGING" -cp "$DEPS_DIR/libffi/generate-headers.py" "$LIBFFI_STAGING" -cp "$DEPS_DIR/libffi/generate-configure-headers.py" "$LIBFFI_STAGING" -cp "$DEPS_DIR/libffi/generate-darwin-source-and-headers.py" "$LIBFFI_STAGING" - -echo "Replacing existing libffi" -replace_dir "$DEPS_DIR/libffi" "$LIBFFI_STAGING" - -NEW_VERSION_NUMBER=$($NODE -e "const [major, minor, patch] = process.argv[1].split('.'); console.log(String(Number(major)) + String(Number(minor)).padStart(2, '0') + String(Number(patch)).padStart(2, '0'));" "$NEW_VERSION") - -echo "Updating generate-headers.py" -perl -0pi -e "s/^LIBFFI_VERSION = '.*' -/LIBFFI_VERSION = '$NEW_VERSION' -/m; s/^LIBFFI_VERSION_NUMBER = '.*' -/LIBFFI_VERSION_NUMBER = '$NEW_VERSION_NUMBER' -/m" "$DEPS_DIR/libffi/generate-headers.py" - -# Update the version number on maintaining-dependencies.md -# and print the new version as the last line of the script as we need -# to add it to $GITHUB_ENV variable -finalize_version_update "libffi" "$NEW_VERSION" diff --git a/tools/dep_updaters/update-libuv.sh b/tools/dep_updaters/update-libuv.sh deleted file mode 100755 index c2524ddbf0d..00000000000 --- a/tools/dep_updaters/update-libuv.sh +++ /dev/null @@ -1,70 +0,0 @@ -#!/bin/sh -set -e -set -x -# Shell script to update libuv in the source tree to a specific version - -BASE_DIR=$(cd "$(dirname "$0")/../.." && pwd) -DEPS_DIR="$BASE_DIR/deps" -[ -z "$NODE" ] && NODE="$BASE_DIR/out/Release/node" -[ -x "$NODE" ] || NODE=$(command -v node) - -# shellcheck disable=SC1091 -. "$BASE_DIR/tools/dep_updaters/utils.sh" - -NEW_VERSION="$("$NODE" --input-type=module <<'EOF' -const res = await fetch('https://api.github.com/repos/libuv/libuv/releases/latest', - process.env.GITHUB_TOKEN && { - headers: { - "Authorization": `Bearer ${process.env.GITHUB_TOKEN}` - }, - }); -if (!res.ok) throw new Error(`FetchError: ${res.status} ${res.statusText}`, { cause: res }); -const { tag_name } = await res.json(); -console.log(tag_name.replace('v', '')); -EOF -)" - -VERSION_H="$DEPS_DIR/uv/include/uv/version.h" -CURRENT_MAJOR_VERSION=$(grep "#define UV_VERSION_MAJOR" "$VERSION_H" | sed -n "s/^.*MAJOR \(.*\)/\1/p") -CURRENT_MINOR_VERSION=$(grep "#define UV_VERSION_MINOR" "$VERSION_H" | sed -n "s/^.*MINOR \(.*\)/\1/p") -CURRENT_PATCH_VERSION=$(grep "#define UV_VERSION_PATCH" "$VERSION_H" | sed -n "s/^.*PATCH \(.*\)/\1/p") -CURRENT_IS_RELEASE=$(grep "#define UV_VERSION_IS_RELEASE" "$VERSION_H" | sed -n "s/^.*RELEASE \(.*\)/\1/p") -CURRENT_SUFFIX_VERSION=$(grep "#define UV_VERSION_SUFFIX" "$VERSION_H" | sed -n "s/^.*SUFFIX \"\(.*\)\"/\1/p") -SUFFIX_STRING=$([ "$CURRENT_IS_RELEASE" = 1 ] || [ -z "$CURRENT_SUFFIX_VERSION" ] && echo "" || echo "-$CURRENT_SUFFIX_VERSION") -CURRENT_VERSION="$CURRENT_MAJOR_VERSION.$CURRENT_MINOR_VERSION.$CURRENT_PATCH_VERSION$SUFFIX_STRING" - -# This function exit with 0 if new version and current version are the same -compare_dependency_version "libuv" "$NEW_VERSION" "$CURRENT_VERSION" - -echo "Making temporary workspace..." - -WORKSPACE=$(mktemp -d 2> /dev/null || mktemp -d -t 'tmp') - -cleanup () { - EXIT_CODE=$? - [ -d "$WORKSPACE" ] && rm -rf "$WORKSPACE" - exit $EXIT_CODE -} - -trap cleanup INT TERM EXIT - -cd "$WORKSPACE" - -LIBUV_TARBALL="libuv-v$NEW_VERSION.tar.gz" - -echo "Fetching libuv source archive..." -curl -sL -o "$LIBUV_TARBALL" "https://api.github.com/repos/libuv/libuv/tarball/v$NEW_VERSION" -log_and_verify_sha256sum "libuv" "$LIBUV_TARBALL" -gzip -dc "$LIBUV_TARBALL" | tar xf - -rm "$LIBUV_TARBALL" -mv libuv-libuv-* uv - -echo "Replacing existing libuv (except GYP and GN build files)" -mv "$DEPS_DIR/uv/"*.gyp "$DEPS_DIR/uv/"*.gypi "$DEPS_DIR/uv/"*.gn "$DEPS_DIR/uv/"*.gni "$WORKSPACE/uv/" -rm -rf "$DEPS_DIR/uv" -mv "$WORKSPACE/uv" "$DEPS_DIR/" - -# Update the version number on maintaining-dependencies.md -# and print the new version as the last line of the script as we need -# to add it to $GITHUB_ENV variable -finalize_version_update "libuv" "$NEW_VERSION" diff --git a/tools/dep_updaters/update-lief.sh b/tools/dep_updaters/update-lief.sh deleted file mode 100755 index 84b496ec2c5..00000000000 --- a/tools/dep_updaters/update-lief.sh +++ /dev/null @@ -1,68 +0,0 @@ -#!/bin/sh -set -e -# Shell script to update lief in the source tree to a specific version - -BASE_DIR=$(cd "$(dirname "$0")/../.." && pwd) -DEPS_DIR="$BASE_DIR/deps" -[ -z "$NODE" ] && NODE="$BASE_DIR/out/Release/node" -[ -x "$NODE" ] || NODE=$(command -v node) - -# shellcheck disable=SC1091 -. "$BASE_DIR/tools/dep_updaters/utils.sh" - -NEW_VERSION="$("$NODE" --input-type=module <<'EOF' -const res = await fetch('https://api.github.com/repos/lief-project/LIEF/releases/latest', - process.env.GITHUB_TOKEN && { - headers: { - "Authorization": `Bearer ${process.env.GITHUB_TOKEN}` - }, - }); -if (!res.ok) throw new Error(`FetchError: ${res.status} ${res.statusText}`, { cause: res }); -const { tag_name } = await res.json(); -console.log(tag_name.replace('v', '')); -EOF -)" - -CURRENT_VERSION=$(grep "#define LIEF_VERSION" "$DEPS_DIR/LIEF/include/LIEF/version.h" | sed -n "s/^.*VERSION \"\(.*\)-\"/\1/p") - -# This function exit with 0 if new version and current version are the same -compare_dependency_version "lief" "$NEW_VERSION" "$CURRENT_VERSION" - -echo "Making temporary workspace..." - -WORKSPACE=$(mktemp -d 2> /dev/null || mktemp -d -t 'tmp') - -cleanup () { - EXIT_CODE=$? - [ -d "$WORKSPACE" ] && rm -rf "$WORKSPACE" - exit $EXIT_CODE -} - -trap cleanup INT TERM EXIT - -LIEF_ZIP="lief-$NEW_VERSION.zip" - -cd "$WORKSPACE" - -echo "Fetching lief source archive..." -curl -sL -o "$LIEF_ZIP" "https://github.com/lief-project/LIEF/archive/refs/tags/$NEW_VERSION.zip" -# log_and_verify_sha256sum "lief" "$LIEF_ZIP" -unzip "$LIEF_ZIP" -rm "$LIEF_ZIP" - -# Prepare third-party and configured headers in-place so build files don't need generation steps -python3 "$BASE_DIR/tools/prepare_lief.py" --source-dir "$WORKSPACE/LIEF-$NEW_VERSION" --lief-dir "$WORKSPACE/LIEF" --version "$NEW_VERSION" || { - echo "Failed to prepare LIEF third-party and headers" >&2 - exit 1 -} - -echo "Replacing existing LIEF (except GYP and GN build files)" -cp "$DEPS_DIR/LIEF/"*.gyp "$WORKSPACE/LIEF/" - -rm -rf "$DEPS_DIR/LIEF" -mv "$WORKSPACE/LIEF" "$DEPS_DIR/LIEF" - -# Update the version number on maintaining-dependencies.md -# and print the new version as the last line of the script as we need -# to add it to $GITHUB_ENV variable -finalize_version_update "lief" "$NEW_VERSION" diff --git a/tools/dep_updaters/update-llhttp.sh b/tools/dep_updaters/update-llhttp.sh deleted file mode 100755 index 25d294387d6..00000000000 --- a/tools/dep_updaters/update-llhttp.sh +++ /dev/null @@ -1,79 +0,0 @@ -#!/bin/sh -set -ex - -# Shell script to update llhttp in the source tree to specific version - -BASE_DIR=$(cd "$(dirname "$0")/../.." && pwd) -DEPS_DIR="${BASE_DIR}/deps" - -[ -z "$NODE" ] && NODE="$BASE_DIR/out/Release/node" -[ -x "$NODE" ] || NODE=$(command -v node) -NPM_DIR="$DEPS_DIR/npm/bin" -NPM="$NPM_DIR/npm-cli.js" - -# shellcheck disable=SC1091 -. "$BASE_DIR/tools/dep_updaters/utils.sh" - -if [ -n "$LOCAL_COPY" ]; then - NEW_VERSION=$(PACKAGE_JSON="$LOCAL_COPY/package.json" node -p "require(process.env.PACKAGE_JSON).version") -else - NEW_VERSION="$("$NODE" --input-type=module <<'EOF' - const res = await fetch('https://api.github.com/repos/nodejs/llhttp/releases/latest', - process.env.GITHUB_TOKEN && { - headers: { - "Authorization": `Bearer ${process.env.GITHUB_TOKEN}` - }, - }); - if (!res.ok) throw new Error(`FetchError: ${res.status} ${res.statusText}`, { cause: res }); - const { tag_name } = await res.json(); - console.log(tag_name.replace('release/v', '')); -EOF -)" -fi - -CURRENT_MAJOR_VERSION=$(grep "#define LLHTTP_VERSION_MAJOR" ./deps/llhttp/include/llhttp.h | sed -n "s/^.*MAJOR \(.*\)/\1/p") -CURRENT_MINOR_VERSION=$(grep "#define LLHTTP_VERSION_MINOR" ./deps/llhttp/include/llhttp.h | sed -n "s/^.*MINOR \(.*\)/\1/p") -CURRENT_PATCH_VERSION=$(grep "#define LLHTTP_VERSION_PATCH" ./deps/llhttp/include/llhttp.h | sed -n "s/^.*PATCH \(.*\)/\1/p") -CURRENT_VERSION="$CURRENT_MAJOR_VERSION.$CURRENT_MINOR_VERSION.$CURRENT_PATCH_VERSION" - -# This function exit with 0 if new version and current version are the same -compare_dependency_version "llhttp" "$NEW_VERSION" "$CURRENT_VERSION" - -cleanup () { - EXIT_CODE=$? - [ -d "$WORKSPACE" ] && rm -rf "$WORKSPACE" - exit $EXIT_CODE -} - -echo "Making temporary workspace ..." -WORKSPACE=$(mktemp -d 2> /dev/null || mktemp -d -t 'tmp') -trap cleanup INT TERM EXIT - -if [ -z "$LOCAL_COPY" ]; then - echo "Downloading llhttp source..." - curl -fsSL "https://github.com/nodejs/llhttp/archive/refs/tags/v$NEW_VERSION.tar.gz" | tar xz -C "$WORKSPACE" - - LOCAL_COPY="$(find "$WORKSPACE" -mindepth 1 -maxdepth 1 -type d -print -quit)" -fi - -echo "Replacing existing llhttp (except GYP and GN build files)" -mv "$DEPS_DIR/llhttp/"*.gn "$DEPS_DIR/llhttp/"*.gni "$WORKSPACE/" - -echo "Building llhttp ..." -( - cd "$LOCAL_COPY" - "$NODE" "$NPM" ci --ignore-scripts - "$NODE" "$NPM" exec tsc - RELEASE=$NEW_VERSION make release -) - -echo "Overwriting vendored files..." -rm -rf "$DEPS_DIR/llhttp" -cp -a "$LOCAL_COPY/release" "$DEPS_DIR/llhttp" - -mv "$WORKSPACE/"*.gn "$WORKSPACE/"*.gni "$DEPS_DIR/llhttp" - -# Update the version number on maintaining-dependencies.md -# and print the new version as the last line of the script as we need -# to add it to $GITHUB_ENV variable -finalize_version_update "llhttp" "$NEW_VERSION" diff --git a/tools/dep_updaters/update-merve.sh b/tools/dep_updaters/update-merve.sh deleted file mode 100755 index 31d9b15148a..00000000000 --- a/tools/dep_updaters/update-merve.sh +++ /dev/null @@ -1,65 +0,0 @@ -#!/bin/sh -set -e -# Shell script to update merve in the source tree to a specific version - -BASE_DIR=$(cd "$(dirname "$0")/../.." && pwd) -DEPS_DIR="$BASE_DIR/deps" -[ -z "$NODE" ] && NODE="$BASE_DIR/out/Release/node" -[ -x "$NODE" ] || NODE=$(command -v node) - -# shellcheck disable=SC1091 -. "$BASE_DIR/tools/dep_updaters/utils.sh" - -NEW_VERSION="$("$NODE" --input-type=module <<'EOF' -const res = await fetch('https://api.github.com/repos/anonrig/merve/releases/latest', - process.env.GITHUB_TOKEN && { - headers: { - "Authorization": `Bearer ${process.env.GITHUB_TOKEN}` - }, - }); -if (!res.ok) throw new Error(`FetchError: ${res.status} ${res.statusText}`, { cause: res }); -const { tag_name } = await res.json(); -console.log(tag_name.replace('v', '')); -EOF -)" - -CURRENT_VERSION=$(grep "#define MERVE_VERSION" "$DEPS_DIR/merve/merve.h" | sed -n "s/^.*VERSION \"\(.*\)\"/\1/p") - -# This function exit with 0 if new version and current version are the same -compare_dependency_version "merve" "$NEW_VERSION" "$CURRENT_VERSION" - -echo "Making temporary workspace..." - -WORKSPACE=$(mktemp -d 2> /dev/null || mktemp -d -t 'tmp') - -cleanup () { - EXIT_CODE=$? - [ -d "$WORKSPACE" ] && rm -rf "$WORKSPACE" - exit $EXIT_CODE -} - -trap cleanup INT TERM EXIT - -MERVE_REF="v$NEW_VERSION" -MERVE_ZIP="singleheader.zip" -MERVE_LICENSE="LICENSE-MIT" - -cd "$WORKSPACE" - -echo "Fetching merve source archive..." -curl -sL -o "$MERVE_ZIP" "https://github.com/anonrig/merve/releases/download/$MERVE_REF/singleheader.zip" -log_and_verify_sha256sum "merve" "$MERVE_ZIP" -unzip "$MERVE_ZIP" -rm "$MERVE_ZIP" - -curl -sL -o "$MERVE_LICENSE" "https://raw.githubusercontent.com/anonrig/merve/HEAD/LICENSE-MIT" - -echo "Replacing existing merve (except GYP/GN build files)" -mv "$DEPS_DIR/merve/merve.gyp" "$DEPS_DIR/merve/BUILD.gn" "$DEPS_DIR/merve/unofficial.gni" "$WORKSPACE/" -rm -rf "$DEPS_DIR/merve" -mv "$WORKSPACE" "$DEPS_DIR/merve" - -# Update the version number on maintaining-dependencies.md -# and print the new version as the last line of the script as we need -# to add it to $GITHUB_ENV variable -finalize_version_update "merve" "$NEW_VERSION" diff --git a/tools/dep_updaters/update-nbytes.sh b/tools/dep_updaters/update-nbytes.sh deleted file mode 100755 index b86598bf44b..00000000000 --- a/tools/dep_updaters/update-nbytes.sh +++ /dev/null @@ -1,61 +0,0 @@ -#!/bin/sh -set -e -# Shell script to update nbytes in the source tree to a specific version - -BASE_DIR=$(cd "$(dirname "$0")/../.." && pwd) -DEPS_DIR="$BASE_DIR/deps" -[ -z "$NODE" ] && NODE="$BASE_DIR/out/Release/node" -[ -x "$NODE" ] || NODE=$(command -v node) - -# shellcheck disable=SC1091 -. "$BASE_DIR/tools/dep_updaters/utils.sh" - -NEW_VERSION="$("$NODE" --input-type=module <<'EOF' -const res = await fetch('https://api.github.com/repos/nodejs/nbytes/releases/latest', - process.env.GITHUB_TOKEN && { - headers: { - "Authorization": `Bearer ${process.env.GITHUB_TOKEN}` - }, - }); -if (!res.ok) throw new Error(`FetchError: ${res.status} ${res.statusText}`, { cause: res }); -const { tag_name } = await res.json(); -console.log(tag_name.replace('v', '')); -EOF -)" - -CURRENT_VERSION=$(grep "#define NBYTES_VERSION" "$DEPS_DIR/nbytes/nbytes.h" | sed -n "s/^.*VERSION \"\(.*\)\"/\1/p") - -# This function exit with 0 if new version and current version are the same -compare_dependency_version "nbytes" "$NEW_VERSION" "$CURRENT_VERSION" - -echo "Making temporary workspace..." - -WORKSPACE=$(mktemp -d 2> /dev/null || mktemp -d -t 'tmp') - -cleanup () { - EXIT_CODE=$? - [ -d "$WORKSPACE" ] && rm -rf "$WORKSPACE" - exit $EXIT_CODE -} - -trap cleanup INT TERM EXIT - -cd "$WORKSPACE" - -echo "Fetching nbytes source archive..." -NBYTES_TARBALL="nbytes-v$NEW_VERSION.tar.gz" -curl -sL -o "$NBYTES_TARBALL" "https://api.github.com/repos/nodejs/nbytes/tarball/v$NEW_VERSION" -log_and_verify_sha256sum "nbytes" "$NBYTES_TARBALL" -gzip -dc "$NBYTES_TARBALL" | tar xf - -mv nodejs-nbytes-* source -rm "$NBYTES_TARBALL" - -echo "Replacing existing nbytes (except GYP and GN build files)" -mv "$DEPS_DIR/nbytes/"*.gyp "$DEPS_DIR/nbytes/"*.gn "$DEPS_DIR/nbytes/"*.gni "$DEPS_DIR/nbytes/README.md" "$WORKSPACE/source" -rm -rf "$DEPS_DIR/nbytes" -mv "$WORKSPACE/source" "$DEPS_DIR/nbytes" - -# Update the version number on maintaining-dependencies.md -# and print the new version as the last line of the script as we need -# to add it to $GITHUB_ENV variable -finalize_version_update "nbytes" "$NEW_VERSION" diff --git a/tools/dep_updaters/update-nghttp2.sh b/tools/dep_updaters/update-nghttp2.sh deleted file mode 100755 index 759f71f4f40..00000000000 --- a/tools/dep_updaters/update-nghttp2.sh +++ /dev/null @@ -1,88 +0,0 @@ -#!/bin/sh -set -e -# Shell script to update nghttp2 in the source tree to specific version - -BASE_DIR=$(cd "$(dirname "$0")/../.." && pwd) -DEPS_DIR="$BASE_DIR/deps" - -[ -z "$NODE" ] && NODE="$BASE_DIR/out/Release/node" -[ -x "$NODE" ] || NODE=$(command -v node) - -# shellcheck disable=SC1091 -. "$BASE_DIR/tools/dep_updaters/utils.sh" - -NEW_VERSION="$("$NODE" --input-type=module <<'EOF' -const res = await fetch('https://api.github.com/repos/nghttp2/nghttp2/releases/latest', - process.env.GITHUB_TOKEN && { - headers: { - "Authorization": `Bearer ${process.env.GITHUB_TOKEN}` - }, - }); -if (!res.ok) throw new Error(`FetchError: ${res.status} ${res.statusText}`, { cause: res }); -const { tag_name } = await res.json(); -console.log(tag_name.replace('v', '')); -EOF -)" - -CURRENT_VERSION=$(grep "#define NGHTTP2_VERSION" ./deps/nghttp2/lib/includes/nghttp2/nghttp2ver.h | sed -n "s/^.*VERSION \"\(.*\)\"/\1/p") - -# This function exit with 0 if new version and current version are the same -compare_dependency_version "nghttp2" "$NEW_VERSION" "$CURRENT_VERSION" - -echo "Making temporary workspace" - -WORKSPACE=$(mktemp -d 2> /dev/null || mktemp -d -t 'tmp') - -cleanup () { - EXIT_CODE=$? - [ -d "$WORKSPACE" ] && rm -rf "$WORKSPACE" - exit $EXIT_CODE -} - -trap cleanup INT TERM EXIT - -NGHTTP2_REF="v$NEW_VERSION" -NGHTTP2_TARBALL="nghttp2-$NEW_VERSION.tar.xz" - -cd "$WORKSPACE" - -echo "Fetching nghttp2 source archive" -curl -sL -o "$NGHTTP2_TARBALL" "https://github.com/nghttp2/nghttp2/releases/download/$NGHTTP2_REF/$NGHTTP2_TARBALL" - -echo "Verifying PGP signature" -curl -sL -o "${NGHTTP2_TARBALL}.asc" "https://github.com/nghttp2/nghttp2/releases/download/${NGHTTP2_REF}/${NGHTTP2_TARBALL}.asc" -gpgv --keyring "$BASE_DIR/tools/dep_updaters/nghttp.kbx" "${NGHTTP2_TARBALL}.asc" "${NGHTTP2_TARBALL}" - -echo "Unpacking archive" -tar xJf "$NGHTTP2_TARBALL" -rm "$NGHTTP2_TARBALL" -rm "${NGHTTP2_TARBALL}.asc" -mv "nghttp2-$NEW_VERSION" nghttp2 - -echo "Removing everything, except lib/ and COPYING" -cd nghttp2 -for dir in *; do - if [ "$dir" = "lib" ] || [ "$dir" = "COPYING" ]; then - continue - fi - rm -rf "$dir" -done - -# Refs: https://github.com/nodejs/node/issues/45572 -echo "Copying config.h file" -cp "$DEPS_DIR/nghttp2/lib/includes/config.h" "$WORKSPACE/nghttp2/lib/includes" - -echo "Copying existing gyp files" -cp "$DEPS_DIR/nghttp2/nghttp2.gyp" "$WORKSPACE/nghttp2" - -echo "Copying existing GN files" -cp "$DEPS_DIR/nghttp2/"*.gn "$DEPS_DIR/nghttp2/"*.gni "$WORKSPACE/nghttp2" - -echo "Replacing existing nghttp2" -rm -rf "$DEPS_DIR/nghttp2" -mv "$WORKSPACE/nghttp2" "$DEPS_DIR/" - -# Update the version number on maintaining-dependencies.md -# and print the new version as the last line of the script as we need -# to add it to $GITHUB_ENV variable -finalize_version_update "nghttp2" "$NEW_VERSION" diff --git a/tools/dep_updaters/update-nghttp3.sh b/tools/dep_updaters/update-nghttp3.sh deleted file mode 100755 index dc71735300d..00000000000 --- a/tools/dep_updaters/update-nghttp3.sh +++ /dev/null @@ -1,72 +0,0 @@ -#!/bin/sh -set -e -# Shell script to update nghttp3 in the source tree to a specific version - -BASE_DIR=$(cd "$(dirname "$0")/../.." && pwd) -DEPS_DIR="$BASE_DIR/deps" -[ -z "$NODE" ] && NODE="$BASE_DIR/out/Release/node" -[ -x "$NODE" ] || NODE=$(command -v node) - -# shellcheck disable=SC1091 -. "$BASE_DIR/tools/dep_updaters/utils.sh" - -NEW_VERSION="$("$NODE" --input-type=module <<'EOF' -const res = await fetch('https://api.github.com/repos/ngtcp2/nghttp3/releases', - process.env.GITHUB_TOKEN && { - headers: { - "Authorization": `Bearer ${process.env.GITHUB_TOKEN}` - }, - }); -if (!res.ok) throw new Error(`FetchError: ${res.status} ${res.statusText}`, { cause: res }); -const releases = await res.json() -const { tag_name } = releases.at(0); -console.log(tag_name.replace('v', '')); -EOF -)" - -NGHTTP3_VERSION_H="$DEPS_DIR/ngtcp2/nghttp3/lib/includes/nghttp3/version.h" - -CURRENT_VERSION=$(grep "#define NGHTTP3_VERSION" "$NGHTTP3_VERSION_H" | sed -n "s/^.*VERSION \"\(.*\)\"/\1/p") - -# This function exit with 0 if new version and current version are the same -compare_dependency_version "nghttp3" "$NEW_VERSION" "$CURRENT_VERSION" - -WORKSPACE=$(mktemp -d 2> /dev/null || mktemp -d -t 'tmp') - -cleanup () { - EXIT_CODE=$? - [ -d "$WORKSPACE" ] && rm -rf "$WORKSPACE" - exit $EXIT_CODE -} - -trap cleanup INT TERM EXIT - -NGHTTP3_REF="v$NEW_VERSION" -ARCHIVE_BASENAME="nghttp3-${NEW_VERSION}" - -cd "$WORKSPACE" - -echo "Fetching nghttp3 source archive..." -curl -sL -o "$ARCHIVE_BASENAME.tar.xz" "https://github.com/ngtcp2/nghttp3/releases/download/${NGHTTP3_REF}/${ARCHIVE_BASENAME}.tar.xz" - -echo "Verifying PGP signature..." -curl -sL "https://github.com/ngtcp2/nghttp3/releases/download/${NGHTTP3_REF}/${ARCHIVE_BASENAME}.tar.xz.asc" \ -| gpgv --keyring "$BASE_DIR/tools/dep_updaters/nghttp.kbx" - "$ARCHIVE_BASENAME.tar.xz" - -echo "Unpacking archive..." -tar -xJf "$ARCHIVE_BASENAME.tar.xz" -rm "$ARCHIVE_BASENAME.tar.xz" -mv "$ARCHIVE_BASENAME" nghttp3 - -cd nghttp3 - -autoreconf -i - -./configure --prefix="$PWD/build" --enable-lib-only - -replace_dir "$DEPS_DIR/ngtcp2/nghttp3/lib" "lib" - -# Update the version number on maintaining-dependencies.md -# and print the new version as the last line of the script as we need -# to add it to $GITHUB_ENV variable -finalize_version_update "nghttp3" "$NEW_VERSION" diff --git a/tools/dep_updaters/update-ngtcp2.sh b/tools/dep_updaters/update-ngtcp2.sh deleted file mode 100755 index 5538b1c5b48..00000000000 --- a/tools/dep_updaters/update-ngtcp2.sh +++ /dev/null @@ -1,81 +0,0 @@ -#!/bin/sh -set -e -# Shell script to update ngtcp2 in the source tree to a specific version - -BASE_DIR=$(cd "$(dirname "$0")/../.." && pwd) -DEPS_DIR="$BASE_DIR/deps" -[ -z "$NODE" ] && NODE="$BASE_DIR/out/Release/node" -[ -x "$NODE" ] || NODE=$(command -v node) - -# shellcheck disable=SC1091 -. "$BASE_DIR/tools/dep_updaters/utils.sh" - -NEW_VERSION="$("$NODE" --input-type=module <<'EOF' -const res = await fetch('https://api.github.com/repos/ngtcp2/ngtcp2/releases', - process.env.GITHUB_TOKEN && { - headers: { - "Authorization": `Bearer ${process.env.GITHUB_TOKEN}` - }, - }); -if (!res.ok) throw new Error(`FetchError: ${res.status} ${res.statusText}`, { cause: res }); -const releases = await res.json() -const { tag_name } = releases.at(0); -console.log(tag_name.replace('v', '')); -EOF -)" - -NGTCP2_VERSION_H="$DEPS_DIR/ngtcp2/ngtcp2/lib/includes/ngtcp2/version.h" - -CURRENT_VERSION=$(grep "#define NGTCP2_VERSION" "$NGTCP2_VERSION_H" | sed -n "s/^.*VERSION \"\(.*\)\"/\1/p") - -# This function exit with 0 if new version and current version are the same -compare_dependency_version "ngtcp2" "$NEW_VERSION" "$CURRENT_VERSION" - -WORKSPACE=$(mktemp -d 2> /dev/null || mktemp -d -t 'tmp') - -cleanup () { - EXIT_CODE=$? - [ -d "$WORKSPACE" ] && rm -rf "$WORKSPACE" - exit $EXIT_CODE -} - -trap cleanup INT TERM EXIT - -NGTCP2_REF="v$NEW_VERSION" - -cd "$WORKSPACE" - -echo "Fetching ngtcp2 source archive..." -git clone --depth 1 --branch "$NGTCP2_REF" https://github.com/ngtcp2/ngtcp2.git - -cd ngtcp2 - -git submodule update --init --recursive - -autoreconf -i - -# For Mac users who have installed libev with MacPorts, append -# ',-L/opt/local/lib' to LDFLAGS, and also pass -# CPPFLAGS="-I/opt/local/include" to ./configure. - -./configure --prefix="$PWD/build" --enable-lib-only - -replace_dir "$DEPS_DIR/ngtcp2/ngtcp2/lib" "lib" -replace_dir "$DEPS_DIR/ngtcp2/ngtcp2/crypto" "crypto" -replace_dir "$DEPS_DIR/ngtcp2/ngtcp2/examples" "examples" -replace_dir "$DEPS_DIR/ngtcp2/ngtcp2/third-party" "third-party" - -cd "$WORKSPACE" - -# Libev is a dependency of ngtcp2's examples. It really hasn't been updated -# in a long time, sticking with the same version should be fine. -curl -sL -o "libev.tar.gz" "https://dist.schmorp.de/libev/libev-4.33.tar.gz" -tar xzf libev.tar.gz -rm libev.tar.gz - -replace_dir "$DEPS_DIR/ngtcp2/ngtcp2/third-party/libev" "libev-4.33" - -# Update the version number on maintaining-dependencies.md -# and print the new version as the last line of the script as we need -# to add it to $GITHUB_ENV variable -finalize_version_update "ngtcp2" "$NEW_VERSION" diff --git a/tools/dep_updaters/update-nixpkgs-pin.sh b/tools/dep_updaters/update-nixpkgs-pin.sh deleted file mode 100755 index 638fa80d560..00000000000 --- a/tools/dep_updaters/update-nixpkgs-pin.sh +++ /dev/null @@ -1,111 +0,0 @@ -#!/bin/sh -set -ex -# Shell script to update Nixpkgs pin in the source tree to the most recent -# version on the unstable channel, and the 26.05 one for Intel Mac support. - -BASE_DIR=$(cd "$(dirname "$0")/../.." && pwd) -NIXPKGS_PIN_FILE="$BASE_DIR/tools/nix/pkgs.nix" -NIXPKGS_COMPAT_PIN_FILE="$BASE_DIR/tools/nix/pkgs-26.05.nix" -OPENSSL_MATRIX_FILE="$BASE_DIR/tools/nix/openssl-matrix.nix" - -NIXPKGS_REPO=$(grep 'repo =' "$NIXPKGS_PIN_FILE" | awk -F'"' '{ print $2 }') -CURRENT_VERSION_SHA1=$(grep 'rev =' "$NIXPKGS_PIN_FILE" | awk -F'"' '{ print $2 }') - -NEW_UPSTREAM_SHA1=$(git ls-remote "$NIXPKGS_REPO.git" nixpkgs-unstable | awk '{print $1}') -NEW_VERSION=$(echo "$NEW_UPSTREAM_SHA1" | head -c 35) - - -# shellcheck disable=SC1091 -. "$BASE_DIR/tools/dep_updaters/utils.sh" - -compare_dependency_version "nixpkgs-unstable" "$CURRENT_VERSION_SHA1" "$NEW_UPSTREAM_SHA1" - -update_pkgs_file() { - PIN_FILE=$1 - PREVIOUS_SHA1=$2 - UPSTREAM_SHA1=$3 - - CURRENT_TARBALL_HASH=$(grep 'sha256 =' "$PIN_FILE" | awk -F'"' '{ print $2 }') - NEW_TARBALL_HASH=$(nix-prefetch-url --unpack "$NIXPKGS_REPO/archive/$UPSTREAM_SHA1.tar.gz") - - TMP_FILE=$(mktemp) - sed "s/$PREVIOUS_SHA1/$UPSTREAM_SHA1/;s/$CURRENT_TARBALL_HASH/$NEW_TARBALL_HASH/" "$PIN_FILE" > "$TMP_FILE" - mv "$TMP_FILE" "$PIN_FILE" -} - -update_pkgs_file "$NIXPKGS_PIN_FILE" "$CURRENT_VERSION_SHA1" "$NEW_UPSTREAM_SHA1" - -# Unstable channel no longer supports Intel architecture for macOS. We can use the 26.05 channel -# to keep testing on that platform for a little longer. -# TODO: remove this when 26.05 is EOL (end of 2026) -COMPAT_VERSION_SHA1=$(grep 'rev =' "$NIXPKGS_COMPAT_PIN_FILE" | awk -F'"' '{ print $2 }') -COMPAT_UPSTREAM_SHA1=$(git ls-remote "$NIXPKGS_REPO.git" nixpkgs-26.05-darwin | awk '{print $1}') -update_pkgs_file "$NIXPKGS_COMPAT_PIN_FILE" "$COMPAT_VERSION_SHA1" "$COMPAT_UPSTREAM_SHA1" - -# === Update openssl-matrix.nix === -# When bumping the pin, we want to update the openssl-matrix.nix file to keep the list in sync nixpkgs -# i.e. add newly added release lines, remove newly dropped release lines), and make sure the "openssl" -# attribute still refers to the same release line as the bundled version in deps/openssl/. - -OPENSSL_MAJOR=$(awk -F= '/^MAJOR=[0-9]+$/ { print $2; exit }' "$BASE_DIR/deps/openssl/openssl/VERSION.dat") -OPENSSL_MINOR=$(awk -F= '/^MINOR=[0-9]+$/ { print $2; exit }' "$BASE_DIR/deps/openssl/openssl/VERSION.dat") - -nix-instantiate -I "nixpkgs=$NIXPKGS_PIN_FILE" --eval --strict --json -E " - let - pkgs = import {}; - opensslAttrs = builtins.filter - (n: builtins.match \"openssl_[0-9]+(_[0-9]+)?\" n != null) - (builtins.attrNames pkgs); - extraMatrixAttrs = [ \"boringssl\" ]; - default = builtins.head (builtins.filter (n: - let - inherit (pkgs.lib) versions; - t = builtins.tryEval pkgs.\${n}; - v = if t.success then builtins.tryEval t.value.version else t; - majorVersion = pkgs.lib.optionalString v.success (versions.major v.value); - minorVersion = pkgs.lib.optionalString v.success (versions.minor v.value); - in - majorVersion == ''$OPENSSL_MAJOR'' && minorVersion == ''$OPENSSL_MINOR'') opensslAttrs); - attrs = builtins.filter - (n: - let t = builtins.tryEval pkgs.\${n}; in - n != default && t.success && (builtins.tryEval t.value.version).success - ) - (opensslAttrs ++ extraMatrixAttrs); - in - { - inherit attrs default; - permittedInsecurePackages = builtins.map (attr: pkgs.\${attr}.name) ( - builtins.filter (attr: (pkgs.\${attr}.meta.insecure)) attrs - ); - } -" | jq -r '"{ - pkgs ? import ./pkgs.nix { - config.permittedInsecurePackages = [ \(.permittedInsecurePackages | if length > 0 then "\(map(@json) | join(" ")) " else "" end)]; - }, -}: - -{ - # \"default\" OpenSSL release line, should be kept in sync with the bundled version: - openssl = pkgs.\(.default); - - # Other OpenSSL variants we want to test for: - inherit (pkgs) - \(.attrs | sort | join("\n ")) - ; - - openssl_fips = import ./openssl-fips.nix { }; -}"' > "$OPENSSL_MATRIX_FILE" - -cat -< /dev/null || mktemp -d -t 'tmp') - -cleanup () { - EXIT_CODE=$? - [ -d "$WORKSPACE" ] && rm -rf "$WORKSPACE" - exit $EXIT_CODE -} - -trap cleanup INT TERM EXIT - -cd "$WORKSPACE" - -NPM_TGZ="npm-v$NPM_VERSION.tar.gz" - -NPM_TARBALL="$($NODE "$NPM" view npm@"$NPM_VERSION" dist.tarball)" - -curl -s "$NPM_TARBALL" > "$NPM_TGZ" - -log_and_verify_sha256sum "npm" "$NPM_TGZ" - -rm -rf "$DEPS_DIR/npm" - -mkdir "$DEPS_DIR/npm" - -tar zxvf "$NPM_TGZ" --strip-component=1 -C "$DEPS_DIR/npm" - -# Update the version number on maintaining-dependencies.md -# and print the new version as the last line of the script as we need -# to add it to $GITHUB_ENV variable -finalize_version_update "npm" "$NPM_VERSION" diff --git a/tools/dep_updaters/update-openssl.sh b/tools/dep_updaters/update-openssl.sh deleted file mode 100755 index 29d72e8700e..00000000000 --- a/tools/dep_updaters/update-openssl.sh +++ /dev/null @@ -1,128 +0,0 @@ -#!/bin/sh -set -e -# Shell script to update OpenSSL in the source tree to a specific version -# Based on https://github.com/nodejs/node/blob/main/doc/contributing/maintaining/maintaining-openssl.md - -cleanup() { - EXIT_CODE=$? - [ -d "$WORKSPACE" ] && rm -rf "$WORKSPACE" - exit $EXIT_CODE -} - -download() { - LATEST_TAG_NAME="$("$NODE" --input-type=module <<'EOF' -const res = await fetch('https://api.github.com/repos/openssl/openssl/git/matching-refs/tags/openssl-3.5'); -if (!res.ok) throw new Error(`FetchError: ${res.status} ${res.statusText}`, { cause: res }); -const releases = await res.json() -const latest = releases.at(-1); -if(!latest) throw new Error(`Could not find latest release`); -console.log(latest.ref.replace('refs/tags/','')); -EOF -)" - NEW_VERSION=$(echo "$LATEST_TAG_NAME" | sed 's/openssl-//;s/-/+/g') - - case "$NEW_VERSION" in - *quic1) NEW_VERSION_NO_RELEASE="${NEW_VERSION%1}" ;; - *) NEW_VERSION_NO_RELEASE="$NEW_VERSION" ;; - esac - VERSION_H="./deps/openssl/config/archs/linux-x86_64/asm/include/openssl/opensslv.h" - CURRENT_VERSION=$(grep "OPENSSL_FULL_VERSION_STR" $VERSION_H | sed -n "s/^.*VERSION_STR \"\(.*\)\"/\1/p") - # This function exit with 0 if new version and current version are the same - compare_dependency_version "openssl" "$NEW_VERSION_NO_RELEASE" "$CURRENT_VERSION" - - echo "Making temporary workspace..." - - WORKSPACE=$(mktemp -d 2> /dev/null || mktemp -d -t 'tmp') - - cd "$WORKSPACE" - echo "Fetching OpenSSL source archive..." - - OPENSSL_TARBALL="openssl.tar.gz" - - curl -sL -o "$OPENSSL_TARBALL" "https://api.github.com/repos/openssl/openssl/tarball/$LATEST_TAG_NAME" - - log_and_verify_sha256sum "openssl" "$OPENSSL_TARBALL" - - gzip -dc "$OPENSSL_TARBALL" | tar xf - - - rm "$OPENSSL_TARBALL" - mv openssl-openssl-* openssl - echo "Replacing existing OpenSSL..." - rm -rf "$DEPS_DIR/openssl/openssl" - mv "$WORKSPACE/openssl" "$DEPS_DIR/openssl/" - - echo "All done!" - echo "" - echo "Please git add openssl, and commit the new version:" - echo "" - echo "$ git add -A deps/openssl/openssl" - echo "$ git commit -m \"deps: upgrade openssl sources to openssl/openssl-$NEW_VERSION\"" - echo "" - # The last line of the script should always print the new version, - # as we need to add it to $GITHUB_ENV variable. - echo "NEW_VERSION=$NEW_VERSION" -} - -regenerate() { - command -v docker >/dev/null 2>&1 || { echo >&2 "Error: 'docker' required but not installed."; exit 1; } - command -v make >/dev/null 2>&1 || { echo >&2 "Error: 'make' required but not installed."; exit 1; } - - echo "Regenerating platform-dependent files..." - - make -C "$DEPS_DIR/openssl/config" clean - # Needed for compatibility with nasm on 32-bit Windows - # See https://github.com/nodejs/node/blob/main/doc/contributing/maintaining/maintaining-openssl.md#2-execute-make-in-depsopensslconfig-directory - sed -i 's/#ifdef/%ifdef/g' "$DEPS_DIR/openssl/openssl/crypto/perlasm/x86asm.pl" - sed -i 's/#endif/%endif/g' "$DEPS_DIR/openssl/openssl/crypto/perlasm/x86asm.pl" - make -C "$BASE_DIR" gen-openssl - - echo "All done!" - echo "" - echo "Please commit the regenerated files:" - echo "" - echo "$ git add -A deps/openssl/config/archs deps/openssl/openssl" - echo "$ git commit -m \"deps: update archs files for openssl\"" - echo "" -} - -help() { - echo "Shell script to update OpenSSL in the source tree to a specific version" - echo "Sub-commands:" - printf "%-23s %s\n" "help" "show help menu and commands" - printf "%-23s %s\n" "download" "download and replace OpenSSL source code with new version" - printf "%-23s %s\n" "regenerate" "regenerate platform-specific files" - echo "" - exit "${1:-0}" -} - -main() { - if [ ${#} -eq 0 ]; then - help 0 - fi - - trap cleanup INT TERM EXIT - - BASE_DIR=$(cd "$(dirname "$0")/../.." && pwd) - DEPS_DIR="$BASE_DIR/deps" - - [ -z "$NODE" ] && NODE="$BASE_DIR/out/Release/node" - [ -x "$NODE" ] || NODE=$(command -v node) - - # shellcheck disable=SC1091 - . "$BASE_DIR/tools/dep_updaters/utils.sh" - - case ${1} in - help | regenerate | download ) - $1 "${2}" - ;; - * ) - echo "unknown command: $1" - help 1 - - # shellcheck disable=SC2317 - exit 1 - ;; - esac -} - -main "$@" diff --git a/tools/dep_updaters/update-perfetto.sh b/tools/dep_updaters/update-perfetto.sh deleted file mode 100755 index 493a8f8c57d..00000000000 --- a/tools/dep_updaters/update-perfetto.sh +++ /dev/null @@ -1,75 +0,0 @@ -#!/bin/sh -set -e -# Shell script to update perfetto in the source tree to specific version - -BASE_DIR=$(cd "$(dirname "$0")/../.." && pwd) -DEPS_DIR="$BASE_DIR/deps" - -[ -z "$NODE" ] && NODE="$BASE_DIR/out/Release/node" -[ -x "$NODE" ] || NODE=$(command -v node) - -# shellcheck disable=SC1091 -. "$BASE_DIR/tools/dep_updaters/utils.sh" - -NEW_VERSION="$("$NODE" --input-type=module <<'EOF' -const res = await fetch('https://api.github.com/repos/google/perfetto/releases/latest', - process.env.GITHUB_TOKEN && { - headers: { - "Authorization": `Bearer ${process.env.GITHUB_TOKEN}` - }, - }); -if (!res.ok) throw new Error(`FetchError: ${res.status} ${res.statusText}`, { cause: res }); -const { tag_name } = await res.json(); -console.log(tag_name.replace('v', '')); -EOF -)" - -CURRENT_VERSION=$(cat ./deps/perfetto/VERSION) - -# This function exit with 0 if new version and current version are the same -compare_dependency_version "perfetto" "$NEW_VERSION" "$CURRENT_VERSION" - -echo "Making temporary workspace" - -WORKSPACE=$(mktemp -d 2> /dev/null || mktemp -d -t 'tmp') - -cleanup () { - EXIT_CODE=$? - [ -d "$WORKSPACE" ] && rm -rf "$WORKSPACE" - exit $EXIT_CODE -} - -trap cleanup INT TERM EXIT - -PERFETTO_REF="v$NEW_VERSION" -PERFETTO_SDK_ZIP="perfetto-cpp-sdk-src.zip" - -cd "$WORKSPACE" - -echo "Fetching perfetto sdk archive" -curl -sL -o "$PERFETTO_SDK_ZIP" "https://github.com/google/perfetto/releases/download/$PERFETTO_REF/$PERFETTO_SDK_ZIP" - -echo "Unpacking archive" -mkdir -p perfetto/sdk -unzip -d perfetto/sdk "$PERFETTO_SDK_ZIP" -rm "$PERFETTO_SDK_ZIP" -echo "$NEW_VERSION" > perfetto/VERSION -curl -sL -o "perfetto/LICENSE" "https://raw.githubusercontent.com/google/perfetto/refs/tags/$PERFETTO_REF/LICENSE" - -# Remove C API headers. Only keep C++ API headers. -rm -f perfetto/sdk/perfetto_c.h perfetto/sdk/perfetto_c.cc - -echo "Copying existing gyp files" -cp "$DEPS_DIR/perfetto/perfetto.gyp" "$WORKSPACE/perfetto" - -echo "Copying existing GN files" -cp "$DEPS_DIR/perfetto/"*.gn "$DEPS_DIR/perfetto/"*.gni "$WORKSPACE/perfetto" - -echo "Replacing existing perfetto" -rm -rf "$DEPS_DIR/perfetto" -mv "$WORKSPACE/perfetto" "$DEPS_DIR/" - -# Update the version number on maintaining-dependencies.md -# and print the new version as the last line of the script as we need -# to add it to $GITHUB_ENV variable -finalize_version_update "perfetto" "$NEW_VERSION" diff --git a/tools/dep_updaters/update-postject.sh b/tools/dep_updaters/update-postject.sh deleted file mode 100755 index 671bcd5a3a9..00000000000 --- a/tools/dep_updaters/update-postject.sh +++ /dev/null @@ -1,57 +0,0 @@ -#!/bin/sh - -# Shell script to update postject in the source tree to the latest release. - -# This script must be in the tools directory when it runs because it uses the -# script source file path to determine directories to work in. - -set -ex - -BASE_DIR=$(cd "$(dirname "$0")/../.." && pwd) -DEPS_DIR="$BASE_DIR/deps" -[ -z "$NODE" ] && NODE="$BASE_DIR/out/Release/node" -[ -x "$NODE" ] || NODE=$(command -v node) -NPM="$BASE_DIR/deps/npm/bin/npm-cli.js" - -# shellcheck disable=SC1091 -. "$BASE_DIR/tools/dep_updaters/utils.sh" - -NEW_VERSION=$("$NODE" "$NPM" view postject dist-tags.latest) -CURRENT_VERSION=$("$NODE" -p "require('./test/fixtures/postject-copy/node_modules/postject/package.json').version") - -# This function exit with 0 if new version and current version are the same -compare_dependency_version "postject" "$NEW_VERSION" "$CURRENT_VERSION" - -echo "Making temporary workspace..." - -WORKSPACE=$(mktemp -d 2> /dev/null || mktemp -d -t 'tmp') - -cleanup () { - EXIT_CODE=$? - [ -d "$WORKSPACE" ] && rm -rf "$WORKSPACE" - exit $EXIT_CODE -} - -trap cleanup INT TERM EXIT - -cd "$WORKSPACE" - -echo "Installing postject npm package..." - -"$NODE" "$NPM" init --yes - -"$NODE" "$NPM" install --no-bin-links --ignore-scripts "postject@$NEW_VERSION" - -echo "Replacing existing postject (except GN build files)" - -mv "$DEPS_DIR/postject/"*.gn "$DEPS_DIR/postject/"*.gni "$WORKSPACE/" -rm -rf "$DEPS_DIR/postject" -mkdir "$DEPS_DIR/postject" -mv "$WORKSPACE/"*.gn "$WORKSPACE/"*.gni "$DEPS_DIR/postject" -mv "$WORKSPACE/node_modules/postject/LICENSE" "$DEPS_DIR/postject" -mv "$WORKSPACE/node_modules/postject/dist/postject-api.h" "$DEPS_DIR/postject" - -# Update the version number on maintaining-dependencies.md -# and print the new version as the last line of the script as we need -# to add it to $GITHUB_ENV variable -finalize_version_update "postject" "$NEW_VERSION" diff --git a/tools/dep_updaters/update-root-certs.mjs b/tools/dep_updaters/update-root-certs.mjs deleted file mode 100644 index 80b6fb33f74..00000000000 --- a/tools/dep_updaters/update-root-certs.mjs +++ /dev/null @@ -1,202 +0,0 @@ -// Script to update certdata.txt from NSS. -import { execFileSync } from 'node:child_process'; -import { randomUUID } from 'node:crypto'; -import { createWriteStream } from 'node:fs'; -import { basename, join, relative } from 'node:path'; -import { Readable } from 'node:stream'; -import { pipeline } from 'node:stream/promises'; -import { fileURLToPath } from 'node:url'; -import { parseArgs } from 'node:util'; - -const __filename = fileURLToPath(import.meta.url); - -const getCertdataURL = (version) => { - const tag = `NSS_${version.replaceAll('.', '_')}_RTM`; - const certdataURL = `https://raw.githubusercontent.com/nss-dev/nss/refs/tags/${tag}/lib/ckfw/builtins/certdata.txt`; - return certdataURL; -}; - -const getFirefoxReleases = async (everything = false) => { - const releaseDataURL = `https://nucleus.mozilla.org/rna/all-releases.json${everything ? '?all=true' : ''}`; - if (values.verbose) { - console.log(`Fetching Firefox release data from ${releaseDataURL}.`); - } - const releaseData = await fetch(releaseDataURL); - if (!releaseData.ok) { - console.error(`Failed to fetch ${releaseDataURL}: ${releaseData.status}: ${releaseData.statusText}.`); - process.exit(-1); - } - return (await releaseData.json()).filter((release) => { - // We're only interested in public releases of Firefox. - return (release.product === 'Firefox' && release.channel === 'Release' && release.is_public === true); - }).sort((a, b) => { - // Sort results by release date. - return new Date(b.release_date) - new Date(a.release_date); - }); -}; - -const getFirefoxRelease = async (version) => { - let releases = await getFirefoxReleases(); - let found; - if (version === undefined) { - // No version specified. Find the most recent. - if (releases.length > 0) { - found = releases[0]; - } else { - if (values.verbose) { - console.log('Unable to find release data for Firefox. Searching full release data.'); - } - releases = await getFirefoxReleases(true); - found = releases[0]; - } - } else { - // Search for the specified release. - found = releases.find((release) => release.version === version); - if (found === undefined) { - if (values.verbose) { - console.log(`Unable to find release data for Firefox ${version}. Searching full release data.`); - } - releases = await getFirefoxReleases(true); - found = releases.find((release) => release.version === version); - } - } - return found; -}; - -const getNSSVersion = async (release) => { - const latestFirefox = release.version; - const firefoxTag = `FIREFOX_${latestFirefox.replaceAll('.', '_')}_RELEASE`; - const tagInfoURL = `https://hg.mozilla.org/releases/mozilla-release/raw-file/${firefoxTag}/security/nss/TAG-INFO`; - if (values.verbose) { - console.log(`Fetching NSS tag from ${tagInfoURL}.`); - } - const tagInfo = await fetch(tagInfoURL); - if (!tagInfo.ok) { - console.error(`Failed to fetch ${tagInfoURL}: ${tagInfo.status}: ${tagInfo.statusText}`); - } - const tag = await tagInfo.text(); - if (values.verbose) { - console.log(`Found tag ${tag}.`); - } - // Tag will be of form `NSS_x_y_RTM`. Convert to `x.y`. - return tag.split('_').slice(1, -1).join('.'); -}; - -const options = { - help: { - type: 'boolean', - }, - file: { - short: 'f', - type: 'string', - }, - verbose: { - short: 'v', - type: 'boolean', - }, -}; -const { - positionals, - values, -} = parseArgs({ - allowPositionals: true, - options, -}); - -if (values.help) { - console.log(`Usage: ${basename(__filename)} [OPTION]... [RELEASE]...`); - console.log(); - console.log('Updates certdata.txt to NSS version contained in Firefox RELEASE (default: most recent release).'); - console.log(''); - console.log(' -f, --file=FILE writes a commit message reflecting the change to the'); - console.log(' specified FILE'); - console.log(' -v, --verbose writes progress to stdout'); - console.log(' --help display this help and exit'); - process.exit(0); -} - -const firefoxRelease = await getFirefoxRelease(positionals[0]); -// Retrieve metadata for the NSS release being updated to. -const version = await getNSSVersion(firefoxRelease); -if (values.verbose) { - console.log(`Updating to NSS version ${version}`); -} - -// Fetch certdata.txt and overwrite the local copy. -const certdataURL = getCertdataURL(version); -if (values.verbose) { - console.log(`Fetching ${certdataURL}`); -} -const checkoutDir = join(__filename, '..', '..', '..'); -const certdata = await fetch(certdataURL); -const certdataFile = join(checkoutDir, 'tools', 'certdata.txt'); -if (!certdata.ok) { - console.error(`Failed to fetch ${certdataURL}: ${certdata.status}: ${certdata.statusText}`); - process.exit(-1); -} -if (values.verbose) { - console.log(`Writing ${certdataFile}`); -} -await pipeline(certdata.body, createWriteStream(certdataFile)); - -// Run tools/mk-ca-bundle.pl to generate src/node_root_certs.h. -if (values.verbose) { - console.log('Running tools/mk-ca-bundle.pl'); -} -const opts = { encoding: 'utf8' }; -const mkCABundleTool = join(checkoutDir, 'tools', 'mk-ca-bundle.pl'); -const mkCABundleOut = execFileSync(mkCABundleTool, - values.verbose ? [ '-v' ] : [], - opts); -if (values.verbose) { - console.log(mkCABundleOut); -} - -// Determine certificates added and/or removed. -const certHeaderFile = relative(process.cwd(), join(checkoutDir, 'src', 'node_root_certs.h')); -const diff = execFileSync('git', [ 'diff-files', '-u', '--', certHeaderFile ], opts); -if (values.verbose) { - console.log(diff); -} -const certsAddedRE = /^\+\/\* (.*) \*\//gm; -const certsRemovedRE = /^-\/\* (.*) \*\//gm; -const added = [ ...diff.matchAll(certsAddedRE) ].map((m) => m[1]); -const removed = [ ...diff.matchAll(certsRemovedRE) ].map((m) => m[1]); - -const commitMsg = [ - `crypto: update root certificates to NSS ${version}`, - '', - `This is the certdata.txt[0] from NSS ${version}.`, - '', -]; -if (firefoxRelease) { - commitMsg.push(`This is the version of NSS that shipped in Firefox ${firefoxRelease.version} on ${firefoxRelease.release_date}.`); - commitMsg.push(''); -} -if (added.length > 0) { - commitMsg.push('Certificates added:'); - commitMsg.push(...added.map((cert) => `- ${cert}`)); - commitMsg.push(''); -} -if (removed.length > 0) { - commitMsg.push('Certificates removed:'); - commitMsg.push(...removed.map((cert) => `- ${cert}`)); - commitMsg.push(''); -} -commitMsg.push(`[0] ${certdataURL}`); -const delimiter = randomUUID(); -const properties = [ - `NEW_VERSION=${version}`, - `COMMIT_MSG<<${delimiter}`, - ...commitMsg, - delimiter, - '', -].join('\n'); -if (values.verbose) { - console.log(properties); -} -const propertyFile = values.file; -if (propertyFile !== undefined) { - console.log(`Writing to ${propertyFile}`); - await pipeline(Readable.from(properties), createWriteStream(propertyFile)); -} diff --git a/tools/dep_updaters/update-simdjson.sh b/tools/dep_updaters/update-simdjson.sh deleted file mode 100755 index 3aa0e06eff0..00000000000 --- a/tools/dep_updaters/update-simdjson.sh +++ /dev/null @@ -1,55 +0,0 @@ -#!/bin/sh -set -e -# Shell script to update simdjson in the source tree to a specific version - -BASE_DIR=$(cd "$(dirname "$0")/../.." && pwd) -DEPS_DIR="$BASE_DIR/deps" -[ -z "$NODE" ] && NODE="$BASE_DIR/out/Release/node" -[ -x "$NODE" ] || NODE=$(command -v node) - -# shellcheck disable=SC1091 -. "$BASE_DIR/tools/dep_updaters/utils.sh" - -NEW_VERSION="$("$NODE" --input-type=module <<'EOF' -const res = await fetch('https://api.github.com/repos/simdjson/simdjson/releases/latest'); -if (!res.ok) throw new Error(`FetchError: ${res.status} ${res.statusText}`, { cause: res }); -const { tag_name } = await res.json(); -console.log(tag_name.replace('v', '')); -EOF -)" -CURRENT_VERSION=$(grep "#define SIMDJSON_VERSION" "$DEPS_DIR/simdjson/simdjson.h" | sed -n "s/^.*VERSION \"\(.*\)\"/\1/p") - -if [ "$NEW_VERSION" = "$CURRENT_VERSION" ]; then - echo "Skipped because simdjson is on the latest version." - exit 0 -fi - -echo "Making temporary workspace..." - -WORKSPACE=$(mktemp -d 2> /dev/null || mktemp -d -t 'tmp') - -cleanup () { - EXIT_CODE=$? - [ -d "$WORKSPACE" ] && rm -rf "$WORKSPACE" - exit $EXIT_CODE -} - -trap cleanup INT TERM EXIT - -SIMDJSON_REF="v$NEW_VERSION" -SIMDJSON_ZIP="simdjson-$NEW_VERSION.zip" - -cd "$WORKSPACE" - -echo "Fetching simdjson source archive..." -curl -sL -o "$SIMDJSON_ZIP" "https://github.com/simdjson/simdjson/archive/refs/tags/$SIMDJSON_REF.zip" -unzip "$SIMDJSON_ZIP" -cd "simdjson-$NEW_VERSION" -mv "singleheader/simdjson.h" "$DEPS_DIR/simdjson" -mv "singleheader/simdjson.cpp" "$DEPS_DIR/simdjson" -mv "LICENSE" "$DEPS_DIR/simdjson" - -# Update the version number on maintaining-dependencies.md -# and print the new version as the last line of the script as we need -# to add it to $GITHUB_ENV variable -finalize_version_update "simdjson" "$NEW_VERSION" diff --git a/tools/dep_updaters/update-sqlite.sh b/tools/dep_updaters/update-sqlite.sh deleted file mode 100755 index e9c6317f06c..00000000000 --- a/tools/dep_updaters/update-sqlite.sh +++ /dev/null @@ -1,69 +0,0 @@ -#!/bin/sh -set -e -# Shell script to update sqlite in the source tree to a specific version - -BASE_DIR=$(cd "$(dirname "$0")/../.." && pwd) -DEPS_DIR="$BASE_DIR/deps" - -[ -z "$NODE" ] && NODE="$BASE_DIR/out/Release/node" -[ -x "$NODE" ] || NODE=$(command -v node) - -# shellcheck disable=SC1091 -. "$BASE_DIR/tools/dep_updaters/utils.sh" - -JOINT_OUTPUT="$("$NODE" --input-type=module <<'EOF' -const res = await fetch('https://sqlite.org/download.html'); -if (!res.ok) throw new Error(`FetchError: ${res.status} ${res.statusText}`, { cause: res }); -const body = await res.text(); -// The downloads page contains product info in a machine readable comment. -const match = body?.match(/PRODUCT,(\d+\.\d+\.\d+),(\d+\/sqlite-amalgamation-\d+\.zip),/); -if (!match) throw new Error('Could not find SQLite amalgamation product data'); -const [, version, amalgamation] = match; -console.log(`${version}:${amalgamation}`); -EOF -)" - -IFS=: read -r NEW_VERSION AMALGAMATION < /dev/null || mktemp -d -t 'tmp') -echo "$WORKSPACE" -cleanup () { - EXIT_CODE=$? - [ -d "$WORKSPACE" ] && rm -rf "$WORKSPACE" - exit $EXIT_CODE -} - -trap cleanup INT TERM EXIT - -SQLITE_ZIP="sqlite-$NEW_VERSION" -cd "$WORKSPACE" - -echo "Fetching SQLITE source archive..." -curl -sL -o "$SQLITE_ZIP.zip" "https://sqlite.org/$AMALGAMATION" - -log_and_verify_sha256sum "sqlite" "$SQLITE_ZIP.zip" - -echo "Unzipping..." -unzip -j "$SQLITE_ZIP.zip" -d "$WORKSPACE/sqlite/" -rm "$SQLITE_ZIP.zip" - -echo "Copying new files to deps folder" -cp "$WORKSPACE/sqlite/sqlite3.c" "$DEPS_DIR/sqlite/" -cp "$WORKSPACE/sqlite/sqlite3.h" "$DEPS_DIR/sqlite/" -cp "$WORKSPACE/sqlite/sqlite3ext.h" "$DEPS_DIR/sqlite/" - -echo "" - -# Update the version number on maintaining-dependencies.md -# and print the new version as the last line of the script as we need -# to add it to $GITHUB_ENV variable -finalize_version_update "sqlite" "$NEW_VERSION" diff --git a/tools/dep_updaters/update-test426-fixtures.sh b/tools/dep_updaters/update-test426-fixtures.sh deleted file mode 100755 index e9cca0dfac8..00000000000 --- a/tools/dep_updaters/update-test426-fixtures.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/sh - -set -ex - -BASE_DIR=$(cd "$(dirname "$0")/../.." && pwd) - -TARGET_DIR="$BASE_DIR/test/fixtures/test426" -README="$BASE_DIR/test/test426/README.md" - -CURRENT_SHA=$(sed -n 's#^.*https://github.com/tc39/source-map-tests/commit/\([0-9a-f]*\).*$#\1#p' "$README") - -if [ -z "$CURRENT_SHA" ]; then - echo "Could not find source-map-tests commit marker in $README" >&2 - exit 1 -fi - -TARBALL_URL=$(curl -fsIo /dev/null -w '%header{Location}' https://github.com/tc39/source-map-tests/archive/HEAD.tar.gz) -SHA=$(basename "$TARBALL_URL") - -# shellcheck disable=SC1091 -. "$BASE_DIR/tools/dep_updaters/utils.sh" - -compare_dependency_version "test426-fixtures" "$CURRENT_SHA" "$SHA" - -rm -rf "$TARGET_DIR" -mkdir "$TARGET_DIR" -curl -f "$TARBALL_URL" | tar -xz --strip-components 1 -C "$TARGET_DIR" - -TMP_FILE=$(mktemp) -sed "s/$CURRENT_SHA/$SHA/" "$README" > "$TMP_FILE" -mv "$TMP_FILE" "$README" - -# The last line of the script should always print the new version, -# as we need to add it to $GITHUB_ENV variable. -NEW_VERSION=$(echo "$SHA" | head -c 39) -echo "NEW_VERSION=$NEW_VERSION" diff --git a/tools/dep_updaters/update-timezone.mjs b/tools/dep_updaters/update-timezone.mjs deleted file mode 100755 index 5462c1e2172..00000000000 --- a/tools/dep_updaters/update-timezone.mjs +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env node - -import { execSync } from 'node:child_process'; -import { renameSync, readdirSync, rmSync } from 'node:fs'; - -const fileNames = [ - 'zoneinfo64.res', - 'windowsZones.res', - 'timezoneTypes.res', - 'metaZones.res', -]; - -const availableVersions = readdirSync('icu-data/tzdata/icunew', { withFileTypes: true }) -.filter((dirent) => dirent.isDirectory()) -.map((dirent) => dirent.name); - -const latestVersion = availableVersions.sort().at(-1); - -execSync('bzip2 -d deps/icu-small/source/data/in/icudt*.dat.bz2'); -fileNames.forEach((file) => { - renameSync(`icu-data/tzdata/icunew/${latestVersion}/44/le/${file}`, `deps/icu-small/source/data/in/${file}`); - execSync(`icupkg -a ${file} icudt*.dat`, { cwd: 'deps/icu-small/source/data/in/' }); - rmSync(`deps/icu-small/source/data/in/${file}`); -}); -execSync('bzip2 -z deps/icu-small/source/data/in/icudt*.dat'); -rmSync('icu-data', { recursive: true }); diff --git a/tools/dep_updaters/update-undici.sh b/tools/dep_updaters/update-undici.sh deleted file mode 100755 index 05d8fb9d8ec..00000000000 --- a/tools/dep_updaters/update-undici.sh +++ /dev/null @@ -1,100 +0,0 @@ -#!/bin/sh - -# Shell script to update undici in the source tree to the latest release. - -# This script must be in the tools directory when it runs because it uses the -# script source file path to determine directories to work in. - -set -ex - -ROOT=$(cd "$(dirname "$0")/../.." && pwd) -DEPS_DIR="$ROOT/deps" -[ -z "$NODE" ] && NODE="$ROOT/out/Release/node" -[ -x "$NODE" ] || NODE=$(command -v node) -NPM="$ROOT/deps/npm/bin/npm-cli.js" - -# shellcheck disable=SC1091 -. "$ROOT/tools/dep_updaters/utils.sh" - -NEW_VERSION="$("$NODE" --input-type=module <<'EOF' -const res = await fetch('https://api.github.com/repos/nodejs/undici/releases/latest', - process.env.GITHUB_TOKEN && { - headers: { - "Authorization": `Bearer ${process.env.GITHUB_TOKEN}` - }, - }); -if (!res.ok) throw new Error(`FetchError: ${res.status} ${res.statusText}`, { cause: res }); -const { tag_name } = await res.json(); -console.log(tag_name.replace('v', '')); -EOF -)" - -CURRENT_VERSION=$("$NODE" -p "require('$DEPS_DIR/undici/src/package.json').version") - -echo "$CURRENT_VERSION" -echo "$NEW_VERSION" - -# This function exit with 0 if new version and current version are the same -compare_dependency_version "undici" "$NEW_VERSION" "$CURRENT_VERSION" - -rm -rf deps/undici/src -rm -f deps/undici/undici.js - -TARBALL=$(mktemp 2> /dev/null || mktemp -t 'tmp') - -cleanup () { - EXIT_CODE=$? - [ -e "$TARBALL" ] && rm "$TARBALL" - exit $EXIT_CODE -} - -trap cleanup INT TERM EXIT - -echo "Fetching UNDICI source archive..." -curl -fsSLo "$TARBALL" "https://github.com/nodejs/undici/archive/refs/tags/v$NEW_VERSION.tar.gz" - -log_and_verify_sha256sum "undici" "$TARBALL" - -echo "Unzipping..." -tar -xzf "$TARBALL" -C "$DEPS_DIR/undici" -mv "$DEPS_DIR/undici"/undici-* "$DEPS_DIR/undici/src" - -( - cd "$DEPS_DIR/undici/src" - - # remove components we don't need to keep in nodejs/deps - rm -rf .husky || true - rm -rf .github || true - rm -rf test - rm -rf benchmarks - rm -rf docs-tmp - mv docs docs-tmp - mkdir docs - mv docs-tmp/docs docs/docs - rm -rf docs-tmp - - # Rebuild components from source - rm lib/llhttp/llhttp*.* - "$NODE" "$NPM" ci --ignore-scripts - "$NODE" "$NPM" run build:wasm > lib/llhttp/wasm_build_env.txt - "$NODE" "$NPM" run build:node - "$NODE" "$NPM" prune --production -) - -# update version information in src/undici_version.h -cat > "$ROOT/src/undici_version.h" < /dev/null || mktemp -d -t 'tmp') -echo "$WORKSPACE" -cleanup () { - EXIT_CODE=$? - [ -d "$WORKSPACE" ] && rm -rf "$WORKSPACE" - exit $EXIT_CODE -} - -trap cleanup INT TERM EXIT - -UVWASI_ZIP="uvwasi-$NEW_VERSION" -cd "$WORKSPACE" - -echo "Fetching UVWASI source archive..." -curl -sL -o "$UVWASI_ZIP.zip" "https://github.com/nodejs/uvwasi/archive/refs/tags/v$NEW_VERSION.zip" - -log_and_verify_sha256sum "uvwasi" "$UVWASI_ZIP.zip" - -echo "Moving existing GYP build file" -mv "$DEPS_DIR/uvwasi/"*.gyp "$WORKSPACE/" - -echo "Moving existing GN build file" -mv "$DEPS_DIR/uvwasi/"*.gn "$DEPS_DIR/uvwasi/"*.gni "$WORKSPACE/" - -rm -rf "$DEPS_DIR/uvwasi/" - -echo "Unzipping..." -unzip "$UVWASI_ZIP.zip" -d "$DEPS_DIR/uvwasi/" -rm "$UVWASI_ZIP.zip" - -mv "$WORKSPACE/"*.gyp "$WORKSPACE/"*.gn "$WORKSPACE/"*.gni "$DEPS_DIR/uvwasi/" -cd "$DEPS_DIR/uvwasi/" - -echo "Copying new files to deps folder" -replace_dir "$DEPS_DIR/uvwasi/include" "$UVWASI_ZIP/include" -replace_dir "$DEPS_DIR/uvwasi/src" "$UVWASI_ZIP/src" -cp "$UVWASI_ZIP/LICENSE" "$DEPS_DIR/uvwasi/" -rm -rf "$UVWASI_ZIP" - -echo "Make sure to update the deps/uvwasi/uvwasi.gyp if any significant changes have occurred upstream" -echo "" - -# Update the version number on maintaining-dependencies.md -# and print the new version as the last line of the script as we need -# to add it to $GITHUB_ENV variable -finalize_version_update "uvwasi" "$NEW_VERSION" diff --git a/tools/dep_updaters/update-v8-patch.sh b/tools/dep_updaters/update-v8-patch.sh deleted file mode 100755 index 77080f86515..00000000000 --- a/tools/dep_updaters/update-v8-patch.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/sh -set -e -# Shell script to update v8 patch update - -BASE_DIR=$(cd "$(dirname "$0")/../.." && pwd) - -# shellcheck disable=SC1091 -. "$BASE_DIR/tools/dep_updaters/utils.sh" - -cd "$BASE_DIR" - -CAN_UPDATE=$(git node v8 minor | grep -q "V8 is up-to-date" || echo "1") - -if [ -z "$CAN_UPDATE" ]; then - echo "Skipped because V8 is on the latest version." - exit 0 -fi - -DEPS_DIR="$BASE_DIR/deps" - -CURRENT_MAJOR_VERSION=$(grep "#define V8_MAJOR_VERSION" "$DEPS_DIR/v8/include/v8-version.h" | cut -d ' ' -f3) -CURRENT_MINOR_VERSION=$(grep "#define V8_MINOR_VERSION" "$DEPS_DIR/v8/include/v8-version.h" | cut -d ' ' -f3) -CURRENT_BUILD_VERSION=$(grep "#define V8_BUILD_NUMBER" "$DEPS_DIR/v8/include/v8-version.h" | cut -d ' ' -f3) -CURRENT_PATCH_VERSION=$(grep "#define V8_PATCH_LEVEL" "$DEPS_DIR/v8/include/v8-version.h" | cut -d ' ' -f3) - -NEW_VERSION="$CURRENT_MAJOR_VERSION.$CURRENT_MINOR_VERSION.$CURRENT_BUILD_VERSION.$CURRENT_PATCH_VERSION" - - -echo "All done!" -echo "" - -# The last line of the script should always print the new version, -# as we need to add it to $GITHUB_ENV variable. -echo "NEW_VERSION=$NEW_VERSION" diff --git a/tools/dep_updaters/update-zlib.sh b/tools/dep_updaters/update-zlib.sh deleted file mode 100755 index b47f1dc4855..00000000000 --- a/tools/dep_updaters/update-zlib.sh +++ /dev/null @@ -1,96 +0,0 @@ -#!/bin/sh -set -ex -# Shell script to update zlib in the source tree to the most recent version. -# Zlib rarely creates tags or releases, so we use the latest commit on the main branch. -# See: https://github.com/nodejs/node/pull/47417 - -BASE_DIR=$(cd "$(dirname "$0")/../.." && pwd) -DEPS_DIR="$BASE_DIR/deps" - -# shellcheck disable=SC1091 -. "$BASE_DIR/tools/dep_updaters/utils.sh" - -echo "Comparing latest upstream with current revision" - -git fetch --no-tags https://chromium.googlesource.com/chromium/src/third_party/zlib.git HEAD - -# Revert zconf.h changes before checking diff -perl -i -pe 's|^//#include "chromeconf.h"|#include "chromeconf.h"|' "$DEPS_DIR/zlib/zconf.h" -git stash -- "$DEPS_DIR/zlib/zconf.h" - -DIFF_TREE=$(git diff --quiet --diff-filter=d 'stash@{0}:deps/zlib' FETCH_HEAD || echo "Changes detected") - -git stash drop - -if [ -z "$DIFF_TREE" ]; then - echo "Skipped because zlib is on the latest version." - exit 0 -fi - -# This is a rather arbitrary restriction. This script is assumed to run on -# Sunday, shortly after midnight UTC. This check thus prevents pulling in the -# most recent commits if any changes were made on Friday or Saturday (UTC). -# We don't want to pull in a commit that was just pushed, and instead rather -# wait for the next week's update. If no commits have been pushed in the last -# two days, we assume that the most recent commit is stable enough to be -# pulled in. -LAST_CHANGE_DATE=$(git log -1 --format=%ct FETCH_HEAD) -TWO_DAYS_AGO=$(date -d '2 days ago' '+%s' 2>/dev/null || date -v-2d '+%s') - -if [ "$LAST_CHANGE_DATE" -gt "$TWO_DAYS_AGO" ]; then - echo "Skipped because the latest version is too recent." - exit 0 -fi - -LATEST_COMMIT=$(git rev-parse --short=7 FETCH_HEAD) - -echo "Making temporary workspace..." - -WORKSPACE=$(mktemp -d 2> /dev/null || mktemp -d -t 'tmp') - -cleanup () { - EXIT_CODE=$? - rm -rf "$WORKSPACE" - exit $EXIT_CODE -} - -trap cleanup INT TERM EXIT - -ZLIB_TARBALL="zlib-$LATEST_COMMIT.tar" - -echo "Packing zlib source archive" -git archive --prefix=zlib/ -o "$WORKSPACE/$ZLIB_TARBALL" --format=tar FETCH_HEAD - -log_and_verify_sha256sum "zlib" "$WORKSPACE/$ZLIB_TARBALL" - -mv "$DEPS_DIR/zlib/zlib.gyp" "$WORKSPACE/." -mv "$DEPS_DIR/zlib/win32/zlib.def" "$WORKSPACE/." - -rm -rf "$DEPS_DIR/zlib" -tar -xf "$WORKSPACE/$ZLIB_TARBALL" -C "$DEPS_DIR" --exclude='zlib/doc/' - -mv "$WORKSPACE/zlib.gyp" "$DEPS_DIR/zlib/." - -mkdir -p "$DEPS_DIR/zlib/win32" -mv "$WORKSPACE/zlib.def" "$DEPS_DIR/zlib/win32/." - -perl -i -pe 's|^#include "chromeconf.h"|//#include "chromeconf.h"|' "$DEPS_DIR/zlib/zconf.h" - -VERSION_NUMBER=$(grep "#define ZLIB_VERSION" "$DEPS_DIR/zlib/zlib.h" | sed -n "s/^.*VERSION \"\(.*\)\"/\1/p") - -NEW_VERSION="$VERSION_NUMBER-$LATEST_COMMIT" - -# update version information in src/zlib_version.h -cat -> "$BASE_DIR/src/zlib_version.h" < /dev/null || mktemp -d -t 'tmp') - -cleanup () { - EXIT_CODE=$? - [ -d "$WORKSPACE" ] && rm -rf "$WORKSPACE" - exit $EXIT_CODE -} - -trap cleanup INT TERM EXIT - -cd "$WORKSPACE" - -zstd_TARBALL="zstd-v$NEW_VERSION.tar.gz" - -echo "Fetching zstd source archive" -curl -sL -o "$zstd_TARBALL" "https://github.com/facebook/zstd/archive/v$NEW_VERSION.tar.gz" -log_and_verify_sha256sum "zstd" "$zstd_TARBALL" -gzip -dc "$zstd_TARBALL" | tar xf - -rm "$zstd_TARBALL" -mv "zstd-$NEW_VERSION" "zstd" - -echo "Copying existing gyp file" -cp "$DEPS_DIR/zstd/zstd.gyp" "$WORKSPACE/zstd" - -echo "Copying existing GN files" -cp "$DEPS_DIR/zstd/"*.gn "$DEPS_DIR/zstd/"*.gni "$WORKSPACE/zstd" - -echo "Deleting existing zstd" -rm -rf "$DEPS_DIR/zstd" -mkdir "$DEPS_DIR/zstd" - -echo "Update c and LICENSE" -mv "$WORKSPACE/zstd/"*.gn "$WORKSPACE/zstd/"*.gni "$WORKSPACE/zstd/lib" "$WORKSPACE/zstd/LICENSE" "$WORKSPACE/zstd/zstd.gyp" "$DEPS_DIR/zstd" - -# Update the version number on maintaining-dependencies.md -# and print the new version as the last line of the script as we need -# to add it to $GITHUB_ENV variable -finalize_version_update "zstd" "$NEW_VERSION" diff --git a/tools/dep_updaters/utils.sh b/tools/dep_updaters/utils.sh deleted file mode 100644 index 76a40d4bbc4..00000000000 --- a/tools/dep_updaters/utils.sh +++ /dev/null @@ -1,87 +0,0 @@ -#!/bin/sh - -ROOT=$(cd "$(dirname "$0")/../.." && pwd) -export ROOT - -# This function compare new version with current version of a dependency and -# exit the script if the versions are the same -# -# $1 is the package name e.g. 'acorn', 'ada', 'base64' etc. See the file -# https://github.com/nodejs/node/blob/main/doc/contributing/maintaining/maintaining-dependencies.md -# for a complete list of package name -# $2 is the new version. -compare_dependency_version() { - package_name="$1" - new_version="$2" - current_version="$3" - echo "Comparing $new_version with $current_version" - if [ "$new_version" = "$current_version" ]; then - echo "Skipped because $package_name is on the latest version." - exit 0 - fi -} - -# This function inform to commit the new version of a maintained dependency -# and print the last line of the script "NEW_VERSION=$NEW_VERSION" as we need -# to add it to $GITHUB_ENV variable. -# -# $1 is the package name e.g. 'acorn', 'ada', 'base64' etc. See the file -# https://github.com/nodejs/node/blob/main/doc/contributing/maintaining/maintaining-dependencies.md -# for a complete list of package name -# $2 is the new version. -# $3 (optional) other files to be git added apart from the deps/package_name -finalize_version_update() { - package_name="$1" - new_version="$2" - extra_files="$3" - - echo "All done!" - echo "" - echo "Please git add $package_name and commit the new version:" - echo "" - echo "$ git add -A deps/$package_name $extra_files" - echo "$ git commit -m \"deps: update $package_name to $new_version\"" - echo "" - - # The last line of the script should always print the new version, - # as we need to add it to $GITHUB_ENV variable. - echo "NEW_VERSION=$new_version" -} - -# This function logs the archive checksum and, if provided, compares it with -# the deposited checksum -# -# $1 is the package name e.g. 'acorn', 'ada', 'base64' etc. See the file -# https://github.com/nodejs/node/blob/main/doc/contributing/maintaining/maintaining-dependencies.md -# for a complete list of package name -# $2 is the downloaded archive -# $3 (optional) is the deposited sha256 checksum. When provided, it is checked -# against the checksum generated from the archive -log_and_verify_sha256sum() { - package_name="$1" - archive="$2" - checksum="$3" - bsd_formatted_checksum=$(shasum -a 256 --tag "$archive") - if [ -z "$3" ]; then - echo "$bsd_formatted_checksum" - else - archive_checksum=$(shasum -a 256 "$archive") - if [ "$checksum" = "$archive_checksum" ]; then - echo "Valid $package_name checksum" - echo "$bsd_formatted_checksum" - else - echo "ERROR - Invalid $package_name checksum:" - echo "deposited: $checksum" - echo "generated: $archive_checksum" - exit 1 - fi - fi -} - -# This function replaces the directory of a dependency with the new one. -replace_dir() { - old_dir="$1" - new_dir="$2" - rm -rf "$old_dir" - mv "$new_dir" "$old_dir" -} diff --git a/tools/doc/README.md b/tools/doc/README.md deleted file mode 100644 index df0e8aacfb3..00000000000 --- a/tools/doc/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# Documentation Tooling - -The Node.js API documentation tooling lives in [nodejs/doc-kit](https://github.com/nodejs/doc-kit). -This module exists just to make it usable in Node.js core, any changes to the tooling should be done in that repository. diff --git a/tools/doc/addon-verify.mjs b/tools/doc/addon-verify.mjs deleted file mode 100755 index 1338fd5ad74..00000000000 --- a/tools/doc/addon-verify.mjs +++ /dev/null @@ -1,107 +0,0 @@ -#!/usr/bin/env node - -// Extracts C++ addon examples from doc/api/addons.md into numbered test -// directories under test/addons/. -// -// Each code block to extract is preceded by a marker in the markdown: -// -// -// ```cpp -// #include -// ... -// ``` -// -// This produces test/addons/01_worker_support/addon.cc. -// Sections are numbered in order of first appearance. - -import { mkdirSync, writeFileSync } from 'node:fs'; -import { open } from 'node:fs/promises'; -import { join } from 'node:path'; -import { parseArgs } from 'node:util'; - -const { values } = parseArgs({ - options: { - input: { type: 'string' }, - output: { type: 'string' }, - }, -}); - -if (!values.input || !values.output) { - console.error('Usage: addon-verify.mjs --input --output
'); - process.exit(1); -} - -const src = await open(values.input, 'r'); - -const MARKER_RE = /^$/; - -const entries = []; -let nextBlockIsAddonVerifyFile = false; -let expectedClosingFenceMarker; -for await (const line of src.readLines()) { - if (expectedClosingFenceMarker) { - // We're inside a Addon snippet - if (line === expectedClosingFenceMarker) { - // End of the snippet - expectedClosingFenceMarker = null; - continue; - } - - entries.at(-1).contentRef.content += `${line}\n`; - } - if (nextBlockIsAddonVerifyFile) { - if (line) { - expectedClosingFenceMarker = line.replace(/\w/g, ''); - nextBlockIsAddonVerifyFile = false; - } - continue; - } - const match = MARKER_RE.exec(line); - if (match) { - nextBlockIsAddonVerifyFile = true; - const { filenames } = match.groups; - // Use a single contentRef for files with identical contents - const contentRef = { content: '' }; - for (const filename of filenames.split(/\s+/).filter(Boolean)) { - const [dir, name] = filename.split('/'); - entries.push({ dir, name, contentRef }); - } - } -} - -// Collect files grouped by section directory name. -const sections = Map.groupBy(entries, (e) => e.dir); - -let idx = 0; -for (const [name, files] of sections) { - const dirName = `${String(++idx).padStart(2, '0')}_${name}`; - const dir = join(values.output, dirName); - mkdirSync(dir, { recursive: true }); - - for (const file of files) { - let { content } = file.contentRef; - if (file.name === 'test.js') { - content = - "'use strict';\n" + - "const common = require('../../common');\n" + - content.replace( - "'./build/Release/addon'", - // eslint-disable-next-line no-template-curly-in-string - '`./build/${common.buildType}/addon`', - ); - } - writeFileSync(join(dir, file.name), content); - } - - // Generate binding.gyp - const names = files.map((f) => f.name); - writeFileSync(join(dir, 'binding.gyp'), JSON.stringify({ - targets: [{ - target_name: 'addon', - sources: names, - includes: ['../common.gypi'], - }], - })); - - console.log(`Generated ${dirName} with files: ${names.join(', ')}`); -} diff --git a/tools/doc/api-links.doc-kit.config.mjs b/tools/doc/api-links.doc-kit.config.mjs deleted file mode 100644 index 5039baceea4..00000000000 --- a/tools/doc/api-links.doc-kit.config.mjs +++ /dev/null @@ -1,17 +0,0 @@ -import { join } from 'node:path'; -import { pathToFileURL } from 'node:url'; - -const fromRoot = (path) => - pathToFileURL(join(import.meta.dirname, '..', '..', path)).href; - -export default { - extends: '@node-core/doc-kit/config', - - target: ['api-links'], - - global: { - input: ['lib/*.js'], - - changelog: fromRoot('CHANGELOG.md'), - }, -}; diff --git a/tools/doc/deprecationCodes.mjs b/tools/doc/deprecationCodes.mjs deleted file mode 100644 index b923e490b54..00000000000 --- a/tools/doc/deprecationCodes.mjs +++ /dev/null @@ -1,92 +0,0 @@ -import fs from 'fs'; -import { resolve } from 'path'; -import assert from 'assert'; - -import { unified } from 'unified'; -import remarkParse from 'remark-parse'; - -const source = resolve(process.argv[2]); - -const skipDeprecationComment = /^$/; - -const generateDeprecationCode = (codeAsNumber) => - `DEP${codeAsNumber.toString().padStart(4, '0')}`; - -const addMarkdownPathToErrorStack = (error, node) => { - const { line, column } = node.position.start; - const [header, ...lines] = error.stack.split('\n'); - error.stack = - header + - `\n at (${source}:${line}:${column})\n` + - lines.join('\n'); - return error; -}; - -const testHeading = (headingNode, expectedDeprecationCode) => { - try { - assert.strictEqual( - headingNode?.children[0]?.value.substring(0, 9), - `${expectedDeprecationCode}: `, - 'Ill-formed or out-of-order deprecation code.', - ); - } catch (e) { - throw addMarkdownPathToErrorStack(e, headingNode); - } -}; - -const testYAMLComment = (commentNode) => { - try { - assert.match( - commentNode?.value?.substring(0, 21), - /^ [key, prev, next] - if iterable is not None: - self |= iterable - - def __len__(self): - return len(self.map) - - def __contains__(self, key): - return key in self.map - - def add(self, key): - if key not in self.map: - end = self.end - curr = end[1] - curr[2] = end[1] = self.map[key] = [key, curr, end] - - def discard(self, key): - if key in self.map: - key, prev_item, next_item = self.map.pop(key) - prev_item[2] = next_item - next_item[1] = prev_item - - def __iter__(self): - end = self.end - curr = end[2] - while curr is not end: - yield curr[0] - curr = curr[2] - - def __reversed__(self): - end = self.end - curr = end[1] - while curr is not end: - yield curr[0] - curr = curr[1] - - # The second argument is an addition that causes a pylint warning. - def pop(self, last=True): # pylint: disable=W0221 - if not self: - raise KeyError("set is empty") - key = self.end[1][0] if last else self.end[2][0] - self.discard(key) - return key - - def __repr__(self): - if not self: - return f"{self.__class__.__name__}()" - return f"{self.__class__.__name__}({list(self)!r})" - - def __eq__(self, other): - if isinstance(other, OrderedSet): - return len(self) == len(other) and list(self) == list(other) - return set(self) == set(other) - - # Extensions to the recipe. - def update(self, iterable): - for i in iterable: - if i not in self: - self.add(i) - - -class CycleError(Exception): - """An exception raised when an unexpected cycle is detected.""" - - def __init__(self, nodes): - self.nodes = nodes - - def __str__(self): - return "CycleError: cycle involving: " + str(self.nodes) - - -def TopologicallySorted(graph, get_edges): - r"""Topologically sort based on a user provided edge definition. - - Args: - graph: A list of node names. - get_edges: A function mapping from node name to a hashable collection - of node names which this node has outgoing edges to. - Returns: - A list containing all of the node in graph in topological order. - It is assumed that calling get_edges once for each node and caching is - cheaper than repeatedly calling get_edges. - Raises: - CycleError in the event of a cycle. - Example: - graph = {'a': '$(b) $(c)', 'b': 'hi', 'c': '$(b)'} - def GetEdges(node): - return re.findall(r'\$\(([^))]\)', graph[node]) - print TopologicallySorted(graph.keys(), GetEdges) - ==> - ['a', 'c', b'] - """ - get_edges = memoize(get_edges) - visited = set() - visiting = set() - ordered_nodes = [] - - def Visit(node): - if node in visiting: - raise CycleError(visiting) - if node in visited: - return - visited.add(node) - visiting.add(node) - for neighbor in get_edges(node): - Visit(neighbor) - visiting.remove(node) - ordered_nodes.insert(0, node) - - for node in sorted(graph): - Visit(node) - return ordered_nodes - - -def CrossCompileRequested(): - # TODO: figure out how to not build extra host objects in the - # non-cross-compile case when this is enabled, and enable unconditionally. - return ( - os.environ.get("GYP_CROSSCOMPILE") - or os.environ.get("AR_host") - or os.environ.get("CC_host") - or os.environ.get("CXX_host") - or os.environ.get("AR_target") - or os.environ.get("CC_target") - or os.environ.get("CXX_target") - ) - - -def IsCygwin(): - try: - out = subprocess.Popen( - "uname", stdout=subprocess.PIPE, stderr=subprocess.STDOUT - ) - stdout = out.communicate()[0].decode("utf-8") - return "CYGWIN" in str(stdout) - except Exception: - return False diff --git a/tools/gyp/pylib/gyp/common_test.py b/tools/gyp/pylib/gyp/common_test.py deleted file mode 100755 index b5988816c04..00000000000 --- a/tools/gyp/pylib/gyp/common_test.py +++ /dev/null @@ -1,186 +0,0 @@ -#!/usr/bin/env python3 - -# Copyright (c) 2012 Google Inc. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Unit tests for the common.py file.""" - -import os -import subprocess -import sys -import unittest -from unittest.mock import MagicMock, patch - -import gyp.common - - -class TestTopologicallySorted(unittest.TestCase): - def test_Valid(self): - """Test that sorting works on a valid graph with one possible order.""" - graph = { - "a": ["b", "c"], - "b": [], - "c": ["d"], - "d": ["b"], - } - - def GetEdge(node): - return tuple(graph[node]) - - assert gyp.common.TopologicallySorted(graph.keys(), GetEdge) == [ - "a", - "c", - "d", - "b", - ] - - def test_Cycle(self): - """Test that an exception is thrown on a cyclic graph.""" - graph = { - "a": ["b"], - "b": ["c"], - "c": ["d"], - "d": ["a"], - } - - def GetEdge(node): - return tuple(graph[node]) - - self.assertRaises( - gyp.common.CycleError, gyp.common.TopologicallySorted, graph.keys(), GetEdge - ) - - -class TestGetFlavor(unittest.TestCase): - """Test that gyp.common.GetFlavor works as intended""" - - original_platform = "" - - def setUp(self): - self.original_platform = sys.platform - - def tearDown(self): - sys.platform = self.original_platform - - def assertFlavor(self, expected, argument, param): - sys.platform = argument - assert expected == gyp.common.GetFlavor(param) - - def test_platform_default(self): - self.assertFlavor("freebsd", "freebsd9", {}) - self.assertFlavor("freebsd", "freebsd10", {}) - self.assertFlavor("openbsd", "openbsd5", {}) - self.assertFlavor("solaris", "sunos5", {}) - self.assertFlavor("solaris", "sunos", {}) - self.assertFlavor("linux", "linux2", {}) - self.assertFlavor("linux", "linux3", {}) - self.assertFlavor("linux", "linux", {}) - - def test_param(self): - self.assertFlavor("foobar", "linux2", {"flavor": "foobar"}) - - class MockCommunicate: - def __init__(self, stdout): - self.stdout = stdout - - def decode(self, encoding): - return self.stdout - - @patch("os.close") - @patch("os.unlink") - @patch("tempfile.mkstemp") - def test_GetCompilerPredefines(self, mock_mkstemp, mock_unlink, mock_close): - mock_close.return_value = None - mock_unlink.return_value = None - mock_mkstemp.return_value = (0, "temp.c") - - def mock_run(env, defines_stdout, expected_cmd, throws=False): - with patch("subprocess.run") as mock_run: - expected_input = "temp.c" if sys.platform == "win32" else "/dev/null" - if throws: - mock_run.side_effect = subprocess.CalledProcessError( - returncode=1, - cmd=[*expected_cmd, "-dM", "-E", "-x", "c", expected_input], - ) - else: - mock_process = MagicMock() - mock_process.returncode = 0 - mock_process.stdout = TestGetFlavor.MockCommunicate(defines_stdout) - mock_run.return_value = mock_process - with patch.dict(os.environ, env): - try: - defines = gyp.common.GetCompilerPredefines() - except Exception as e: - self.fail(f"GetCompilerPredefines raised an exception: {e}") - flavor = gyp.common.GetFlavor({}) - if env.get("CC_target") or env.get("CC"): - mock_run.assert_called_with( - [*expected_cmd, "-dM", "-E", "-x", "c", expected_input], - shell=sys.platform == "win32", - capture_output=True, - check=True, - ) - return [defines, flavor] - - [defines0, _] = mock_run({"CC": "cl.exe"}, "", ["cl.exe"], True) - assert defines0 == {} - - [defines1, _] = mock_run({}, "", []) - assert defines1 == {} - - [defines2, flavor2] = mock_run( - {"CC_target": "/opt/wasi-sdk/bin/clang"}, - "#define __wasm__ 1\n#define __wasi__ 1\n", - ["/opt/wasi-sdk/bin/clang"], - ) - assert defines2 == {"__wasm__": "1", "__wasi__": "1"} - assert flavor2 == "wasi" - - [defines3, flavor3] = mock_run( - {"CC_target": "/opt/wasi-sdk/bin/clang --target=wasm32"}, - "#define __wasm__ 1\n", - ["/opt/wasi-sdk/bin/clang", "--target=wasm32"], - ) - assert defines3 == {"__wasm__": "1"} - assert flavor3 == "wasm" - - [defines4, flavor4] = mock_run( - {"CC_target": "/emsdk/upstream/emscripten/emcc"}, - "#define __EMSCRIPTEN__ 1\n", - ["/emsdk/upstream/emscripten/emcc"], - ) - assert defines4 == {"__EMSCRIPTEN__": "1"} - assert flavor4 == "emscripten" - - # Test path which include white space - [defines5, flavor5] = mock_run( - { - "CC_target": '"/Users/Toyo Li/wasi-sdk/bin/clang" -O3', - "CFLAGS": "--target=wasm32-wasi-threads -pthread", - }, - "#define __wasm__ 1\n#define __wasi__ 1\n#define _REENTRANT 1\n", - [ - "/Users/Toyo Li/wasi-sdk/bin/clang", - "-O3", - "--target=wasm32-wasi-threads", - "-pthread", - ], - ) - assert defines5 == {"__wasm__": "1", "__wasi__": "1", "_REENTRANT": "1"} - assert flavor5 == "wasi" - - original_sep = os.sep - os.sep = "\\" - [defines6, flavor6] = mock_run( - {"CC_target": '"C:\\Program Files\\wasi-sdk\\clang.exe"'}, - "#define __wasm__ 1\n#define __wasi__ 1\n", - ["C:/Program Files/wasi-sdk/clang.exe"], - ) - os.sep = original_sep - assert defines6 == {"__wasm__": "1", "__wasi__": "1"} - assert flavor6 == "wasi" - - -if __name__ == "__main__": - unittest.main() diff --git a/tools/gyp/pylib/gyp/easy_xml.py b/tools/gyp/pylib/gyp/easy_xml.py deleted file mode 100644 index a5d95153eca..00000000000 --- a/tools/gyp/pylib/gyp/easy_xml.py +++ /dev/null @@ -1,170 +0,0 @@ -# Copyright (c) 2011 Google Inc. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import locale -import os -import re -import sys -from functools import reduce - - -def XmlToString(content, encoding="utf-8", pretty=False): - """Writes the XML content to disk, touching the file only if it has changed. - - Visual Studio files have a lot of pre-defined structures. This function makes - it easy to represent these structures as Python data structures, instead of - having to create a lot of function calls. - - Each XML element of the content is represented as a list composed of: - 1. The name of the element, a string, - 2. The attributes of the element, a dictionary (optional), and - 3+. The content of the element, if any. Strings are simple text nodes and - lists are child elements. - - Example 1: - - becomes - ['test'] - - Example 2: - - This is - it! - - - becomes - ['myelement', {'a':'value1', 'b':'value2'}, - ['childtype', 'This is'], - ['childtype', 'it!'], - ] - - Args: - content: The structured content to be converted. - encoding: The encoding to report on the first XML line. - pretty: True if we want pretty printing with indents and new lines. - - Returns: - The XML content as a string. - """ - # We create a huge list of all the elements of the file. - xml_parts = ['' % encoding] - if pretty: - xml_parts.append("\n") - _ConstructContentList(xml_parts, content, pretty) - - # Convert it to a string - return "".join(xml_parts) - - -def _ConstructContentList(xml_parts, specification, pretty, level=0): - """Appends the XML parts corresponding to the specification. - - Args: - xml_parts: A list of XML parts to be appended to. - specification: The specification of the element. See EasyXml docs. - pretty: True if we want pretty printing with indents and new lines. - level: Indentation level. - """ - # The first item in a specification is the name of the element. - if pretty: - indentation = " " * level - new_line = "\n" - else: - indentation = "" - new_line = "" - name = specification[0] - if not isinstance(name, str): - raise Exception( - "The first item of an EasyXml specification should be " - "a string. Specification was " + str(specification) - ) - xml_parts.append(indentation + "<" + name) - - # Optionally in second position is a dictionary of the attributes. - rest = specification[1:] - if rest and isinstance(rest[0], dict): - for at, val in sorted(rest[0].items()): - xml_parts.append(f' {at}="{_XmlEscape(val, attr=True)}"') - rest = rest[1:] - if rest: - xml_parts.append(">") - all_strings = reduce(lambda x, y: x and isinstance(y, str), rest, True) - multi_line = not all_strings - if multi_line and new_line: - xml_parts.append(new_line) - for child_spec in rest: - # If it's a string, append a text node. - # Otherwise recurse over that child definition - if isinstance(child_spec, str): - xml_parts.append(_XmlEscape(child_spec)) - else: - _ConstructContentList(xml_parts, child_spec, pretty, level + 1) - if multi_line and indentation: - xml_parts.append(indentation) - xml_parts.append(f"{new_line}") - else: - xml_parts.append("/>%s" % new_line) - - -def WriteXmlIfChanged( - content, path, encoding="utf-8", pretty=False, win32=(sys.platform == "win32") -): - """Writes the XML content to disk, touching the file only if it has changed. - - Args: - content: The structured content to be written. - path: Location of the file. - encoding: The encoding to report on the first line of the XML file. - pretty: True if we want pretty printing with indents and new lines. - """ - xml_string = XmlToString(content, encoding, pretty) - if win32 and os.linesep != "\r\n": - xml_string = xml_string.replace("\n", "\r\n") - - try: # getdefaultlocale() was removed in Python 3.11 - default_encoding = locale.getdefaultlocale()[1] - except AttributeError: - default_encoding = locale.getencoding() - - if default_encoding and default_encoding.upper() != encoding.upper(): - xml_string = xml_string.encode(encoding) - - # Get the old content - try: - with open(path) as file: - existing = file.read() - except OSError: - existing = None - - # It has changed, write it - if existing != xml_string: - with open(path, "wb") as file: - file.write(xml_string) - - -_xml_escape_map = { - '"': """, - "'": "'", - "<": "<", - ">": ">", - "&": "&", - "\n": " ", - "\r": " ", -} - - -_xml_escape_re = re.compile("(%s)" % "|".join(map(re.escape, _xml_escape_map.keys()))) - - -def _XmlEscape(value, attr=False): - """Escape a string for inclusion in XML.""" - - def replace(match): - m = match.string[match.start() : match.end()] - # don't replace single quotes in attrs - if attr and m == "'": - return m - return _xml_escape_map[m] - - return _xml_escape_re.sub(replace, value) diff --git a/tools/gyp/pylib/gyp/easy_xml_test.py b/tools/gyp/pylib/gyp/easy_xml_test.py deleted file mode 100755 index 29f5dad5a6e..00000000000 --- a/tools/gyp/pylib/gyp/easy_xml_test.py +++ /dev/null @@ -1,113 +0,0 @@ -#!/usr/bin/env python3 - -# Copyright (c) 2011 Google Inc. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Unit tests for the easy_xml.py file.""" - -import unittest -from io import StringIO - -from gyp import easy_xml - - -class TestSequenceFunctions(unittest.TestCase): - def setUp(self): - self.stderr = StringIO() - - def test_EasyXml_simple(self): - self.assertEqual( - easy_xml.XmlToString(["test"]), - '', - ) - - self.assertEqual( - easy_xml.XmlToString(["test"], encoding="Windows-1252"), - '', - ) - - def test_EasyXml_simple_with_attributes(self): - self.assertEqual( - easy_xml.XmlToString(["test2", {"a": "value1", "b": "value2"}]), - '', - ) - - def test_EasyXml_escaping(self): - original = "'\"\r&\nfoo" - converted = "<test>'" & foo" - converted_apos = converted.replace("'", "'") - self.assertEqual( - easy_xml.XmlToString(["test3", {"a": original}, original]), - '%s' - % (converted, converted_apos), - ) - - def test_EasyXml_pretty(self): - self.assertEqual( - easy_xml.XmlToString( - ["test3", ["GrandParent", ["Parent1", ["Child"]], ["Parent2"]]], - pretty=True, - ), - '\n' - "\n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - "\n", - ) - - def test_EasyXml_complex(self): - # We want to create: - target = ( - '' - "" - '' - "{D2250C20-3A94-4FB9-AF73-11BC5B73884B}" - "Win32Proj" - "automated_ui_tests" - "" - '' - "' - "Application" - "Unicode" - "SpectreLoadCF" - "14.36.32532" - "" - "" - ) - - xml = easy_xml.XmlToString( - [ - "Project", - [ - "PropertyGroup", - {"Label": "Globals"}, - ["ProjectGuid", "{D2250C20-3A94-4FB9-AF73-11BC5B73884B}"], - ["Keyword", "Win32Proj"], - ["RootNamespace", "automated_ui_tests"], - ], - ["Import", {"Project": "$(VCTargetsPath)\\Microsoft.Cpp.props"}], - [ - "PropertyGroup", - { - "Condition": "'$(Configuration)|$(Platform)'=='Debug|Win32'", - "Label": "Configuration", - }, - ["ConfigurationType", "Application"], - ["CharacterSet", "Unicode"], - ["SpectreMitigation", "SpectreLoadCF"], - ["VCToolsVersion", "14.36.32532"], - ], - ] - ) - self.assertEqual(xml, target) - - -if __name__ == "__main__": - unittest.main() diff --git a/tools/gyp/pylib/gyp/flock_tool.py b/tools/gyp/pylib/gyp/flock_tool.py deleted file mode 100755 index 0754aff26fe..00000000000 --- a/tools/gyp/pylib/gyp/flock_tool.py +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/env python3 -# Copyright (c) 2011 Google Inc. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""These functions are executed via gyp-flock-tool when using the Makefile -generator. Used on systems that don't have a built-in flock.""" - -import fcntl -import os -import struct -import subprocess -import sys - - -def main(args): - executor = FlockTool() - executor.Dispatch(args) - - -class FlockTool: - """This class emulates the 'flock' command.""" - - def Dispatch(self, args): - """Dispatches a string command to a method.""" - if len(args) < 1: - raise Exception("Not enough arguments") - - method = "Exec%s" % self._CommandifyName(args[0]) - getattr(self, method)(*args[1:]) - - def _CommandifyName(self, name_string): - """Transforms a tool name like copy-info-plist to CopyInfoPlist""" - return name_string.title().replace("-", "") - - def ExecFlock(self, lockfile, *cmd_list): - """Emulates the most basic behavior of Linux's flock(1).""" - # Rely on exception handling to report errors. - # Note that the stock python on SunOS has a bug - # where fcntl.flock(fd, LOCK_EX) always fails - # with EBADF, that's why we use this F_SETLK - # hack instead. - fd = os.open(lockfile, os.O_WRONLY | os.O_NOCTTY | os.O_CREAT, 0o666) - if sys.platform.startswith("aix") or sys.platform == "os400": - # Python on AIX is compiled with LARGEFILE support, which changes the - # struct size. - op = struct.pack("hhIllqq", fcntl.F_WRLCK, 0, 0, 0, 0, 0, 0) - else: - op = struct.pack("hhllhhl", fcntl.F_WRLCK, 0, 0, 0, 0, 0, 0) - fcntl.fcntl(fd, fcntl.F_SETLK, op) - return subprocess.call(cmd_list) - - -if __name__ == "__main__": - sys.exit(main(sys.argv[1:])) diff --git a/tools/gyp/pylib/gyp/generator/__init__.py b/tools/gyp/pylib/gyp/generator/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/tools/gyp/pylib/gyp/generator/analyzer.py b/tools/gyp/pylib/gyp/generator/analyzer.py deleted file mode 100644 index 420c4e49ebc..00000000000 --- a/tools/gyp/pylib/gyp/generator/analyzer.py +++ /dev/null @@ -1,805 +0,0 @@ -# Copyright (c) 2014 Google Inc. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -""" -This script is intended for use as a GYP_GENERATOR. It takes as input (by way of -the generator flag config_path) the path of a json file that dictates the files -and targets to search for. The following keys are supported: -files: list of paths (relative) of the files to search for. -test_targets: unqualified target names to search for. Any target in this list -that depends upon a file in |files| is output regardless of the type of target -or chain of dependencies. -additional_compile_targets: Unqualified targets to search for in addition to -test_targets. Targets in the combined list that depend upon a file in |files| -are not necessarily output. For example, if the target is of type none then the -target is not output (but one of the descendants of the target will be). - -The following is output: -error: only supplied if there is an error. -compile_targets: minimal set of targets that directly or indirectly (for - targets of type none) depend on the files in |files| and is one of the - supplied targets or a target that one of the supplied targets depends on. - The expectation is this set of targets is passed into a build step. This list - always contains the output of test_targets as well. -test_targets: set of targets from the supplied |test_targets| that either - directly or indirectly depend upon a file in |files|. This list if useful - if additional processing needs to be done for certain targets after the - build, such as running tests. -status: outputs one of three values: none of the supplied files were found, - one of the include files changed so that it should be assumed everything - changed (in this case test_targets and compile_targets are not output) or at - least one file was found. -invalid_targets: list of supplied targets that were not found. - -Example: -Consider a graph like the following: - A D - / \ -B C -A depends upon both B and C, A is of type none and B and C are executables. -D is an executable, has no dependencies and nothing depends on it. -If |additional_compile_targets| = ["A"], |test_targets| = ["B", "C"] and -files = ["b.cc", "d.cc"] (B depends upon b.cc and D depends upon d.cc), then -the following is output: -|compile_targets| = ["B"] B must built as it depends upon the changed file b.cc -and the supplied target A depends upon it. A is not output as a build_target -as it is of type none with no rules and actions. -|test_targets| = ["B"] B directly depends upon the change file b.cc. - -Even though the file d.cc, which D depends upon, has changed D is not output -as it was not supplied by way of |additional_compile_targets| or |test_targets|. - -If the generator flag analyzer_output_path is specified, output is written -there. Otherwise output is written to stdout. - -In Gyp the "all" target is shorthand for the root targets in the files passed -to gyp. For example, if file "a.gyp" contains targets "a1" and -"a2", and file "b.gyp" contains targets "b1" and "b2" and "a2" has a dependency -on "b2" and gyp is supplied "a.gyp" then "all" consists of "a1" and "a2". -Notice that "b1" and "b2" are not in the "all" target as "b.gyp" was not -directly supplied to gyp. OTOH if both "a.gyp" and "b.gyp" are supplied to gyp -then the "all" target includes "b1" and "b2". -""" - -import json -import os -import posixpath - -import gyp.common - -debug = False - -found_dependency_string = "Found dependency" -no_dependency_string = "No dependencies" -# Status when it should be assumed that everything has changed. -all_changed_string = "Found dependency (all)" - -# MatchStatus is used indicate if and how a target depends upon the supplied -# sources. -# The target's sources contain one of the supplied paths. -MATCH_STATUS_MATCHES = 1 -# The target has a dependency on another target that contains one of the -# supplied paths. -MATCH_STATUS_MATCHES_BY_DEPENDENCY = 2 -# The target's sources weren't in the supplied paths and none of the target's -# dependencies depend upon a target that matched. -MATCH_STATUS_DOESNT_MATCH = 3 -# The target doesn't contain the source, but the dependent targets have not yet -# been visited to determine a more specific status yet. -MATCH_STATUS_TBD = 4 - -generator_supports_multiple_toolsets = gyp.common.CrossCompileRequested() - -generator_wants_static_library_dependencies_adjusted = False - -generator_default_variables = {} -for dirname in [ - "INTERMEDIATE_DIR", - "SHARED_INTERMEDIATE_DIR", - "PRODUCT_DIR", - "LIB_DIR", - "SHARED_LIB_DIR", -]: - generator_default_variables[dirname] = "!!!" - -for unused in [ - "RULE_INPUT_PATH", - "RULE_INPUT_ROOT", - "RULE_INPUT_NAME", - "RULE_INPUT_DIRNAME", - "RULE_INPUT_EXT", - "EXECUTABLE_PREFIX", - "EXECUTABLE_SUFFIX", - "STATIC_LIB_PREFIX", - "STATIC_LIB_SUFFIX", - "SHARED_LIB_PREFIX", - "SHARED_LIB_SUFFIX", - "CONFIGURATION_NAME", -]: - generator_default_variables[unused] = "" - - -def _ToGypPath(path): - """Converts a path to the format used by gyp.""" - if os.sep == "\\" and os.altsep == "/": - return path.replace("\\", "/") - return path - - -def _ResolveParent(path, base_path_components): - """Resolves |path|, which starts with at least one '../'. Returns an empty - string if the path shouldn't be considered. See _AddSources() for a - description of |base_path_components|.""" - depth = 0 - while path.startswith("../"): - depth += 1 - path = path[3:] - # Relative includes may go outside the source tree. For example, an action may - # have inputs in /usr/include, which are not in the source tree. - if depth > len(base_path_components): - return "" - if depth == len(base_path_components): - return path - return ( - "/".join(base_path_components[0 : len(base_path_components) - depth]) - + "/" - + path - ) - - -def _AddSources(sources, base_path, base_path_components, result): - """Extracts valid sources from |sources| and adds them to |result|. Each - source file is relative to |base_path|, but may contain '..'. To make - resolving '..' easier |base_path_components| contains each of the - directories in |base_path|. Additionally each source may contain variables. - Such sources are ignored as it is assumed dependencies on them are expressed - and tracked in some other means.""" - # NOTE: gyp paths are always posix style. - for source in sources: - if not len(source) or source.startswith(("!!!", "$")): - continue - # variable expansion may lead to //. - org_source = source - source = source[0] + source[1:].replace("//", "/") - if source.startswith("../"): - source = _ResolveParent(source, base_path_components) - if len(source): - result.append(source) - continue - result.append(base_path + source) - if debug: - print("AddSource", org_source, result[len(result) - 1]) - - -def _ExtractSourcesFromAction(action, base_path, base_path_components, results): - if "inputs" in action: - _AddSources(action["inputs"], base_path, base_path_components, results) - - -def _ToLocalPath(toplevel_dir, path): - """Converts |path| to a path relative to |toplevel_dir|.""" - if path == toplevel_dir: - return "" - if path.startswith(toplevel_dir + "/"): - return path[len(toplevel_dir) + len("/") :] - return path - - -def _ExtractSources(target, target_dict, toplevel_dir): - # |target| is either absolute or relative and in the format of the OS. Gyp - # source paths are always posix. Convert |target| to a posix path relative to - # |toplevel_dir_|. This is done to make it easy to build source paths. - base_path = posixpath.dirname(_ToLocalPath(toplevel_dir, _ToGypPath(target))) - base_path_components = base_path.split("/") - - # Add a trailing '/' so that _AddSources() can easily build paths. - if len(base_path): - base_path += "/" - - if debug: - print("ExtractSources", target, base_path) - - results = [] - if "sources" in target_dict: - _AddSources(target_dict["sources"], base_path, base_path_components, results) - # Include the inputs from any actions. Any changes to these affect the - # resulting output. - if "actions" in target_dict: - for action in target_dict["actions"]: - _ExtractSourcesFromAction(action, base_path, base_path_components, results) - if "rules" in target_dict: - for rule in target_dict["rules"]: - _ExtractSourcesFromAction(rule, base_path, base_path_components, results) - - return results - - -class Target: - """Holds information about a particular target: - deps: set of Targets this Target depends upon. This is not recursive, only the - direct dependent Targets. - match_status: one of the MatchStatus values. - back_deps: set of Targets that have a dependency on this Target. - visited: used during iteration to indicate whether we've visited this target. - This is used for two iterations, once in building the set of Targets and - again in _GetBuildTargets(). - name: fully qualified name of the target. - requires_build: True if the target type is such that it needs to be built. - See _DoesTargetTypeRequireBuild for details. - added_to_compile_targets: used when determining if the target was added to the - set of targets that needs to be built. - in_roots: true if this target is a descendant of one of the root nodes. - is_executable: true if the type of target is executable. - is_static_library: true if the type of target is static_library. - is_or_has_linked_ancestor: true if the target does a link (eg executable), or - if there is a target in back_deps that does a link.""" - - def __init__(self, name): - self.deps = set() - self.match_status = MATCH_STATUS_TBD - self.back_deps = set() - self.name = name - # TODO(sky): I don't like hanging this off Target. This state is specific - # to certain functions and should be isolated there. - self.visited = False - self.requires_build = False - self.added_to_compile_targets = False - self.in_roots = False - self.is_executable = False - self.is_static_library = False - self.is_or_has_linked_ancestor = False - - -class Config: - """Details what we're looking for - files: set of files to search for - targets: see file description for details.""" - - def __init__(self): - self.files = [] - self.targets = set() - self.additional_compile_target_names = set() - self.test_target_names = set() - - def Init(self, params): - """Initializes Config. This is a separate method as it raises an exception - if there is a parse error.""" - generator_flags = params.get("generator_flags", {}) - config_path = generator_flags.get("config_path", None) - if not config_path: - return - try: - f = open(config_path) - config = json.load(f) - f.close() - except OSError: - raise Exception("Unable to open file " + config_path) - except ValueError as e: - raise Exception("Unable to parse config file " + config_path + str(e)) - if not isinstance(config, dict): - raise Exception("config_path must be a JSON file containing a dictionary") - self.files = config.get("files", []) - self.additional_compile_target_names = set( - config.get("additional_compile_targets", []) - ) - self.test_target_names = set(config.get("test_targets", [])) - - -def _WasBuildFileModified(build_file, data, files, toplevel_dir): - """Returns true if the build file |build_file| is either in |files| or - one of the files included by |build_file| is in |files|. |toplevel_dir| is - the root of the source tree.""" - if _ToLocalPath(toplevel_dir, _ToGypPath(build_file)) in files: - if debug: - print("gyp file modified", build_file) - return True - - # First element of included_files is the file itself. - if len(data[build_file]["included_files"]) <= 1: - return False - - for include_file in data[build_file]["included_files"][1:]: - # |included_files| are relative to the directory of the |build_file|. - rel_include_file = _ToGypPath( - gyp.common.UnrelativePath(include_file, build_file) - ) - if _ToLocalPath(toplevel_dir, rel_include_file) in files: - if debug: - print( - "included gyp file modified, gyp_file=", - build_file, - "included file=", - rel_include_file, - ) - return True - return False - - -def _GetOrCreateTargetByName(targets, target_name): - """Creates or returns the Target at targets[target_name]. If there is no - Target for |target_name| one is created. Returns a tuple of whether a new - Target was created and the Target.""" - if target_name in targets: - return False, targets[target_name] - target = Target(target_name) - targets[target_name] = target - return True, target - - -def _DoesTargetTypeRequireBuild(target_dict): - """Returns true if the target type is such that it needs to be built.""" - # If a 'none' target has rules or actions we assume it requires a build. - return bool( - target_dict["type"] != "none" - or target_dict.get("actions") - or target_dict.get("rules") - ) - - -def _GenerateTargets(data, target_list, target_dicts, toplevel_dir, files, build_files): - """Returns a tuple of the following: - . A dictionary mapping from fully qualified name to Target. - . A list of the targets that have a source file in |files|. - . Targets that constitute the 'all' target. See description at top of file - for details on the 'all' target. - This sets the |match_status| of the targets that contain any of the source - files in |files| to MATCH_STATUS_MATCHES. - |toplevel_dir| is the root of the source tree.""" - # Maps from target name to Target. - name_to_target = {} - - # Targets that matched. - matching_targets = [] - - # Queue of targets to visit. - targets_to_visit = target_list[:] - - # Maps from build file to a boolean indicating whether the build file is in - # |files|. - build_file_in_files = {} - - # Root targets across all files. - roots = set() - - # Set of Targets in |build_files|. - build_file_targets = set() - - while len(targets_to_visit) > 0: - target_name = targets_to_visit.pop() - created_target, target = _GetOrCreateTargetByName(name_to_target, target_name) - if created_target: - roots.add(target) - elif target.visited: - continue - - target.visited = True - target.requires_build = _DoesTargetTypeRequireBuild(target_dicts[target_name]) - target_type = target_dicts[target_name]["type"] - target.is_executable = target_type == "executable" - target.is_static_library = target_type == "static_library" - target.is_or_has_linked_ancestor = target_type in { - "executable", - "shared_library", - } - - build_file = gyp.common.ParseQualifiedTarget(target_name)[0] - if build_file not in build_file_in_files: - build_file_in_files[build_file] = _WasBuildFileModified( - build_file, data, files, toplevel_dir - ) - - if build_file in build_files: - build_file_targets.add(target) - - # If a build file (or any of its included files) is modified we assume all - # targets in the file are modified. - if build_file_in_files[build_file]: - print("matching target from modified build file", target_name) - target.match_status = MATCH_STATUS_MATCHES - matching_targets.append(target) - else: - sources = _ExtractSources( - target_name, target_dicts[target_name], toplevel_dir - ) - for source in sources: - if _ToGypPath(os.path.normpath(source)) in files: - print("target", target_name, "matches", source) - target.match_status = MATCH_STATUS_MATCHES - matching_targets.append(target) - break - - # Add dependencies to visit as well as updating back pointers for deps. - for dep in target_dicts[target_name].get("dependencies", []): - targets_to_visit.append(dep) - - created_dep_target, dep_target = _GetOrCreateTargetByName( - name_to_target, dep - ) - if not created_dep_target: - roots.discard(dep_target) - - target.deps.add(dep_target) - dep_target.back_deps.add(target) - - return name_to_target, matching_targets, roots & build_file_targets - - -def _GetUnqualifiedToTargetMapping(all_targets, to_find): - """Returns a tuple of the following: - . mapping (dictionary) from unqualified name to Target for all the - Targets in |to_find|. - . any target names not found. If this is empty all targets were found.""" - result = {} - if not to_find: - return {}, [] - to_find = set(to_find) - for target_name in all_targets: - extracted = gyp.common.ParseQualifiedTarget(target_name) - if len(extracted) > 1 and extracted[1] in to_find: - to_find.remove(extracted[1]) - result[extracted[1]] = all_targets[target_name] - if not to_find: - return result, [] - return result, list(to_find) - - -def _DoesTargetDependOnMatchingTargets(target): - """Returns true if |target| or any of its dependencies is one of the - targets containing the files supplied as input to analyzer. This updates - |matches| of the Targets as it recurses. - target: the Target to look for.""" - if target.match_status == MATCH_STATUS_DOESNT_MATCH: - return False - if target.match_status in { - MATCH_STATUS_MATCHES, - MATCH_STATUS_MATCHES_BY_DEPENDENCY, - }: - return True - for dep in target.deps: - if _DoesTargetDependOnMatchingTargets(dep): - target.match_status = MATCH_STATUS_MATCHES_BY_DEPENDENCY - print("\t", target.name, "matches by dep", dep.name) - return True - target.match_status = MATCH_STATUS_DOESNT_MATCH - return False - - -def _GetTargetsDependingOnMatchingTargets(possible_targets): - """Returns the list of Targets in |possible_targets| that depend (either - directly on indirectly) on at least one of the targets containing the files - supplied as input to analyzer. - possible_targets: targets to search from.""" - found = [] - print("Targets that matched by dependency:") - for target in possible_targets: - if _DoesTargetDependOnMatchingTargets(target): - found.append(target) - return found - - -def _AddCompileTargets(target, roots, add_if_no_ancestor, result): - """Recurses through all targets that depend on |target|, adding all targets - that need to be built (and are in |roots|) to |result|. - roots: set of root targets. - add_if_no_ancestor: If true and there are no ancestors of |target| then add - |target| to |result|. |target| must still be in |roots|. - result: targets that need to be built are added here.""" - if target.visited: - return - - target.visited = True - target.in_roots = target in roots - - for back_dep_target in target.back_deps: - _AddCompileTargets(back_dep_target, roots, False, result) - target.added_to_compile_targets |= back_dep_target.added_to_compile_targets - target.in_roots |= back_dep_target.in_roots - target.is_or_has_linked_ancestor |= back_dep_target.is_or_has_linked_ancestor - - # Always add 'executable' targets. Even though they may be built by other - # targets that depend upon them it makes detection of what is going to be - # built easier. - # And always add static_libraries that have no dependencies on them from - # linkables. This is necessary as the other dependencies on them may be - # static libraries themselves, which are not compile time dependencies. - if target.in_roots and ( - target.is_executable - or ( - not target.added_to_compile_targets - and (add_if_no_ancestor or target.requires_build) - ) - or ( - target.is_static_library - and add_if_no_ancestor - and not target.is_or_has_linked_ancestor - ) - ): - print( - "\t\tadding to compile targets", - target.name, - "executable", - target.is_executable, - "added_to_compile_targets", - target.added_to_compile_targets, - "add_if_no_ancestor", - add_if_no_ancestor, - "requires_build", - target.requires_build, - "is_static_library", - target.is_static_library, - "is_or_has_linked_ancestor", - target.is_or_has_linked_ancestor, - ) - result.add(target) - target.added_to_compile_targets = True - - -def _GetCompileTargets(matching_targets, supplied_targets): - """Returns the set of Targets that require a build. - matching_targets: targets that changed and need to be built. - supplied_targets: set of targets supplied to analyzer to search from.""" - result = set() - for target in matching_targets: - print("finding compile targets for match", target.name) - _AddCompileTargets(target, supplied_targets, True, result) - return result - - -def _WriteOutput(params, **values): - """Writes the output, either to stdout or a file is specified.""" - if "error" in values: - print("Error:", values["error"]) - if "status" in values: - print(values["status"]) - if "targets" in values: - values["targets"].sort() - print("Supplied targets that depend on changed files:") - for target in values["targets"]: - print("\t", target) - if "invalid_targets" in values: - values["invalid_targets"].sort() - print("The following targets were not found:") - for target in values["invalid_targets"]: - print("\t", target) - if "build_targets" in values: - values["build_targets"].sort() - print("Targets that require a build:") - for target in values["build_targets"]: - print("\t", target) - if "compile_targets" in values: - values["compile_targets"].sort() - print("Targets that need to be built:") - for target in values["compile_targets"]: - print("\t", target) - if "test_targets" in values: - values["test_targets"].sort() - print("Test targets:") - for target in values["test_targets"]: - print("\t", target) - - output_path = params.get("generator_flags", {}).get("analyzer_output_path", None) - if not output_path: - print(json.dumps(values)) - return - try: - f = open(output_path, "w") - f.write(json.dumps(values) + "\n") - f.close() - except OSError as e: - print("Error writing to output file", output_path, str(e)) - - -def _WasGypIncludeFileModified(params, files): - """Returns true if one of the files in |files| is in the set of included - files.""" - if params["options"].includes: - for include in params["options"].includes: - if _ToGypPath(os.path.normpath(include)) in files: - print("Include file modified, assuming all changed", include) - return True - return False - - -def _NamesNotIn(names, mapping): - """Returns a list of the values in |names| that are not in |mapping|.""" - return [name for name in names if name not in mapping] - - -def _LookupTargets(names, mapping): - """Returns a list of the mapping[name] for each value in |names| that is in - |mapping|.""" - return [mapping[name] for name in names if name in mapping] - - -def CalculateVariables(default_variables, params): - """Calculate additional variables for use in the build (called by gyp).""" - flavor = gyp.common.GetFlavor(params) - if flavor == "mac": - default_variables.setdefault("OS", "mac") - elif flavor == "win": - default_variables.setdefault("OS", "win") - gyp.msvs_emulation.CalculateCommonVariables(default_variables, params) - else: - operating_system = flavor - if flavor == "android": - operating_system = "linux" # Keep this legacy behavior for now. - default_variables.setdefault("OS", operating_system) - - -class TargetCalculator: - """Calculates the matching test_targets and matching compile_targets.""" - - def __init__( - self, - files, - additional_compile_target_names, - test_target_names, - data, - target_list, - target_dicts, - toplevel_dir, - build_files, - ): - self._additional_compile_target_names = set(additional_compile_target_names) - self._test_target_names = set(test_target_names) - ( - self._name_to_target, - self._changed_targets, - self._root_targets, - ) = _GenerateTargets( - data, target_list, target_dicts, toplevel_dir, frozenset(files), build_files - ) - ( - self._unqualified_mapping, - self.invalid_targets, - ) = _GetUnqualifiedToTargetMapping( - self._name_to_target, self._supplied_target_names_no_all() - ) - - def _supplied_target_names(self): - return self._additional_compile_target_names | self._test_target_names - - def _supplied_target_names_no_all(self): - """Returns the supplied test targets without 'all'.""" - result = self._supplied_target_names() - result.discard("all") - return result - - def is_build_impacted(self): - """Returns true if the supplied files impact the build at all.""" - return self._changed_targets - - def find_matching_test_target_names(self): - """Returns the set of output test targets.""" - assert self.is_build_impacted() - # Find the test targets first. 'all' is special cased to mean all the - # root targets. To deal with all the supplied |test_targets| are expanded - # to include the root targets during lookup. If any of the root targets - # match, we remove it and replace it with 'all'. - test_target_names_no_all = set(self._test_target_names) - test_target_names_no_all.discard("all") - test_targets_no_all = _LookupTargets( - test_target_names_no_all, self._unqualified_mapping - ) - test_target_names_contains_all = "all" in self._test_target_names - if test_target_names_contains_all: - test_targets = list(set(test_targets_no_all) | set(self._root_targets)) - else: - test_targets = list(test_targets_no_all) - print("supplied test_targets") - for target_name in self._test_target_names: - print("\t", target_name) - print("found test_targets") - for target in test_targets: - print("\t", target.name) - print("searching for matching test targets") - matching_test_targets = _GetTargetsDependingOnMatchingTargets(test_targets) - matching_test_targets_contains_all = test_target_names_contains_all and set( - matching_test_targets - ) & set(self._root_targets) - if matching_test_targets_contains_all: - # Remove any of the targets for all that were not explicitly supplied, - # 'all' is subsequently added to the matching names below. - matching_test_targets = list( - set(matching_test_targets) & set(test_targets_no_all) - ) - print("matched test_targets") - for target in matching_test_targets: - print("\t", target.name) - matching_target_names = [ - gyp.common.ParseQualifiedTarget(target.name)[1] - for target in matching_test_targets - ] - if matching_test_targets_contains_all: - matching_target_names.append("all") - print("\tall") - return matching_target_names - - def find_matching_compile_target_names(self): - """Returns the set of output compile targets.""" - assert self.is_build_impacted() - # Compile targets are found by searching up from changed targets. - # Reset the visited status for _GetBuildTargets. - for target in self._name_to_target.values(): - target.visited = False - - supplied_targets = _LookupTargets( - self._supplied_target_names_no_all(), self._unqualified_mapping - ) - if "all" in self._supplied_target_names(): - supplied_targets = list(set(supplied_targets) | set(self._root_targets)) - print("Supplied test_targets & compile_targets") - for target in supplied_targets: - print("\t", target.name) - print("Finding compile targets") - compile_targets = _GetCompileTargets(self._changed_targets, supplied_targets) - return [ - gyp.common.ParseQualifiedTarget(target.name)[1] - for target in compile_targets - ] - - -def GenerateOutput(target_list, target_dicts, data, params): - """Called by gyp as the final stage. Outputs results.""" - config = Config() - try: - config.Init(params) - - if not config.files: - raise Exception( - "Must specify files to analyze via config_path generator flag" - ) - - toplevel_dir = _ToGypPath(os.path.abspath(params["options"].toplevel_dir)) - if debug: - print("toplevel_dir", toplevel_dir) - - if _WasGypIncludeFileModified(params, config.files): - result_dict = { - "status": all_changed_string, - "test_targets": list(config.test_target_names), - "compile_targets": list( - config.additional_compile_target_names | config.test_target_names - ), - } - _WriteOutput(params, **result_dict) - return - - calculator = TargetCalculator( - config.files, - config.additional_compile_target_names, - config.test_target_names, - data, - target_list, - target_dicts, - toplevel_dir, - params["build_files"], - ) - if not calculator.is_build_impacted(): - result_dict = { - "status": no_dependency_string, - "test_targets": [], - "compile_targets": [], - } - if calculator.invalid_targets: - result_dict["invalid_targets"] = calculator.invalid_targets - _WriteOutput(params, **result_dict) - return - - test_target_names = calculator.find_matching_test_target_names() - compile_target_names = calculator.find_matching_compile_target_names() - found_at_least_one_target = compile_target_names or test_target_names - result_dict = { - "test_targets": test_target_names, - "status": found_dependency_string - if found_at_least_one_target - else no_dependency_string, - "compile_targets": list(set(compile_target_names) | set(test_target_names)), - } - if calculator.invalid_targets: - result_dict["invalid_targets"] = calculator.invalid_targets - _WriteOutput(params, **result_dict) - - except Exception as e: - _WriteOutput(params, error=str(e)) diff --git a/tools/gyp/pylib/gyp/generator/android.py b/tools/gyp/pylib/gyp/generator/android.py deleted file mode 100644 index 5d5cae2afbf..00000000000 --- a/tools/gyp/pylib/gyp/generator/android.py +++ /dev/null @@ -1,1169 +0,0 @@ -# Copyright (c) 2012 Google Inc. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# Notes: -# -# This generates makefiles suitable for inclusion into the Android build system -# via an Android.mk file. It is based on make.py, the standard makefile -# generator. -# -# The code below generates a separate .mk file for each target, but -# all are sourced by the top-level GypAndroid.mk. This means that all -# variables in .mk-files clobber one another, and furthermore that any -# variables set potentially clash with other Android build system variables. -# Try to avoid setting global variables where possible. - - -import os -import re -import subprocess - -import gyp -import gyp.common -from gyp.generator import make # Reuse global functions from make backend. - -generator_default_variables = { - "OS": "android", - "EXECUTABLE_PREFIX": "", - "EXECUTABLE_SUFFIX": "", - "STATIC_LIB_PREFIX": "lib", - "SHARED_LIB_PREFIX": "lib", - "STATIC_LIB_SUFFIX": ".a", - "SHARED_LIB_SUFFIX": ".so", - "INTERMEDIATE_DIR": "$(gyp_intermediate_dir)", - "SHARED_INTERMEDIATE_DIR": "$(gyp_shared_intermediate_dir)", - "PRODUCT_DIR": "$(gyp_shared_intermediate_dir)", - "SHARED_LIB_DIR": "$(builddir)/lib.$(TOOLSET)", - "LIB_DIR": "$(obj).$(TOOLSET)", - "RULE_INPUT_ROOT": "%(INPUT_ROOT)s", # This gets expanded by Python. - "RULE_INPUT_DIRNAME": "%(INPUT_DIRNAME)s", # This gets expanded by Python. - "RULE_INPUT_PATH": "$(RULE_SOURCES)", - "RULE_INPUT_EXT": "$(suffix $<)", - "RULE_INPUT_NAME": "$(notdir $<)", - "CONFIGURATION_NAME": "$(GYP_CONFIGURATION)", -} - -# Make supports multiple toolsets -generator_supports_multiple_toolsets = True - - -# Generator-specific gyp specs. -generator_additional_non_configuration_keys = [ - # Boolean to declare that this target does not want its name mangled. - "android_unmangled_name", - # Map of android build system variables to set. - "aosp_build_settings", -] -generator_additional_path_sections = [] -generator_extra_sources_for_rules = [] - - -ALL_MODULES_FOOTER = """\ -# "gyp_all_modules" is a concatenation of the "gyp_all_modules" targets from -# all the included sub-makefiles. This is just here to clarify. -gyp_all_modules: -""" - -header = """\ -# This file is generated by gyp; do not edit. - -""" - -# Map gyp target types to Android module classes. -MODULE_CLASSES = { - "static_library": "STATIC_LIBRARIES", - "shared_library": "SHARED_LIBRARIES", - "executable": "EXECUTABLES", -} - - -def IsCPPExtension(ext): - return make.COMPILABLE_EXTENSIONS.get(ext) == "cxx" - - -def Sourceify(path): - """Convert a path to its source directory form. The Android backend does not - support options.generator_output, so this function is a noop.""" - return path - - -# Map from qualified target to path to output. -# For Android, the target of these maps is a tuple ('static', 'modulename'), -# ('dynamic', 'modulename'), or ('path', 'some/path') instead of a string, -# since we link by module. -target_outputs = {} -# Map from qualified target to any linkable output. A subset -# of target_outputs. E.g. when mybinary depends on liba, we want to -# include liba in the linker line; when otherbinary depends on -# mybinary, we just want to build mybinary first. -target_link_deps = {} - - -class AndroidMkWriter: - """AndroidMkWriter packages up the writing of one target-specific Android.mk. - - Its only real entry point is Write(), and is mostly used for namespacing. - """ - - def __init__(self, android_top_dir): - self.android_top_dir = android_top_dir - - def Write( - self, - qualified_target, - relative_target, - base_path, - output_filename, - spec, - configs, - part_of_all, - write_alias_target, - sdk_version, - ): - """The main entry point: writes a .mk file for a single target. - - Arguments: - qualified_target: target we're generating - relative_target: qualified target name relative to the root - base_path: path relative to source root we're building in, used to resolve - target-relative paths - output_filename: output .mk file name to write - spec, configs: gyp info - part_of_all: flag indicating this target is part of 'all' - write_alias_target: flag indicating whether to create short aliases for - this target - sdk_version: what to emit for LOCAL_SDK_VERSION in output - """ - gyp.common.EnsureDirExists(output_filename) - - self.fp = open(output_filename, "w") - - self.fp.write(header) - - self.qualified_target = qualified_target - self.relative_target = relative_target - self.path = base_path - self.target = spec["target_name"] - self.type = spec["type"] - self.toolset = spec["toolset"] - - deps, link_deps = self.ComputeDeps(spec) - - # Some of the generation below can add extra output, sources, or - # link dependencies. All of the out params of the functions that - # follow use names like extra_foo. - extra_outputs = [] - extra_sources = [] - - self.android_class = MODULE_CLASSES.get(self.type, "GYP") - self.android_module = self.ComputeAndroidModule(spec) - (self.android_stem, self.android_suffix) = self.ComputeOutputParts(spec) - self.output = self.output_binary = self.ComputeOutput(spec) - - # Standard header. - self.WriteLn("include $(CLEAR_VARS)\n") - - # Module class and name. - self.WriteLn("LOCAL_MODULE_CLASS := " + self.android_class) - self.WriteLn("LOCAL_MODULE := " + self.android_module) - # Only emit LOCAL_MODULE_STEM if it's different to LOCAL_MODULE. - # The library module classes fail if the stem is set. ComputeOutputParts - # makes sure that stem == modulename in these cases. - if self.android_stem != self.android_module: - self.WriteLn("LOCAL_MODULE_STEM := " + self.android_stem) - self.WriteLn("LOCAL_MODULE_SUFFIX := " + self.android_suffix) - if self.toolset == "host": - self.WriteLn("LOCAL_IS_HOST_MODULE := true") - self.WriteLn("LOCAL_MULTILIB := $(GYP_HOST_MULTILIB)") - elif sdk_version > 0: - self.WriteLn("LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH)") - self.WriteLn("LOCAL_SDK_VERSION := %s" % sdk_version) - - # Grab output directories; needed for Actions and Rules. - if self.toolset == "host": - self.WriteLn( - "gyp_intermediate_dir := " - "$(call local-intermediates-dir,,$(GYP_HOST_VAR_PREFIX))" - ) - else: - self.WriteLn( - "gyp_intermediate_dir := " - "$(call local-intermediates-dir,,$(GYP_VAR_PREFIX))" - ) - self.WriteLn( - "gyp_shared_intermediate_dir := " - "$(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX))" - ) - self.WriteLn() - - # List files this target depends on so that actions/rules/copies/sources - # can depend on the list. - # TODO: doesn't pull in things through transitive link deps; needed? - target_dependencies = [x[1] for x in deps if x[0] == "path"] - self.WriteLn("# Make sure our deps are built first.") - self.WriteList( - target_dependencies, "GYP_TARGET_DEPENDENCIES", local_pathify=True - ) - - # Actions must come first, since they can generate more OBJs for use below. - if "actions" in spec: - self.WriteActions(spec["actions"], extra_sources, extra_outputs) - - # Rules must be early like actions. - if "rules" in spec: - self.WriteRules(spec["rules"], extra_sources, extra_outputs) - - if "copies" in spec: - self.WriteCopies(spec["copies"], extra_outputs) - - # GYP generated outputs. - self.WriteList(extra_outputs, "GYP_GENERATED_OUTPUTS", local_pathify=True) - - # Set LOCAL_ADDITIONAL_DEPENDENCIES so that Android's build rules depend - # on both our dependency targets and our generated files. - self.WriteLn("# Make sure our deps and generated files are built first.") - self.WriteLn( - "LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) " - "$(GYP_GENERATED_OUTPUTS)" - ) - self.WriteLn() - - # Sources. - if spec.get("sources", []) or extra_sources: - self.WriteSources(spec, configs, extra_sources) - - self.WriteTarget( - spec, configs, deps, link_deps, part_of_all, write_alias_target - ) - - # Update global list of target outputs, used in dependency tracking. - target_outputs[qualified_target] = ("path", self.output_binary) - - # Update global list of link dependencies. - if self.type == "static_library": - target_link_deps[qualified_target] = ("static", self.android_module) - elif self.type == "shared_library": - target_link_deps[qualified_target] = ("shared", self.android_module) - - self.fp.close() - return self.android_module - - def WriteActions(self, actions, extra_sources, extra_outputs): - """Write Makefile code for any 'actions' from the gyp input. - - extra_sources: a list that will be filled in with newly generated source - files, if any - extra_outputs: a list that will be filled in with any outputs of these - actions (used to make other pieces dependent on these - actions) - """ - for action in actions: - name = make.StringToMakefileVariable( - "{}_{}".format(self.relative_target, action["action_name"]) - ) - self.WriteLn('### Rules for action "%s":' % action["action_name"]) - inputs = action["inputs"] - outputs = action["outputs"] - - # Build up a list of outputs. - # Collect the output dirs we'll need. - dirs = set() - for out in outputs: - if not out.startswith("$"): - print( - 'WARNING: Action for target "%s" writes output to local path ' - '"%s".' % (self.target, out) - ) - dir = os.path.split(out)[0] - if dir: - dirs.add(dir) - if int(action.get("process_outputs_as_sources", False)): - extra_sources += outputs - - # Prepare the actual command. - command = gyp.common.EncodePOSIXShellList(action["action"]) - if "message" in action: - quiet_cmd = "Gyp action: %s ($@)" % action["message"] - else: - quiet_cmd = "Gyp action: %s ($@)" % name - if len(dirs) > 0: - command = "mkdir -p %s" % " ".join(dirs) + "; " + command - - cd_action = "cd $(gyp_local_path)/%s; " % self.path - command = cd_action + command - - # The makefile rules are all relative to the top dir, but the gyp actions - # are defined relative to their containing dir. This replaces the gyp_* - # variables for the action rule with an absolute version so that the - # output goes in the right place. - # Only write the gyp_* rules for the "primary" output (:1); - # it's superfluous for the "extra outputs", and this avoids accidentally - # writing duplicate dummy rules for those outputs. - main_output = make.QuoteSpaces(self.LocalPathify(outputs[0])) - self.WriteLn("%s: gyp_local_path := $(LOCAL_PATH)" % main_output) - self.WriteLn("%s: gyp_var_prefix := $(GYP_VAR_PREFIX)" % main_output) - self.WriteLn( - "%s: gyp_intermediate_dir := " - "$(abspath $(gyp_intermediate_dir))" % main_output - ) - self.WriteLn( - "%s: gyp_shared_intermediate_dir := " - "$(abspath $(gyp_shared_intermediate_dir))" % main_output - ) - - # Android's envsetup.sh adds a number of directories to the path including - # the built host binary directory. This causes actions/rules invoked by - # gyp to sometimes use these instead of system versions, e.g. bison. - # The built host binaries may not be suitable, and can cause errors. - # So, we remove them from the PATH using the ANDROID_BUILD_PATHS variable - # set by envsetup. - self.WriteLn( - "%s: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))" - % main_output - ) - - # Don't allow spaces in input/output filenames, but make an exception for - # filenames which start with '$(' since it's okay for there to be spaces - # inside of make function/macro invocations. - for input in inputs: - if not input.startswith("$(") and " " in input: - raise gyp.common.GypError( - 'Action input filename "%s" in target %s contains a space' - % (input, self.target) - ) - for output in outputs: - if not output.startswith("$(") and " " in output: - raise gyp.common.GypError( - 'Action output filename "%s" in target %s contains a space' - % (output, self.target) - ) - - self.WriteLn( - "%s: %s $(GYP_TARGET_DEPENDENCIES)" - % (main_output, " ".join(map(self.LocalPathify, inputs))) - ) - self.WriteLn('\t@echo "%s"' % quiet_cmd) - self.WriteLn("\t$(hide)%s\n" % command) - for output in outputs[1:]: - # Make each output depend on the main output, with an empty command - # to force make to notice that the mtime has changed. - self.WriteLn(f"{self.LocalPathify(output)}: {main_output} ;") - - extra_outputs += outputs - self.WriteLn() - - self.WriteLn() - - def WriteRules(self, rules, extra_sources, extra_outputs): - """Write Makefile code for any 'rules' from the gyp input. - - extra_sources: a list that will be filled in with newly generated source - files, if any - extra_outputs: a list that will be filled in with any outputs of these - rules (used to make other pieces dependent on these rules) - """ - if len(rules) == 0: - return - - for rule in rules: - if len(rule.get("rule_sources", [])) == 0: - continue - name = make.StringToMakefileVariable( - "{}_{}".format(self.relative_target, rule["rule_name"]) - ) - self.WriteLn('\n### Generated for rule "%s":' % name) - self.WriteLn('# "%s":' % rule) - - inputs = rule.get("inputs") - for rule_source in rule.get("rule_sources", []): - (rule_source_dirname, rule_source_basename) = os.path.split(rule_source) - (rule_source_root, _rule_source_ext) = os.path.splitext( - rule_source_basename - ) - - outputs = [ - self.ExpandInputRoot(out, rule_source_root, rule_source_dirname) - for out in rule["outputs"] - ] - - dirs = set() - for out in outputs: - if not out.startswith("$"): - print( - "WARNING: Rule for target %s writes output to local path %s" - % (self.target, out) - ) - dir = os.path.dirname(out) - if dir: - dirs.add(dir) - extra_outputs += outputs - if int(rule.get("process_outputs_as_sources", False)): - extra_sources.extend(outputs) - - components = [] - for component in rule["action"]: - component = self.ExpandInputRoot( - component, rule_source_root, rule_source_dirname - ) - if "$(RULE_SOURCES)" in component: - component = component.replace("$(RULE_SOURCES)", rule_source) - components.append(component) - - command = gyp.common.EncodePOSIXShellList(components) - cd_action = "cd $(gyp_local_path)/%s; " % self.path - command = cd_action + command - if dirs: - command = "mkdir -p %s" % " ".join(dirs) + "; " + command - - # We set up a rule to build the first output, and then set up - # a rule for each additional output to depend on the first. - outputs = map(self.LocalPathify, outputs) - main_output = outputs[0] - self.WriteLn("%s: gyp_local_path := $(LOCAL_PATH)" % main_output) - self.WriteLn("%s: gyp_var_prefix := $(GYP_VAR_PREFIX)" % main_output) - self.WriteLn( - "%s: gyp_intermediate_dir := " - "$(abspath $(gyp_intermediate_dir))" % main_output - ) - self.WriteLn( - "%s: gyp_shared_intermediate_dir := " - "$(abspath $(gyp_shared_intermediate_dir))" % main_output - ) - - # See explanation in WriteActions. - self.WriteLn( - "%s: export PATH := " - "$(subst $(ANDROID_BUILD_PATHS),,$(PATH))" % main_output - ) - - main_output_deps = self.LocalPathify(rule_source) - if inputs: - main_output_deps += " " - main_output_deps += " ".join([self.LocalPathify(f) for f in inputs]) - - self.WriteLn( - "%s: %s $(GYP_TARGET_DEPENDENCIES)" - % (main_output, main_output_deps) - ) - self.WriteLn("\t%s\n" % command) - for output in outputs[1:]: - # Make each output depend on the main output, with an empty command - # to force make to notice that the mtime has changed. - self.WriteLn(f"{output}: {main_output} ;") - self.WriteLn() - - self.WriteLn() - - def WriteCopies(self, copies, extra_outputs): - """Write Makefile code for any 'copies' from the gyp input. - - extra_outputs: a list that will be filled in with any outputs of this action - (used to make other pieces dependent on this action) - """ - self.WriteLn("### Generated for copy rule.") - - variable = make.StringToMakefileVariable(self.relative_target + "_copies") - outputs = [] - for copy in copies: - for path in copy["files"]: - # The Android build system does not allow generation of files into the - # source tree. The destination should start with a variable, which will - # typically be $(gyp_intermediate_dir) or - # $(gyp_shared_intermediate_dir). Note that we can't use an assertion - # because some of the gyp tests depend on this. - if not copy["destination"].startswith("$"): - print( - "WARNING: Copy rule for target %s writes output to " - "local path %s" % (self.target, copy["destination"]) - ) - - # LocalPathify() calls normpath, stripping trailing slashes. - path = Sourceify(self.LocalPathify(path)) - filename = os.path.split(path)[1] - output = Sourceify( - self.LocalPathify(os.path.join(copy["destination"], filename)) - ) - - self.WriteLn(f"{output}: {path} $(GYP_TARGET_DEPENDENCIES) | $(ACP)") - self.WriteLn("\t@echo Copying: $@") - self.WriteLn("\t$(hide) mkdir -p $(dir $@)") - self.WriteLn("\t$(hide) $(ACP) -rpf $< $@") - self.WriteLn() - outputs.append(output) - self.WriteLn( - "{} = {}".format(variable, " ".join(map(make.QuoteSpaces, outputs))) - ) - extra_outputs.append("$(%s)" % variable) - self.WriteLn() - - def WriteSourceFlags(self, spec, configs): - """Write out the flags and include paths used to compile source files for - the current target. - - Args: - spec, configs: input from gyp. - """ - for configname, config in sorted(configs.items()): - extracted_includes = [] - - self.WriteLn("\n# Flags passed to both C and C++ files.") - cflags, includes_from_cflags = self.ExtractIncludesFromCFlags( - config.get("cflags", []) + config.get("cflags_c", []) - ) - extracted_includes.extend(includes_from_cflags) - self.WriteList(cflags, "MY_CFLAGS_%s" % configname) - - self.WriteList( - config.get("defines"), - "MY_DEFS_%s" % configname, - prefix="-D", - quoter=make.EscapeCppDefine, - ) - - self.WriteLn("\n# Include paths placed before CFLAGS/CPPFLAGS") - includes = list(config.get("include_dirs", [])) - includes.extend(extracted_includes) - includes = map(Sourceify, map(self.LocalPathify, includes)) - includes = self.NormalizeIncludePaths(includes) - self.WriteList(includes, "LOCAL_C_INCLUDES_%s" % configname) - - self.WriteLn("\n# Flags passed to only C++ (and not C) files.") - self.WriteList(config.get("cflags_cc"), "LOCAL_CPPFLAGS_%s" % configname) - - self.WriteLn( - "\nLOCAL_CFLAGS := $(MY_CFLAGS_$(GYP_CONFIGURATION)) " - "$(MY_DEFS_$(GYP_CONFIGURATION))" - ) - # Undefine ANDROID for host modules - # TODO: the source code should not use macro ANDROID to tell if it's host - # or target module. - if self.toolset == "host": - self.WriteLn("# Undefine ANDROID for host modules") - self.WriteLn("LOCAL_CFLAGS += -UANDROID") - self.WriteLn( - "LOCAL_C_INCLUDES := $(GYP_COPIED_SOURCE_ORIGIN_DIRS) " - "$(LOCAL_C_INCLUDES_$(GYP_CONFIGURATION))" - ) - self.WriteLn("LOCAL_CPPFLAGS := $(LOCAL_CPPFLAGS_$(GYP_CONFIGURATION))") - # Android uses separate flags for assembly file invocations, but gyp expects - # the same CFLAGS to be applied: - self.WriteLn("LOCAL_ASFLAGS := $(LOCAL_CFLAGS)") - - def WriteSources(self, spec, configs, extra_sources): - """Write Makefile code for any 'sources' from the gyp input. - These are source files necessary to build the current target. - We need to handle shared_intermediate directory source files as - a special case by copying them to the intermediate directory and - treating them as a generated sources. Otherwise the Android build - rules won't pick them up. - - Args: - spec, configs: input from gyp. - extra_sources: Sources generated from Actions or Rules. - """ - sources = filter(make.Compilable, spec.get("sources", [])) - generated_not_sources = [x for x in extra_sources if not make.Compilable(x)] - extra_sources = filter(make.Compilable, extra_sources) - - # Determine and output the C++ extension used by these sources. - # We simply find the first C++ file and use that extension. - all_sources = sources + extra_sources - local_cpp_extension = ".cpp" - for source in all_sources: - (root, ext) = os.path.splitext(source) - if IsCPPExtension(ext): - local_cpp_extension = ext - break - if local_cpp_extension != ".cpp": - self.WriteLn("LOCAL_CPP_EXTENSION := %s" % local_cpp_extension) - - # We need to move any non-generated sources that are coming from the - # shared intermediate directory out of LOCAL_SRC_FILES and put them - # into LOCAL_GENERATED_SOURCES. We also need to move over any C++ files - # that don't match our local_cpp_extension, since Android will only - # generate Makefile rules for a single LOCAL_CPP_EXTENSION. - local_files = [] - for source in sources: - (root, ext) = os.path.splitext(source) - if ( - "$(gyp_shared_intermediate_dir)" in source - or "$(gyp_intermediate_dir)" in source - or (IsCPPExtension(ext) and ext != local_cpp_extension) - ): - extra_sources.append(source) - else: - local_files.append(os.path.normpath(os.path.join(self.path, source))) - - # For any generated source, if it is coming from the shared intermediate - # directory then we add a Make rule to copy them to the local intermediate - # directory first. This is because the Android LOCAL_GENERATED_SOURCES - # must be in the local module intermediate directory for the compile rules - # to work properly. If the file has the wrong C++ extension, then we add - # a rule to copy that to intermediates and use the new version. - final_generated_sources = [] - # If a source file gets copied, we still need to add the original source - # directory as header search path, for GCC searches headers in the - # directory that contains the source file by default. - origin_src_dirs = [] - for source in extra_sources: - local_file = source - if "$(gyp_intermediate_dir)/" not in local_file: - basename = os.path.basename(local_file) - local_file = "$(gyp_intermediate_dir)/" + basename - (root, ext) = os.path.splitext(local_file) - if IsCPPExtension(ext) and ext != local_cpp_extension: - local_file = root + local_cpp_extension - if local_file != source: - self.WriteLn(f"{local_file}: {self.LocalPathify(source)}") - self.WriteLn("\tmkdir -p $(@D); cp $< $@") - origin_src_dirs.append(os.path.dirname(source)) - final_generated_sources.append(local_file) - - # We add back in all of the non-compilable stuff to make sure that the - # make rules have dependencies on them. - final_generated_sources.extend(generated_not_sources) - self.WriteList(final_generated_sources, "LOCAL_GENERATED_SOURCES") - - origin_src_dirs = gyp.common.uniquer(origin_src_dirs) - origin_src_dirs = map(Sourceify, map(self.LocalPathify, origin_src_dirs)) - self.WriteList(origin_src_dirs, "GYP_COPIED_SOURCE_ORIGIN_DIRS") - - self.WriteList(local_files, "LOCAL_SRC_FILES") - - # Write out the flags used to compile the source; this must be done last - # so that GYP_COPIED_SOURCE_ORIGIN_DIRS can be used as an include path. - self.WriteSourceFlags(spec, configs) - - def ComputeAndroidModule(self, spec): - """Return the Android module name used for a gyp spec. - - We use the complete qualified target name to avoid collisions between - duplicate targets in different directories. We also add a suffix to - distinguish gyp-generated module names. - """ - - if int(spec.get("android_unmangled_name", 0)): - assert self.type != "shared_library" or self.target.startswith("lib") - return self.target - - if self.type == "shared_library": - # For reasons of convention, the Android build system requires that all - # shared library modules are named 'libfoo' when generating -l flags. - prefix = "lib_" - else: - prefix = "" - - if spec["toolset"] == "host": - suffix = "_$(TARGET_$(GYP_VAR_PREFIX)ARCH)_host_gyp" - else: - suffix = "_gyp" - - if self.path: - middle = make.StringToMakefileVariable(f"{self.path}_{self.target}") - else: - middle = make.StringToMakefileVariable(self.target) - - return "".join([prefix, middle, suffix]) - - def ComputeOutputParts(self, spec): - """Return the 'output basename' of a gyp spec, split into filename + ext. - - Android libraries must be named the same thing as their module name, - otherwise the linker can't find them, so product_name and so on must be - ignored if we are building a library, and the "lib" prepending is - not done for Android. - """ - assert self.type != "loadable_module" # TODO: not supported? - - target = spec["target_name"] - target_prefix = "" - target_ext = "" - if self.type == "static_library": - target = self.ComputeAndroidModule(spec) - target_ext = ".a" - elif self.type == "shared_library": - target = self.ComputeAndroidModule(spec) - target_ext = ".so" - elif self.type == "none": - target_ext = ".stamp" - elif self.type != "executable": - print( - "ERROR: What output file should be generated?", - "type", - self.type, - "target", - target, - ) - - if self.type not in {"static_library", "shared_library"}: - target_prefix = spec.get("product_prefix", target_prefix) - target = spec.get("product_name", target) - product_ext = spec.get("product_extension") - if product_ext: - target_ext = "." + product_ext - - target_stem = target_prefix + target - return (target_stem, target_ext) - - def ComputeOutputBasename(self, spec): - """Return the 'output basename' of a gyp spec. - - E.g., the loadable module 'foobar' in directory 'baz' will produce - 'libfoobar.so' - """ - return "".join(self.ComputeOutputParts(spec)) - - def ComputeOutput(self, spec): - """Return the 'output' (full output path) of a gyp spec. - - E.g., the loadable module 'foobar' in directory 'baz' will produce - '$(obj)/baz/libfoobar.so' - """ - if self.type == "executable": - # We install host executables into shared_intermediate_dir so they can be - # run by gyp rules that refer to PRODUCT_DIR. - path = "$(gyp_shared_intermediate_dir)" - elif self.type == "shared_library": - if self.toolset == "host": - path = "$($(GYP_HOST_VAR_PREFIX)HOST_OUT_INTERMEDIATE_LIBRARIES)" - else: - path = "$($(GYP_VAR_PREFIX)TARGET_OUT_INTERMEDIATE_LIBRARIES)" - # Other targets just get built into their intermediate dir. - elif self.toolset == "host": - path = ( - "$(call intermediates-dir-for,%s,%s,true,," - "$(GYP_HOST_VAR_PREFIX))" % (self.android_class, self.android_module) - ) - else: - path = ( - f"$(call intermediates-dir-for,{self.android_class}," - f"{self.android_module},,,$(GYP_VAR_PREFIX))" - ) - - assert spec.get("product_dir") is None # TODO: not supported? - return os.path.join(path, self.ComputeOutputBasename(spec)) - - def NormalizeIncludePaths(self, include_paths): - """Normalize include_paths. - Convert absolute paths to relative to the Android top directory. - - Args: - include_paths: A list of unprocessed include paths. - Returns: - A list of normalized include paths. - """ - normalized = [] - for path in include_paths: - if path[0] == "/": - path = gyp.common.RelativePath(path, self.android_top_dir) - normalized.append(path) - return normalized - - def ExtractIncludesFromCFlags(self, cflags): - """Extract includes "-I..." out from cflags - - Args: - cflags: A list of compiler flags, which may be mixed with "-I.." - Returns: - A tuple of lists: (clean_cflags, include_paths). "-I.." is trimmed. - """ - clean_cflags = [] - include_paths = [] - for flag in cflags: - if flag.startswith("-I"): - include_paths.append(flag[2:]) - else: - clean_cflags.append(flag) - - return (clean_cflags, include_paths) - - def FilterLibraries(self, libraries): - """Filter the 'libraries' key to separate things that shouldn't be ldflags. - - Library entries that look like filenames should be converted to android - module names instead of being passed to the linker as flags. - - Args: - libraries: the value of spec.get('libraries') - Returns: - A tuple (static_lib_modules, dynamic_lib_modules, ldflags) - """ - static_lib_modules = [] - dynamic_lib_modules = [] - ldflags = [] - for libs in libraries: - # Libs can have multiple words. - for lib in libs.split(): - # Filter the system libraries, which are added by default by the Android - # build system. - if ( - lib == "-lc" - or lib == "-lstdc++" - or lib == "-lm" - or lib.endswith("libgcc.a") - ): - continue - match = re.search(r"([^/]+)\.a$", lib) - if match: - static_lib_modules.append(match.group(1)) - continue - match = re.search(r"([^/]+)\.so$", lib) - if match: - dynamic_lib_modules.append(match.group(1)) - continue - if lib.startswith("-l"): - ldflags.append(lib) - return (static_lib_modules, dynamic_lib_modules, ldflags) - - def ComputeDeps(self, spec): - """Compute the dependencies of a gyp spec. - - Returns a tuple (deps, link_deps), where each is a list of - filenames that will need to be put in front of make for either - building (deps) or linking (link_deps). - """ - deps = [] - link_deps = [] - if "dependencies" in spec: - deps.extend( - [ - target_outputs[dep] - for dep in spec["dependencies"] - if target_outputs[dep] - ] - ) - for dep in spec["dependencies"]: - if dep in target_link_deps: - link_deps.append(target_link_deps[dep]) - deps.extend(link_deps) - return (gyp.common.uniquer(deps), gyp.common.uniquer(link_deps)) - - def WriteTargetFlags(self, spec, configs, link_deps): - """Write Makefile code to specify the link flags and library dependencies. - - spec, configs: input from gyp. - link_deps: link dependency list; see ComputeDeps() - """ - # Libraries (i.e. -lfoo) - # These must be included even for static libraries as some of them provide - # implicit include paths through the build system. - libraries = gyp.common.uniquer(spec.get("libraries", [])) - static_libs, dynamic_libs, ldflags_libs = self.FilterLibraries(libraries) - - if self.type != "static_library": - for configname, config in sorted(configs.items()): - ldflags = list(config.get("ldflags", [])) - self.WriteLn("") - self.WriteList(ldflags, "LOCAL_LDFLAGS_%s" % configname) - self.WriteList(ldflags_libs, "LOCAL_GYP_LIBS") - self.WriteLn( - "LOCAL_LDFLAGS := $(LOCAL_LDFLAGS_$(GYP_CONFIGURATION)) " - "$(LOCAL_GYP_LIBS)" - ) - - # Link dependencies (i.e. other gyp targets this target depends on) - # These need not be included for static libraries as within the gyp build - # we do not use the implicit include path mechanism. - if self.type != "static_library": - static_link_deps = [x[1] for x in link_deps if x[0] == "static"] - shared_link_deps = [x[1] for x in link_deps if x[0] == "shared"] - else: - static_link_deps = [] - shared_link_deps = [] - - # Only write the lists if they are non-empty. - if static_libs or static_link_deps: - self.WriteLn("") - self.WriteList(static_libs + static_link_deps, "LOCAL_STATIC_LIBRARIES") - self.WriteLn("# Enable grouping to fix circular references") - self.WriteLn("LOCAL_GROUP_STATIC_LIBRARIES := true") - if dynamic_libs or shared_link_deps: - self.WriteLn("") - self.WriteList(dynamic_libs + shared_link_deps, "LOCAL_SHARED_LIBRARIES") - - def WriteTarget( - self, spec, configs, deps, link_deps, part_of_all, write_alias_target - ): - """Write Makefile code to produce the final target of the gyp spec. - - spec, configs: input from gyp. - deps, link_deps: dependency lists; see ComputeDeps() - part_of_all: flag indicating this target is part of 'all' - write_alias_target: flag indicating whether to create short aliases for this - target - """ - self.WriteLn("### Rules for final target.") - - if self.type != "none": - self.WriteTargetFlags(spec, configs, link_deps) - - if settings := spec.get("aosp_build_settings", {}): - self.WriteLn("### Set directly by aosp_build_settings.") - for k, v in settings.items(): - if isinstance(v, list): - self.WriteList(v, k) - else: - self.WriteLn(f"{k} := {make.QuoteIfNecessary(v)}") - self.WriteLn("") - - # Add to the set of targets which represent the gyp 'all' target. We use the - # name 'gyp_all_modules' as the Android build system doesn't allow the use - # of the Make target 'all' and because 'all_modules' is the equivalent of - # the Make target 'all' on Android. - if part_of_all and write_alias_target: - self.WriteLn('# Add target alias to "gyp_all_modules" target.') - self.WriteLn(".PHONY: gyp_all_modules") - self.WriteLn("gyp_all_modules: %s" % self.android_module) - self.WriteLn("") - - # Add an alias from the gyp target name to the Android module name. This - # simplifies manual builds of the target, and is required by the test - # framework. - if self.target != self.android_module and write_alias_target: - self.WriteLn("# Alias gyp target name.") - self.WriteLn(".PHONY: %s" % self.target) - self.WriteLn(f"{self.target}: {self.android_module}") - self.WriteLn("") - - # Add the command to trigger build of the target type depending - # on the toolset. Ex: BUILD_STATIC_LIBRARY vs. BUILD_HOST_STATIC_LIBRARY - # NOTE: This has to come last! - modifier = "" - if self.toolset == "host": - modifier = "HOST_" - if self.type == "static_library": - self.WriteLn("include $(BUILD_%sSTATIC_LIBRARY)" % modifier) - elif self.type == "shared_library": - self.WriteLn("LOCAL_PRELINK_MODULE := false") - self.WriteLn("include $(BUILD_%sSHARED_LIBRARY)" % modifier) - elif self.type == "executable": - self.WriteLn("LOCAL_CXX_STL := libc++_static") - # Executables are for build and test purposes only, so they're installed - # to a directory that doesn't get included in the system image. - self.WriteLn("LOCAL_MODULE_PATH := $(gyp_shared_intermediate_dir)") - self.WriteLn("include $(BUILD_%sEXECUTABLE)" % modifier) - else: - self.WriteLn("LOCAL_MODULE_PATH := $(PRODUCT_OUT)/gyp_stamp") - self.WriteLn("LOCAL_UNINSTALLABLE_MODULE := true") - if self.toolset == "target": - self.WriteLn("LOCAL_2ND_ARCH_VAR_PREFIX := $(GYP_VAR_PREFIX)") - else: - self.WriteLn("LOCAL_2ND_ARCH_VAR_PREFIX := $(GYP_HOST_VAR_PREFIX)") - self.WriteLn() - self.WriteLn("include $(BUILD_SYSTEM)/base_rules.mk") - self.WriteLn() - self.WriteLn("$(LOCAL_BUILT_MODULE): $(LOCAL_ADDITIONAL_DEPENDENCIES)") - self.WriteLn('\t$(hide) echo "Gyp timestamp: $@"') - self.WriteLn("\t$(hide) mkdir -p $(dir $@)") - self.WriteLn("\t$(hide) touch $@") - self.WriteLn() - self.WriteLn("LOCAL_2ND_ARCH_VAR_PREFIX :=") - - def WriteList( - self, - value_list, - variable=None, - prefix="", - quoter=make.QuoteIfNecessary, - local_pathify=False, - ): - """Write a variable definition that is a list of values. - - E.g. WriteList(['a','b'], 'foo', prefix='blah') writes out - foo = blaha blahb - but in a pretty-printed style. - """ - values = "" - if value_list: - value_list = [quoter(prefix + value) for value in value_list] - if local_pathify: - value_list = [self.LocalPathify(value) for value in value_list] - values = " \\\n\t" + " \\\n\t".join(value_list) - self.fp.write(f"{variable} :={values}\n\n") - - def WriteLn(self, text=""): - self.fp.write(text + "\n") - - def LocalPathify(self, path): - """Convert a subdirectory-relative path into a normalized path which starts - with the make variable $(LOCAL_PATH) (i.e. the top of the project tree). - Absolute paths, or paths that contain variables, are just normalized.""" - if "$(" in path or os.path.isabs(path): - # path is not a file in the project tree in this case, but calling - # normpath is still important for trimming trailing slashes. - return os.path.normpath(path) - local_path = os.path.join("$(LOCAL_PATH)", self.path, path) - local_path = os.path.normpath(local_path) - # Check that normalizing the path didn't ../ itself out of $(LOCAL_PATH) - # - i.e. that the resulting path is still inside the project tree. The - # path may legitimately have ended up containing just $(LOCAL_PATH), though, - # so we don't look for a slash. - assert local_path.startswith("$(LOCAL_PATH)"), ( - f"Path {path} attempts to escape from gyp path {self.path} !)" - ) - return local_path - - def ExpandInputRoot(self, template, expansion, dirname): - if "%(INPUT_ROOT)s" not in template and "%(INPUT_DIRNAME)s" not in template: - return template - path = template % { - "INPUT_ROOT": expansion, - "INPUT_DIRNAME": dirname, - } - return os.path.normpath(path) - - -def PerformBuild(data, configurations, params): - # The android backend only supports the default configuration. - options = params["options"] - makefile = os.path.abspath(os.path.join(options.toplevel_dir, "GypAndroid.mk")) - env = dict(os.environ) - env["ONE_SHOT_MAKEFILE"] = makefile - arguments = ["make", "-C", os.environ["ANDROID_BUILD_TOP"], "gyp_all_modules"] - print("Building: %s" % arguments) - subprocess.check_call(arguments, env=env) - - -def GenerateOutput(target_list, target_dicts, data, params): - options = params["options"] - generator_flags = params.get("generator_flags", {}) - limit_to_target_all = generator_flags.get("limit_to_target_all", False) - write_alias_targets = generator_flags.get("write_alias_targets", True) - sdk_version = generator_flags.get("aosp_sdk_version", 0) - android_top_dir = os.environ.get("ANDROID_BUILD_TOP") - assert android_top_dir, "$ANDROID_BUILD_TOP not set; you need to run lunch." - - def CalculateMakefilePath(build_file, base_name): - """Determine where to write a Makefile for a given gyp file.""" - # Paths in gyp files are relative to the .gyp file, but we want - # paths relative to the source root for the master makefile. Grab - # the path of the .gyp file as the base to relativize against. - # E.g. "foo/bar" when we're constructing targets for "foo/bar/baz.gyp". - base_path = gyp.common.RelativePath(os.path.dirname(build_file), options.depth) - # We write the file in the base_path directory. - output_file = os.path.join(options.depth, base_path, base_name) - assert not options.generator_output, ( - "The Android backend does not support options.generator_output." - ) - base_path = gyp.common.RelativePath( - os.path.dirname(build_file), options.toplevel_dir - ) - return base_path, output_file - - # TODO: search for the first non-'Default' target. This can go - # away when we add verification that all targets have the - # necessary configurations. - default_configuration = None - for target in target_list: - spec = target_dicts[target] - if spec["default_configuration"] != "Default": - default_configuration = spec["default_configuration"] - break - if not default_configuration: - default_configuration = "Default" - - makefile_name = "GypAndroid" + options.suffix + ".mk" - makefile_path = os.path.join(options.toplevel_dir, makefile_name) - assert not options.generator_output, ( - "The Android backend does not support options.generator_output." - ) - gyp.common.EnsureDirExists(makefile_path) - root_makefile = open(makefile_path, "w") - - root_makefile.write(header) - - # We set LOCAL_PATH just once, here, to the top of the project tree. This - # allows all the other paths we use to be relative to the Android.mk file, - # as the Android build system expects. - root_makefile.write("\nLOCAL_PATH := $(call my-dir)\n") - - # Find the list of targets that derive from the gyp file(s) being built. - needed_targets = set() - for build_file in params["build_files"]: - for target in gyp.common.AllTargets(target_list, target_dicts, build_file): - needed_targets.add(target) - - build_files = set() - include_list = set() - android_modules = {} - for qualified_target in target_list: - build_file, target, toolset = gyp.common.ParseQualifiedTarget(qualified_target) - relative_build_file = gyp.common.RelativePath(build_file, options.toplevel_dir) - build_files.add(relative_build_file) - included_files = data[build_file]["included_files"] - for included_file in included_files: - # The included_files entries are relative to the dir of the build file - # that included them, so we have to undo that and then make them relative - # to the root dir. - relative_include_file = gyp.common.RelativePath( - gyp.common.UnrelativePath(included_file, build_file), - options.toplevel_dir, - ) - abs_include_file = os.path.abspath(relative_include_file) - # If the include file is from the ~/.gyp dir, we should use absolute path - # so that relocating the src dir doesn't break the path. - if params["home_dot_gyp"] and abs_include_file.startswith( - params["home_dot_gyp"] - ): - build_files.add(abs_include_file) - else: - build_files.add(relative_include_file) - - base_path, output_file = CalculateMakefilePath( - build_file, target + "." + toolset + options.suffix + ".mk" - ) - - spec = target_dicts[qualified_target] - configs = spec["configurations"] - - part_of_all = qualified_target in needed_targets - if limit_to_target_all and not part_of_all: - continue - - relative_target = gyp.common.QualifiedTarget( - relative_build_file, target, toolset - ) - writer = AndroidMkWriter(android_top_dir) - android_module = writer.Write( - qualified_target, - relative_target, - base_path, - output_file, - spec, - configs, - part_of_all=part_of_all, - write_alias_target=write_alias_targets, - sdk_version=sdk_version, - ) - if android_module in android_modules: - print( - "ERROR: Android module names must be unique. The following " - "targets both generate Android module name %s.\n %s\n %s" - % (android_module, android_modules[android_module], qualified_target) - ) - return - android_modules[android_module] = qualified_target - - # Our root_makefile lives at the source root. Compute the relative path - # from there to the output_file for including. - mkfile_rel_path = gyp.common.RelativePath( - output_file, os.path.dirname(makefile_path) - ) - include_list.add(mkfile_rel_path) - - root_makefile.write("GYP_CONFIGURATION ?= %s\n" % default_configuration) - root_makefile.write("GYP_VAR_PREFIX ?=\n") - root_makefile.write("GYP_HOST_VAR_PREFIX ?=\n") - root_makefile.write("GYP_HOST_MULTILIB ?= first\n") - - # Write out the sorted list of includes. - root_makefile.write("\n") - for include_file in sorted(include_list): - root_makefile.write("include $(LOCAL_PATH)/" + include_file + "\n") - root_makefile.write("\n") - - if write_alias_targets: - root_makefile.write(ALL_MODULES_FOOTER) - - root_makefile.close() diff --git a/tools/gyp/pylib/gyp/generator/cmake.py b/tools/gyp/pylib/gyp/generator/cmake.py deleted file mode 100644 index dc9ea39acb7..00000000000 --- a/tools/gyp/pylib/gyp/generator/cmake.py +++ /dev/null @@ -1,1316 +0,0 @@ -# Copyright (c) 2013 Google Inc. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""cmake output module - -This module is under development and should be considered experimental. - -This module produces cmake (2.8.8+) input as its output. One CMakeLists.txt is -created for each configuration. - -This module's original purpose was to support editing in IDEs like KDevelop -which use CMake for project management. It is also possible to use CMake to -generate projects for other IDEs such as eclipse cdt and code::blocks. QtCreator -will convert the CMakeLists.txt to a code::blocks cbp for the editor to read, -but build using CMake. As a result QtCreator editor is unaware of compiler -defines. The generated CMakeLists.txt can also be used to build on Linux. There -is currently no support for building on platforms other than Linux. - -The generated CMakeLists.txt should properly compile all projects. However, -there is a mismatch between gyp and cmake with regard to linking. All attempts -are made to work around this, but CMake sometimes sees -Wl,--start-group as a -library and incorrectly repeats it. As a result the output of this generator -should not be relied on for building. - -When using with kdevelop, use version 4.4+. Previous versions of kdevelop will -not be able to find the header file directories described in the generated -CMakeLists.txt file. -""" - -import multiprocessing -import os -import signal -import subprocess - -import gyp.common -import gyp.xcode_emulation - -_maketrans = str.maketrans - -generator_default_variables = { - "EXECUTABLE_PREFIX": "", - "EXECUTABLE_SUFFIX": "", - "STATIC_LIB_PREFIX": "lib", - "STATIC_LIB_SUFFIX": ".a", - "SHARED_LIB_PREFIX": "lib", - "SHARED_LIB_SUFFIX": ".so", - "SHARED_LIB_DIR": "${builddir}/lib.${TOOLSET}", - "LIB_DIR": "${obj}.${TOOLSET}", - "INTERMEDIATE_DIR": "${obj}.${TOOLSET}/${TARGET}/geni", - "SHARED_INTERMEDIATE_DIR": "${obj}/gen", - "PRODUCT_DIR": "${builddir}", - "RULE_INPUT_PATH": "${RULE_INPUT_PATH}", - "RULE_INPUT_DIRNAME": "${RULE_INPUT_DIRNAME}", - "RULE_INPUT_NAME": "${RULE_INPUT_NAME}", - "RULE_INPUT_ROOT": "${RULE_INPUT_ROOT}", - "RULE_INPUT_EXT": "${RULE_INPUT_EXT}", - "CONFIGURATION_NAME": "${configuration}", -} - -FULL_PATH_VARS = ("${CMAKE_CURRENT_LIST_DIR}", "${builddir}", "${obj}") - -generator_supports_multiple_toolsets = True -generator_wants_static_library_dependencies_adjusted = True - -COMPILABLE_EXTENSIONS = { - ".c": "cc", - ".cc": "cxx", - ".cpp": "cxx", - ".cxx": "cxx", - ".s": "s", # cc - ".S": "s", # cc -} - - -def RemovePrefix(a, prefix): - """Returns 'a' without 'prefix' if it starts with 'prefix'.""" - return a[len(prefix) :] if a.startswith(prefix) else a - - -def CalculateVariables(default_variables, params): - """Calculate additional variables for use in the build (called by gyp).""" - default_variables.setdefault("OS", gyp.common.GetFlavor(params)) - - -def Compilable(filename): - """Return true if the file is compilable (should be in OBJS).""" - return any(filename.endswith(e) for e in COMPILABLE_EXTENSIONS) - - -def Linkable(filename): - """Return true if the file is linkable (should be on the link line).""" - return filename.endswith(".o") - - -def NormjoinPathForceCMakeSource(base_path, rel_path): - """Resolves rel_path against base_path and returns the result. - - If rel_path is an absolute path it is returned unchanged. - Otherwise it is resolved against base_path and normalized. - If the result is a relative path, it is forced to be relative to the - CMakeLists.txt. - """ - if os.path.isabs(rel_path): - return rel_path - if any(rel_path.startswith(var) for var in FULL_PATH_VARS): - return rel_path - # TODO: do we need to check base_path for absolute variables as well? - return os.path.join( - "${CMAKE_CURRENT_LIST_DIR}", os.path.normpath(os.path.join(base_path, rel_path)) - ) - - -def NormjoinPath(base_path, rel_path): - """Resolves rel_path against base_path and returns the result. - TODO: what is this really used for? - If rel_path begins with '$' it is returned unchanged. - Otherwise it is resolved against base_path if relative, then normalized. - """ - if rel_path.startswith("$") and not rel_path.startswith("${configuration}"): - return rel_path - return os.path.normpath(os.path.join(base_path, rel_path)) - - -def CMakeStringEscape(a): - """Escapes the string 'a' for use inside a CMake string. - - This means escaping - '\' otherwise it may be seen as modifying the next character - '"' otherwise it will end the string - ';' otherwise the string becomes a list - - The following do not need to be escaped - '#' when the lexer is in string state, this does not start a comment - - The following are yet unknown - '$' generator variables (like ${obj}) must not be escaped, - but text $ should be escaped - what is wanted is to know which $ come from generator variables - """ - return a.replace("\\", "\\\\").replace(";", "\\;").replace('"', '\\"') - - -def SetFileProperty(output, source_name, property_name, values, sep): - """Given a set of source file, sets the given property on them.""" - output.write("set_source_files_properties(") - output.write(source_name) - output.write(" PROPERTIES ") - output.write(property_name) - output.write(' "') - for value in values: - output.write(CMakeStringEscape(value)) - output.write(sep) - output.write('")\n') - - -def SetFilesProperty(output, variable, property_name, values, sep): - """Given a set of source files, sets the given property on them.""" - output.write("set_source_files_properties(") - WriteVariable(output, variable) - output.write(" PROPERTIES ") - output.write(property_name) - output.write(' "') - for value in values: - output.write(CMakeStringEscape(value)) - output.write(sep) - output.write('")\n') - - -def SetTargetProperty(output, target_name, property_name, values, sep=""): - """Given a target, sets the given property.""" - output.write("set_target_properties(") - output.write(target_name) - output.write(" PROPERTIES ") - output.write(property_name) - output.write(' "') - for value in values: - output.write(CMakeStringEscape(value)) - output.write(sep) - output.write('")\n') - - -def SetVariable(output, variable_name, value): - """Sets a CMake variable.""" - output.write("set(") - output.write(variable_name) - output.write(' "') - output.write(CMakeStringEscape(value)) - output.write('")\n') - - -def SetVariableList(output, variable_name, values): - """Sets a CMake variable to a list.""" - if not values: - return SetVariable(output, variable_name, "") - if len(values) == 1: - return SetVariable(output, variable_name, values[0]) - output.write("list(APPEND ") - output.write(variable_name) - output.write('\n "') - output.write('"\n "'.join([CMakeStringEscape(value) for value in values])) - output.write('")\n') - - -def UnsetVariable(output, variable_name): - """Unsets a CMake variable.""" - output.write("unset(") - output.write(variable_name) - output.write(")\n") - - -def WriteVariable(output, variable_name, prepend=None): - if prepend: - output.write(prepend) - output.write("${") - output.write(variable_name) - output.write("}") - - -class CMakeTargetType: - def __init__(self, command, modifier, property_modifier): - self.command = command - self.modifier = modifier - self.property_modifier = property_modifier - - -cmake_target_type_from_gyp_target_type = { - "executable": CMakeTargetType("add_executable", None, "RUNTIME"), - "static_library": CMakeTargetType("add_library", "STATIC", "ARCHIVE"), - "shared_library": CMakeTargetType("add_library", "SHARED", "LIBRARY"), - "loadable_module": CMakeTargetType("add_library", "MODULE", "LIBRARY"), - "none": CMakeTargetType("add_custom_target", "SOURCES", None), -} - - -def StringToCMakeTargetName(a): - """Converts the given string 'a' to a valid CMake target name. - - All invalid characters are replaced by '_'. - Invalid for cmake: ' ', '/', '(', ')', '"' - Invalid for make: ':' - Invalid for unknown reasons but cause failures: '.' - """ - return a.translate(_maketrans(' /():."', "_______")) - - -def WriteActions(target_name, actions, extra_sources, extra_deps, path_to_gyp, output): - """Write CMake for the 'actions' in the target. - - Args: - target_name: the name of the CMake target being generated. - actions: the Gyp 'actions' dict for this target. - extra_sources: [(, )] to append with generated source files. - extra_deps: [] to append with generated targets. - path_to_gyp: relative path from CMakeLists.txt being generated to - the Gyp file in which the target being generated is defined. - """ - for action in actions: - action_name = StringToCMakeTargetName(action["action_name"]) - action_target_name = f"{target_name}__{action_name}" - - inputs = action["inputs"] - inputs_name = action_target_name + "__input" - SetVariableList( - output, - inputs_name, - [NormjoinPathForceCMakeSource(path_to_gyp, dep) for dep in inputs], - ) - - outputs = action["outputs"] - cmake_outputs = [ - NormjoinPathForceCMakeSource(path_to_gyp, out) for out in outputs - ] - outputs_name = action_target_name + "__output" - SetVariableList(output, outputs_name, cmake_outputs) - - # Build up a list of outputs. - # Collect the output dirs we'll need. - dirs = {dir for dir in (os.path.dirname(o) for o in outputs) if dir} - - if int(action.get("process_outputs_as_sources", False)): - extra_sources.extend(zip(cmake_outputs, outputs)) - - # add_custom_command - output.write("add_custom_command(OUTPUT ") - WriteVariable(output, outputs_name) - output.write("\n") - - if len(dirs) > 0: - for directory in dirs: - output.write(" COMMAND ${CMAKE_COMMAND} -E make_directory ") - output.write(directory) - output.write("\n") - - output.write(" COMMAND ") - output.write(gyp.common.EncodePOSIXShellList(action["action"])) - output.write("\n") - - output.write(" DEPENDS ") - WriteVariable(output, inputs_name) - output.write("\n") - - output.write(" WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/") - output.write(path_to_gyp) - output.write("\n") - - output.write(" COMMENT ") - if "message" in action: - output.write(action["message"]) - else: - output.write(action_target_name) - output.write("\n") - - output.write(" VERBATIM\n") - output.write(")\n") - - # add_custom_target - output.write("add_custom_target(") - output.write(action_target_name) - output.write("\n DEPENDS ") - WriteVariable(output, outputs_name) - output.write("\n SOURCES ") - WriteVariable(output, inputs_name) - output.write("\n)\n") - - extra_deps.append(action_target_name) - - -def NormjoinRulePathForceCMakeSource(base_path, rel_path, rule_source): - if rel_path.startswith(("${RULE_INPUT_PATH}", "${RULE_INPUT_DIRNAME}")): - if any(rule_source.startswith(var) for var in FULL_PATH_VARS): - return rel_path - return NormjoinPathForceCMakeSource(base_path, rel_path) - - -def WriteRules(target_name, rules, extra_sources, extra_deps, path_to_gyp, output): - """Write CMake for the 'rules' in the target. - - Args: - target_name: the name of the CMake target being generated. - actions: the Gyp 'actions' dict for this target. - extra_sources: [(, )] to append with generated source files. - extra_deps: [] to append with generated targets. - path_to_gyp: relative path from CMakeLists.txt being generated to - the Gyp file in which the target being generated is defined. - """ - for rule in rules: - rule_name = StringToCMakeTargetName(target_name + "__" + rule["rule_name"]) - - inputs = rule.get("inputs", []) - inputs_name = rule_name + "__input" - SetVariableList( - output, - inputs_name, - [NormjoinPathForceCMakeSource(path_to_gyp, dep) for dep in inputs], - ) - outputs = rule["outputs"] - var_outputs = [] - - for count, rule_source in enumerate(rule.get("rule_sources", [])): - action_name = rule_name + "_" + str(count) - - rule_source_dirname, rule_source_basename = os.path.split(rule_source) - rule_source_root, rule_source_ext = os.path.splitext(rule_source_basename) - - SetVariable(output, "RULE_INPUT_PATH", rule_source) - SetVariable(output, "RULE_INPUT_DIRNAME", rule_source_dirname) - SetVariable(output, "RULE_INPUT_NAME", rule_source_basename) - SetVariable(output, "RULE_INPUT_ROOT", rule_source_root) - SetVariable(output, "RULE_INPUT_EXT", rule_source_ext) - - # Build up a list of outputs. - # Collect the output dirs we'll need. - dirs = {dir for dir in (os.path.dirname(o) for o in outputs) if dir} - - # Create variables for the output, as 'local' variable will be unset. - these_outputs = [] - for output_index, out in enumerate(outputs): - output_name = action_name + "_" + str(output_index) - SetVariable( - output, - output_name, - NormjoinRulePathForceCMakeSource(path_to_gyp, out, rule_source), - ) - if int(rule.get("process_outputs_as_sources", False)): - extra_sources.append(("${" + output_name + "}", out)) - these_outputs.append("${" + output_name + "}") - var_outputs.append("${" + output_name + "}") - - # add_custom_command - output.write("add_custom_command(OUTPUT\n") - for out in these_outputs: - output.write(" ") - output.write(out) - output.write("\n") - - for directory in dirs: - output.write(" COMMAND ${CMAKE_COMMAND} -E make_directory ") - output.write(directory) - output.write("\n") - - output.write(" COMMAND ") - output.write(gyp.common.EncodePOSIXShellList(rule["action"])) - output.write("\n") - - output.write(" DEPENDS ") - WriteVariable(output, inputs_name) - output.write(" ") - output.write(NormjoinPath(path_to_gyp, rule_source)) - output.write("\n") - - # CMAKE_CURRENT_LIST_DIR is where the CMakeLists.txt lives. - # The cwd is the current build directory. - output.write(" WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/") - output.write(path_to_gyp) - output.write("\n") - - output.write(" COMMENT ") - if "message" in rule: - output.write(rule["message"]) - else: - output.write(action_name) - output.write("\n") - - output.write(" VERBATIM\n") - output.write(")\n") - - UnsetVariable(output, "RULE_INPUT_PATH") - UnsetVariable(output, "RULE_INPUT_DIRNAME") - UnsetVariable(output, "RULE_INPUT_NAME") - UnsetVariable(output, "RULE_INPUT_ROOT") - UnsetVariable(output, "RULE_INPUT_EXT") - - # add_custom_target - output.write("add_custom_target(") - output.write(rule_name) - output.write(" DEPENDS\n") - for out in var_outputs: - output.write(" ") - output.write(out) - output.write("\n") - output.write("SOURCES ") - WriteVariable(output, inputs_name) - output.write("\n") - for rule_source in rule.get("rule_sources", []): - output.write(" ") - output.write(NormjoinPath(path_to_gyp, rule_source)) - output.write("\n") - output.write(")\n") - - extra_deps.append(rule_name) - - -def WriteCopies(target_name, copies, extra_deps, path_to_gyp, output): - """Write CMake for the 'copies' in the target. - - Args: - target_name: the name of the CMake target being generated. - actions: the Gyp 'actions' dict for this target. - extra_deps: [] to append with generated targets. - path_to_gyp: relative path from CMakeLists.txt being generated to - the Gyp file in which the target being generated is defined. - """ - copy_name = target_name + "__copies" - - # CMake gets upset with custom targets with OUTPUT which specify no output. - have_copies = any(copy["files"] for copy in copies) - if not have_copies: - output.write("add_custom_target(") - output.write(copy_name) - output.write(")\n") - extra_deps.append(copy_name) - return - - class Copy: - def __init__(self, ext, command): - self.cmake_inputs = [] - self.cmake_outputs = [] - self.gyp_inputs = [] - self.gyp_outputs = [] - self.ext = ext - self.inputs_name = None - self.outputs_name = None - self.command = command - - file_copy = Copy("", "copy") - dir_copy = Copy("_dirs", "copy_directory") - - for copy in copies: - files = copy["files"] - destination = copy["destination"] - for src in files: - path = os.path.normpath(src) - basename = os.path.split(path)[1] - dst = os.path.join(destination, basename) - - copy = file_copy if os.path.basename(src) else dir_copy - - copy.cmake_inputs.append(NormjoinPathForceCMakeSource(path_to_gyp, src)) - copy.cmake_outputs.append(NormjoinPathForceCMakeSource(path_to_gyp, dst)) - copy.gyp_inputs.append(src) - copy.gyp_outputs.append(dst) - - for copy in (file_copy, dir_copy): - if copy.cmake_inputs: - copy.inputs_name = copy_name + "__input" + copy.ext - SetVariableList(output, copy.inputs_name, copy.cmake_inputs) - - copy.outputs_name = copy_name + "__output" + copy.ext - SetVariableList(output, copy.outputs_name, copy.cmake_outputs) - - # add_custom_command - output.write("add_custom_command(\n") - - output.write("OUTPUT") - for copy in (file_copy, dir_copy): - if copy.outputs_name: - WriteVariable(output, copy.outputs_name, " ") - output.write("\n") - - for copy in (file_copy, dir_copy): - for src, dst in zip(copy.gyp_inputs, copy.gyp_outputs): - # 'cmake -E copy src dst' will create the 'dst' directory if needed. - output.write("COMMAND ${CMAKE_COMMAND} -E %s " % copy.command) - output.write(src) - output.write(" ") - output.write(dst) - output.write("\n") - - output.write("DEPENDS") - for copy in (file_copy, dir_copy): - if copy.inputs_name: - WriteVariable(output, copy.inputs_name, " ") - output.write("\n") - - output.write("WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/") - output.write(path_to_gyp) - output.write("\n") - - output.write("COMMENT Copying for ") - output.write(target_name) - output.write("\n") - - output.write("VERBATIM\n") - output.write(")\n") - - # add_custom_target - output.write("add_custom_target(") - output.write(copy_name) - output.write("\n DEPENDS") - for copy in (file_copy, dir_copy): - if copy.outputs_name: - WriteVariable(output, copy.outputs_name, " ") - output.write("\n SOURCES") - if file_copy.inputs_name: - WriteVariable(output, file_copy.inputs_name, " ") - output.write("\n)\n") - - extra_deps.append(copy_name) - - -def CreateCMakeTargetBaseName(qualified_target): - """This is the name we would like the target to have.""" - _, gyp_target_name, gyp_target_toolset = gyp.common.ParseQualifiedTarget( - qualified_target - ) - cmake_target_base_name = gyp_target_name - if gyp_target_toolset and gyp_target_toolset != "target": - cmake_target_base_name += "_" + gyp_target_toolset - return StringToCMakeTargetName(cmake_target_base_name) - - -def CreateCMakeTargetFullName(qualified_target): - """An unambiguous name for the target.""" - gyp_file, gyp_target_name, gyp_target_toolset = gyp.common.ParseQualifiedTarget( - qualified_target - ) - cmake_target_full_name = gyp_file + ":" + gyp_target_name - if gyp_target_toolset and gyp_target_toolset != "target": - cmake_target_full_name += "_" + gyp_target_toolset - return StringToCMakeTargetName(cmake_target_full_name) - - -class CMakeNamer: - """Converts Gyp target names into CMake target names. - - CMake requires that target names be globally unique. One way to ensure - this is to fully qualify the names of the targets. Unfortunately, this - ends up with all targets looking like "chrome_chrome_gyp_chrome" instead - of just "chrome". If this generator were only interested in building, it - would be possible to fully qualify all target names, then create - unqualified target names which depend on all qualified targets which - should have had that name. This is more or less what the 'make' generator - does with aliases. However, one goal of this generator is to create CMake - files for use with IDEs, and fully qualified names are not as user - friendly. - - Since target name collision is rare, we do the above only when required. - - Toolset variants are always qualified from the base, as this is required for - building. However, it also makes sense for an IDE, as it is possible for - defines to be different. - """ - - def __init__(self, target_list): - self.cmake_target_base_names_conflicting = set() - - cmake_target_base_names_seen = set() - for qualified_target in target_list: - cmake_target_base_name = CreateCMakeTargetBaseName(qualified_target) - - if cmake_target_base_name not in cmake_target_base_names_seen: - cmake_target_base_names_seen.add(cmake_target_base_name) - else: - self.cmake_target_base_names_conflicting.add(cmake_target_base_name) - - def CreateCMakeTargetName(self, qualified_target): - base_name = CreateCMakeTargetBaseName(qualified_target) - if base_name in self.cmake_target_base_names_conflicting: - return CreateCMakeTargetFullName(qualified_target) - return base_name - - -def WriteTarget( - namer, - qualified_target, - target_dicts, - build_dir, - config_to_use, - options, - generator_flags, - all_qualified_targets, - flavor, - output, -): - # The make generator does this always. - # TODO: It would be nice to be able to tell CMake all dependencies. - circular_libs = generator_flags.get("circular", True) - - if not generator_flags.get("standalone", False): - output.write("\n#") - output.write(qualified_target) - output.write("\n") - - gyp_file, _, _ = gyp.common.ParseQualifiedTarget(qualified_target) - rel_gyp_file = gyp.common.RelativePath(gyp_file, options.toplevel_dir) - rel_gyp_dir = os.path.dirname(rel_gyp_file) - - # Relative path from build dir to top dir. - build_to_top = gyp.common.InvertRelativePath(build_dir, options.toplevel_dir) - # Relative path from build dir to gyp dir. - build_to_gyp = os.path.join(build_to_top, rel_gyp_dir) - - path_from_cmakelists_to_gyp = build_to_gyp - - spec = target_dicts.get(qualified_target, {}) - config = spec.get("configurations", {}).get(config_to_use, {}) - - xcode_settings = None - if flavor == "mac": - xcode_settings = gyp.xcode_emulation.XcodeSettings(spec) - - target_name = spec.get("target_name", "") - target_type = spec.get("type", "") - target_toolset = spec.get("toolset") - - cmake_target_type = cmake_target_type_from_gyp_target_type.get(target_type) - if cmake_target_type is None: - print( - "Target %s has unknown target type %s, skipping." - % (target_name, target_type) - ) - return - - SetVariable(output, "TARGET", target_name) - SetVariable(output, "TOOLSET", target_toolset) - - cmake_target_name = namer.CreateCMakeTargetName(qualified_target) - - extra_sources = [] - extra_deps = [] - - # Actions must come first, since they can generate more OBJs for use below. - if "actions" in spec: - WriteActions( - cmake_target_name, - spec["actions"], - extra_sources, - extra_deps, - path_from_cmakelists_to_gyp, - output, - ) - - # Rules must be early like actions. - if "rules" in spec: - WriteRules( - cmake_target_name, - spec["rules"], - extra_sources, - extra_deps, - path_from_cmakelists_to_gyp, - output, - ) - - # Copies - if "copies" in spec: - WriteCopies( - cmake_target_name, - spec["copies"], - extra_deps, - path_from_cmakelists_to_gyp, - output, - ) - - # Target and sources - srcs = spec.get("sources", []) - - # Gyp separates the sheep from the goats based on file extensions. - # A full separation is done here because of flag handing (see below). - s_sources = [] - c_sources = [] - cxx_sources = [] - linkable_sources = [] - other_sources = [] - for src in srcs: - _, ext = os.path.splitext(src) - src_type = COMPILABLE_EXTENSIONS.get(ext, None) - src_norm_path = NormjoinPath(path_from_cmakelists_to_gyp, src) - - if src_type == "s": - s_sources.append(src_norm_path) - elif src_type == "cc": - c_sources.append(src_norm_path) - elif src_type == "cxx": - cxx_sources.append(src_norm_path) - elif Linkable(ext): - linkable_sources.append(src_norm_path) - else: - other_sources.append(src_norm_path) - - for extra_source in extra_sources: - src, real_source = extra_source - _, ext = os.path.splitext(real_source) - src_type = COMPILABLE_EXTENSIONS.get(ext, None) - - if src_type == "s": - s_sources.append(src) - elif src_type == "cc": - c_sources.append(src) - elif src_type == "cxx": - cxx_sources.append(src) - elif Linkable(ext): - linkable_sources.append(src) - else: - other_sources.append(src) - - s_sources_name = None - if s_sources: - s_sources_name = cmake_target_name + "__asm_srcs" - SetVariableList(output, s_sources_name, s_sources) - - c_sources_name = None - if c_sources: - c_sources_name = cmake_target_name + "__c_srcs" - SetVariableList(output, c_sources_name, c_sources) - - cxx_sources_name = None - if cxx_sources: - cxx_sources_name = cmake_target_name + "__cxx_srcs" - SetVariableList(output, cxx_sources_name, cxx_sources) - - linkable_sources_name = None - if linkable_sources: - linkable_sources_name = cmake_target_name + "__linkable_srcs" - SetVariableList(output, linkable_sources_name, linkable_sources) - - other_sources_name = None - if other_sources: - other_sources_name = cmake_target_name + "__other_srcs" - SetVariableList(output, other_sources_name, other_sources) - - # CMake gets upset when executable targets provide no sources. - # http://www.cmake.org/pipermail/cmake/2010-July/038461.html - dummy_sources_name = None - has_sources = ( - s_sources_name - or c_sources_name - or cxx_sources_name - or linkable_sources_name - or other_sources_name - ) - if target_type == "executable" and not has_sources: - dummy_sources_name = cmake_target_name + "__dummy_srcs" - SetVariable( - output, dummy_sources_name, "${obj}.${TOOLSET}/${TARGET}/genc/dummy.c" - ) - output.write('if(NOT EXISTS "') - WriteVariable(output, dummy_sources_name) - output.write('")\n') - output.write(' file(WRITE "') - WriteVariable(output, dummy_sources_name) - output.write('" "")\n') - output.write("endif()\n") - - # CMake is opposed to setting linker directories and considers the practice - # of setting linker directories dangerous. Instead, it favors the use of - # find_library and passing absolute paths to target_link_libraries. - # However, CMake does provide the command link_directories, which adds - # link directories to targets defined after it is called. - # As a result, link_directories must come before the target definition. - # CMake unfortunately has no means of removing entries from LINK_DIRECTORIES. - if (library_dirs := config.get("library_dirs")) is not None: - output.write("link_directories(") - for library_dir in library_dirs: - output.write(" ") - output.write(NormjoinPath(path_from_cmakelists_to_gyp, library_dir)) - output.write("\n") - output.write(")\n") - - output.write(cmake_target_type.command) - output.write("(") - output.write(cmake_target_name) - - if cmake_target_type.modifier is not None: - output.write(" ") - output.write(cmake_target_type.modifier) - - if s_sources_name: - WriteVariable(output, s_sources_name, " ") - if c_sources_name: - WriteVariable(output, c_sources_name, " ") - if cxx_sources_name: - WriteVariable(output, cxx_sources_name, " ") - if linkable_sources_name: - WriteVariable(output, linkable_sources_name, " ") - if other_sources_name: - WriteVariable(output, other_sources_name, " ") - if dummy_sources_name: - WriteVariable(output, dummy_sources_name, " ") - - output.write(")\n") - - # Let CMake know if the 'all' target should depend on this target. - exclude_from_all = ( - "TRUE" if qualified_target not in all_qualified_targets else "FALSE" - ) - SetTargetProperty(output, cmake_target_name, "EXCLUDE_FROM_ALL", exclude_from_all) - for extra_target_name in extra_deps: - SetTargetProperty( - output, extra_target_name, "EXCLUDE_FROM_ALL", exclude_from_all - ) - - # Output name and location. - if target_type != "none": - # Link as 'C' if there are no other files - if not c_sources and not cxx_sources: - SetTargetProperty(output, cmake_target_name, "LINKER_LANGUAGE", ["C"]) - - # Mark uncompiled sources as uncompiled. - if other_sources_name: - output.write("set_source_files_properties(") - WriteVariable(output, other_sources_name, "") - output.write(' PROPERTIES HEADER_FILE_ONLY "TRUE")\n') - - # Mark object sources as linkable. - if linkable_sources_name: - output.write("set_source_files_properties(") - WriteVariable(output, other_sources_name, "") - output.write(' PROPERTIES EXTERNAL_OBJECT "TRUE")\n') - - # Output directory - target_output_directory = spec.get("product_dir") - if target_output_directory is None: - if target_type in ("executable", "loadable_module"): - target_output_directory = generator_default_variables["PRODUCT_DIR"] - elif target_type == "shared_library": - target_output_directory = "${builddir}/lib.${TOOLSET}" - elif spec.get("standalone_static_library", False): - target_output_directory = generator_default_variables["PRODUCT_DIR"] - else: - base_path = gyp.common.RelativePath( - os.path.dirname(gyp_file), options.toplevel_dir - ) - target_output_directory = "${obj}.${TOOLSET}" - target_output_directory = os.path.join( - target_output_directory, base_path - ) - - cmake_target_output_directory = NormjoinPathForceCMakeSource( - path_from_cmakelists_to_gyp, target_output_directory - ) - SetTargetProperty( - output, - cmake_target_name, - cmake_target_type.property_modifier + "_OUTPUT_DIRECTORY", - cmake_target_output_directory, - ) - - # Output name - default_product_prefix = "" - default_product_name = target_name - default_product_ext = "" - if target_type == "static_library": - static_library_prefix = generator_default_variables["STATIC_LIB_PREFIX"] - default_product_name = RemovePrefix( - default_product_name, static_library_prefix - ) - default_product_prefix = static_library_prefix - default_product_ext = generator_default_variables["STATIC_LIB_SUFFIX"] - - elif target_type in ("loadable_module", "shared_library"): - shared_library_prefix = generator_default_variables["SHARED_LIB_PREFIX"] - default_product_name = RemovePrefix( - default_product_name, shared_library_prefix - ) - default_product_prefix = shared_library_prefix - default_product_ext = generator_default_variables["SHARED_LIB_SUFFIX"] - - elif target_type != "executable": - print( - "ERROR: What output file should be generated?", - "type", - target_type, - "target", - target_name, - ) - - product_prefix = spec.get("product_prefix", default_product_prefix) - product_name = spec.get("product_name", default_product_name) - product_ext = spec.get("product_extension") - product_ext = "." + product_ext if product_ext else default_product_ext - - SetTargetProperty(output, cmake_target_name, "PREFIX", product_prefix) - SetTargetProperty( - output, - cmake_target_name, - cmake_target_type.property_modifier + "_OUTPUT_NAME", - product_name, - ) - SetTargetProperty(output, cmake_target_name, "SUFFIX", product_ext) - - # Make the output of this target referenceable as a source. - cmake_target_output_basename = product_prefix + product_name + product_ext - cmake_target_output = os.path.join( - cmake_target_output_directory, cmake_target_output_basename - ) - SetFileProperty(output, cmake_target_output, "GENERATED", ["TRUE"], "") - - # Includes - includes = config.get("include_dirs") - if includes: - # This (target include directories) is what requires CMake 2.8.8 - includes_name = cmake_target_name + "__include_dirs" - SetVariableList( - output, - includes_name, - [ - NormjoinPathForceCMakeSource(path_from_cmakelists_to_gyp, include) - for include in includes - ], - ) - output.write("set_property(TARGET ") - output.write(cmake_target_name) - output.write(" APPEND PROPERTY INCLUDE_DIRECTORIES ") - WriteVariable(output, includes_name, "") - output.write(")\n") - - # Defines - defines = config.get("defines") - if defines is not None: - SetTargetProperty( - output, cmake_target_name, "COMPILE_DEFINITIONS", defines, ";" - ) - - # Compile Flags - http://www.cmake.org/Bug/view.php?id=6493 - # CMake currently does not have target C and CXX flags. - # So, instead of doing... - - # cflags_c = config.get('cflags_c') - # if cflags_c is not None: - # SetTargetProperty(output, cmake_target_name, - # 'C_COMPILE_FLAGS', cflags_c, ' ') - - # cflags_cc = config.get('cflags_cc') - # if cflags_cc is not None: - # SetTargetProperty(output, cmake_target_name, - # 'CXX_COMPILE_FLAGS', cflags_cc, ' ') - - # Instead we must... - cflags = config.get("cflags", []) - cflags_c = config.get("cflags_c", []) - cflags_cxx = config.get("cflags_cc", []) - if xcode_settings: - cflags = xcode_settings.GetCflags(config_to_use) - cflags_c = xcode_settings.GetCflagsC(config_to_use) - cflags_cxx = xcode_settings.GetCflagsCC(config_to_use) - # cflags_objc = xcode_settings.GetCflagsObjC(config_to_use) - # cflags_objcc = xcode_settings.GetCflagsObjCC(config_to_use) - - if (not cflags_c or not c_sources) and (not cflags_cxx or not cxx_sources): - SetTargetProperty(output, cmake_target_name, "COMPILE_FLAGS", cflags, " ") - - elif c_sources and not (s_sources or cxx_sources): - flags = [] - flags.extend(cflags) - flags.extend(cflags_c) - SetTargetProperty(output, cmake_target_name, "COMPILE_FLAGS", flags, " ") - - elif cxx_sources and not (s_sources or c_sources): - flags = [] - flags.extend(cflags) - flags.extend(cflags_cxx) - SetTargetProperty(output, cmake_target_name, "COMPILE_FLAGS", flags, " ") - - else: - # TODO: This is broken, one cannot generally set properties on files, - # as other targets may require different properties on the same files. - if s_sources and cflags: - SetFilesProperty(output, s_sources_name, "COMPILE_FLAGS", cflags, " ") - - if c_sources and (cflags or cflags_c): - flags = [] - flags.extend(cflags) - flags.extend(cflags_c) - SetFilesProperty(output, c_sources_name, "COMPILE_FLAGS", flags, " ") - - if cxx_sources and (cflags or cflags_cxx): - flags = [] - flags.extend(cflags) - flags.extend(cflags_cxx) - SetFilesProperty(output, cxx_sources_name, "COMPILE_FLAGS", flags, " ") - - # Linker flags - ldflags = config.get("ldflags") - if ldflags is not None: - SetTargetProperty(output, cmake_target_name, "LINK_FLAGS", ldflags, " ") - - # XCode settings - xcode_settings = config.get("xcode_settings", {}) - for xcode_setting, xcode_value in xcode_settings.items(): - SetTargetProperty( - output, - cmake_target_name, - "XCODE_ATTRIBUTE_%s" % xcode_setting, - xcode_value, - "" if isinstance(xcode_value, str) else " ", - ) - - # Note on Dependencies and Libraries: - # CMake wants to handle link order, resolving the link line up front. - # Gyp does not retain or enforce specifying enough information to do so. - # So do as other gyp generators and use --start-group and --end-group. - # Give CMake as little information as possible so that it doesn't mess it up. - - # Dependencies - rawDeps = spec.get("dependencies", []) - - static_deps = [] - shared_deps = [] - other_deps = [] - for rawDep in rawDeps: - dep_cmake_name = namer.CreateCMakeTargetName(rawDep) - dep_spec = target_dicts.get(rawDep, {}) - dep_target_type = dep_spec.get("type", None) - - if dep_target_type == "static_library": - static_deps.append(dep_cmake_name) - elif dep_target_type == "shared_library": - shared_deps.append(dep_cmake_name) - else: - other_deps.append(dep_cmake_name) - - # ensure all external dependencies are complete before internal dependencies - # extra_deps currently only depend on their own deps, so otherwise run early - if static_deps or shared_deps or other_deps: - for extra_dep in extra_deps: - output.write("add_dependencies(") - output.write(extra_dep) - output.write("\n") - for deps in (static_deps, shared_deps, other_deps): - for dep in gyp.common.uniquer(deps): - output.write(" ") - output.write(dep) - output.write("\n") - output.write(")\n") - - linkable = target_type in ("executable", "loadable_module", "shared_library") - other_deps.extend(extra_deps) - if other_deps or (not linkable and (static_deps or shared_deps)): - output.write("add_dependencies(") - output.write(cmake_target_name) - output.write("\n") - for dep in gyp.common.uniquer(other_deps): - output.write(" ") - output.write(dep) - output.write("\n") - if not linkable: - for deps in (static_deps, shared_deps): - for lib_dep in gyp.common.uniquer(deps): - output.write(" ") - output.write(lib_dep) - output.write("\n") - output.write(")\n") - - # Libraries - if linkable: - external_libs = [lib for lib in spec.get("libraries", []) if len(lib) > 0] - if external_libs or static_deps or shared_deps: - output.write("target_link_libraries(") - output.write(cmake_target_name) - output.write("\n") - if static_deps: - write_group = circular_libs and len(static_deps) > 1 and flavor != "mac" - if write_group: - output.write("-Wl,--start-group\n") - for dep in gyp.common.uniquer(static_deps): - output.write(" ") - output.write(dep) - output.write("\n") - if write_group: - output.write("-Wl,--end-group\n") - if shared_deps: - for dep in gyp.common.uniquer(shared_deps): - output.write(" ") - output.write(dep) - output.write("\n") - if external_libs: - for lib in gyp.common.uniquer(external_libs): - output.write(' "') - output.write(RemovePrefix(lib, "$(SDKROOT)")) - output.write('"\n') - - output.write(")\n") - - UnsetVariable(output, "TOOLSET") - UnsetVariable(output, "TARGET") - - -def GenerateOutputForConfig(target_list, target_dicts, data, params, config_to_use): - options = params["options"] - generator_flags = params["generator_flags"] - flavor = gyp.common.GetFlavor(params) - - # generator_dir: relative path from pwd to where make puts build files. - # Makes migrating from make to cmake easier, cmake doesn't put anything here. - # Each Gyp configuration creates a different CMakeLists.txt file - # to avoid incompatibilities between Gyp and CMake configurations. - generator_dir = os.path.relpath(options.generator_output or ".") - - # output_dir: relative path from generator_dir to the build directory. - output_dir = generator_flags.get("output_dir", "out") - - # build_dir: relative path from source root to our output files. - # e.g. "out/Debug" - build_dir = os.path.normpath(os.path.join(generator_dir, output_dir, config_to_use)) - - toplevel_build = os.path.join(options.toplevel_dir, build_dir) - - output_file = os.path.join(toplevel_build, "CMakeLists.txt") - gyp.common.EnsureDirExists(output_file) - - output = open(output_file, "w") - output.write("cmake_minimum_required(VERSION 2.8.8 FATAL_ERROR)\n") - output.write("cmake_policy(VERSION 2.8.8)\n") - - gyp_file, project_target, _ = gyp.common.ParseQualifiedTarget(target_list[-1]) - output.write("project(") - output.write(project_target) - output.write(")\n") - - SetVariable(output, "configuration", config_to_use) - - ar = None - cc = None - cxx = None - - make_global_settings = data[gyp_file].get("make_global_settings", []) - build_to_top = gyp.common.InvertRelativePath(build_dir, options.toplevel_dir) - for key, value in make_global_settings: - if key == "AR": - ar = os.path.join(build_to_top, value) - if key == "CC": - cc = os.path.join(build_to_top, value) - if key == "CXX": - cxx = os.path.join(build_to_top, value) - - ar = gyp.common.GetEnvironFallback(["AR_target", "AR"], ar) - cc = gyp.common.GetEnvironFallback(["CC_target", "CC"], cc) - cxx = gyp.common.GetEnvironFallback(["CXX_target", "CXX"], cxx) - - if ar: - SetVariable(output, "CMAKE_AR", ar) - if cc: - SetVariable(output, "CMAKE_C_COMPILER", cc) - if cxx: - SetVariable(output, "CMAKE_CXX_COMPILER", cxx) - - # The following appears to be as-yet undocumented. - # http://public.kitware.com/Bug/view.php?id=8392 - output.write("enable_language(ASM)\n") - # ASM-ATT does not support .S files. - # output.write('enable_language(ASM-ATT)\n') - - if cc: - SetVariable(output, "CMAKE_ASM_COMPILER", cc) - - SetVariable(output, "builddir", "${CMAKE_CURRENT_BINARY_DIR}") - SetVariable(output, "obj", "${builddir}/obj") - output.write("\n") - - # TODO: Undocumented/unsupported (the CMake Java generator depends on it). - # CMake by default names the object resulting from foo.c to be foo.c.o. - # Gyp traditionally names the object resulting from foo.c foo.o. - # This should be irrelevant, but some targets extract .o files from .a - # and depend on the name of the extracted .o files. - output.write("set(CMAKE_C_OUTPUT_EXTENSION_REPLACE 1)\n") - output.write("set(CMAKE_CXX_OUTPUT_EXTENSION_REPLACE 1)\n") - output.write("\n") - - # Force ninja to use rsp files. Otherwise link and ar lines can get too long, - # resulting in 'Argument list too long' errors. - # However, rsp files don't work correctly on Mac. - if flavor != "mac": - output.write("set(CMAKE_NINJA_FORCE_RESPONSE_FILE 1)\n") - output.write("\n") - - namer = CMakeNamer(target_list) - - # The list of targets upon which the 'all' target should depend. - # CMake has it's own implicit 'all' target, one is not created explicitly. - all_qualified_targets = set() - for build_file in params["build_files"]: - for qualified_target in gyp.common.AllTargets( - target_list, target_dicts, os.path.normpath(build_file) - ): - all_qualified_targets.add(qualified_target) - - for qualified_target in target_list: - if flavor == "mac": - gyp_file, _, _ = gyp.common.ParseQualifiedTarget(qualified_target) - spec = target_dicts[qualified_target] - gyp.xcode_emulation.MergeGlobalXcodeSettingsToSpec(data[gyp_file], spec) - - WriteTarget( - namer, - qualified_target, - target_dicts, - build_dir, - config_to_use, - options, - generator_flags, - all_qualified_targets, - flavor, - output, - ) - - output.close() - - -def PerformBuild(data, configurations, params): - options = params["options"] - generator_flags = params["generator_flags"] - - # generator_dir: relative path from pwd to where make puts build files. - # Makes migrating from make to cmake easier, cmake doesn't put anything here. - generator_dir = os.path.relpath(options.generator_output or ".") - - # output_dir: relative path from generator_dir to the build directory. - output_dir = generator_flags.get("output_dir", "out") - - for config_name in configurations: - # build_dir: relative path from source root to our output files. - # e.g. "out/Debug" - build_dir = os.path.normpath( - os.path.join(generator_dir, output_dir, config_name) - ) - arguments = ["cmake", "-G", "Ninja"] - print(f"Generating [{config_name}]: {arguments}") - subprocess.check_call(arguments, cwd=build_dir) - - arguments = ["ninja", "-C", build_dir] - print(f"Building [{config_name}]: {arguments}") - subprocess.check_call(arguments) - - -def CallGenerateOutputForConfig(arglist): - # Ignore the interrupt signal so that the parent process catches it and - # kills all multiprocessing children. - signal.signal(signal.SIGINT, signal.SIG_IGN) - - target_list, target_dicts, data, params, config_name = arglist - GenerateOutputForConfig(target_list, target_dicts, data, params, config_name) - - -def GenerateOutput(target_list, target_dicts, data, params): - if user_config := params.get("generator_flags", {}).get("config", None): - GenerateOutputForConfig(target_list, target_dicts, data, params, user_config) - else: - config_names = target_dicts[target_list[0]]["configurations"] - if params["parallel"]: - try: - pool = multiprocessing.Pool(len(config_names)) - arglists = [] - for config_name in config_names: - arglists.append( - (target_list, target_dicts, data, params, config_name) - ) - pool.map(CallGenerateOutputForConfig, arglists) - except KeyboardInterrupt as e: - pool.terminate() - raise e - else: - for config_name in config_names: - GenerateOutputForConfig( - target_list, target_dicts, data, params, config_name - ) diff --git a/tools/gyp/pylib/gyp/generator/compile_commands_json.py b/tools/gyp/pylib/gyp/generator/compile_commands_json.py deleted file mode 100644 index 1361aeca48d..00000000000 --- a/tools/gyp/pylib/gyp/generator/compile_commands_json.py +++ /dev/null @@ -1,128 +0,0 @@ -# Copyright (c) 2016 Ben Noordhuis . All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import json -import os - -import gyp.common -import gyp.xcode_emulation - -generator_additional_non_configuration_keys = [] -generator_additional_path_sections = [] -generator_extra_sources_for_rules = [] -generator_filelist_paths = None -generator_supports_multiple_toolsets = True -generator_wants_sorted_dependencies = False - -# Lifted from make.py. The actual values don't matter much. -generator_default_variables = { - "CONFIGURATION_NAME": "$(BUILDTYPE)", - "EXECUTABLE_PREFIX": "", - "EXECUTABLE_SUFFIX": "", - "INTERMEDIATE_DIR": "$(obj).$(TOOLSET)/$(TARGET)/geni", - "PRODUCT_DIR": "$(builddir)", - "RULE_INPUT_DIRNAME": "%(INPUT_DIRNAME)s", - "RULE_INPUT_EXT": "$(suffix $<)", - "RULE_INPUT_NAME": "$(notdir $<)", - "RULE_INPUT_PATH": "$(abspath $<)", - "RULE_INPUT_ROOT": "%(INPUT_ROOT)s", - "SHARED_INTERMEDIATE_DIR": "$(obj)/gen", - "SHARED_LIB_PREFIX": "lib", - "STATIC_LIB_PREFIX": "lib", - "STATIC_LIB_SUFFIX": ".a", -} - - -def IsMac(params): - return gyp.common.GetFlavor(params) == "mac" - - -def CalculateVariables(default_variables, params): - default_variables.setdefault("OS", gyp.common.GetFlavor(params)) - - -def AddCommandsForTarget(cwd, target, params, per_config_commands): - output_dir = params["generator_flags"].get("output_dir", "out") - for configuration_name, configuration in target["configurations"].items(): - if IsMac(params): - xcode_settings = gyp.xcode_emulation.XcodeSettings(target) - cflags = xcode_settings.GetCflags(configuration_name) - cflags_c = xcode_settings.GetCflagsC(configuration_name) - cflags_cc = xcode_settings.GetCflagsCC(configuration_name) - else: - cflags = configuration.get("cflags", []) - cflags_c = configuration.get("cflags_c", []) - cflags_cc = configuration.get("cflags_cc", []) - - cflags_c = cflags + cflags_c - cflags_cc = cflags + cflags_cc - - defines = configuration.get("defines", []) - defines = ["-D" + s for s in defines] - - # TODO(bnoordhuis) Handle generated source files. - extensions = (".c", ".cc", ".cpp", ".cxx") - sources = [s for s in target.get("sources", []) if s.endswith(extensions)] - - def resolve(filename): - return os.path.abspath(os.path.join(cwd, filename)) - - # TODO(bnoordhuis) Handle generated header files. - include_dirs = configuration.get("include_dirs", []) - include_dirs = [s for s in include_dirs if not s.startswith("$(obj)")] - includes = ["-I" + resolve(s) for s in include_dirs] - - defines = gyp.common.EncodePOSIXShellList(defines) - includes = gyp.common.EncodePOSIXShellList(includes) - cflags_c = gyp.common.EncodePOSIXShellList(cflags_c) - cflags_cc = gyp.common.EncodePOSIXShellList(cflags_cc) - - commands = per_config_commands.setdefault(configuration_name, []) - for source in sources: - file = resolve(source) - isc = source.endswith(".c") - cc = "cc" if isc else "c++" - cflags = cflags_c if isc else cflags_cc - command = " ".join( - ( - cc, - defines, - includes, - cflags, - "-c", - gyp.common.EncodePOSIXShellArgument(file), - ) - ) - commands.append({"command": command, "directory": output_dir, "file": file}) - - -def GenerateOutput(target_list, target_dicts, data, params): - per_config_commands = {} - for qualified_target, target in target_dicts.items(): - build_file, _target_name, _toolset = gyp.common.ParseQualifiedTarget( - qualified_target - ) - if IsMac(params): - settings = data[build_file] - gyp.xcode_emulation.MergeGlobalXcodeSettingsToSpec(settings, target) - cwd = os.path.dirname(build_file) - AddCommandsForTarget(cwd, target, params, per_config_commands) - - output_dir = None - try: - # generator_output can be `None` on Windows machines, or even not - # defined in other cases - output_dir = params.get("options").generator_output - except AttributeError: - pass - output_dir = output_dir or params["generator_flags"].get("output_dir", "out") - for configuration_name, commands in per_config_commands.items(): - filename = os.path.join(output_dir, configuration_name, "compile_commands.json") - gyp.common.EnsureDirExists(filename) - fp = open(filename, "w") - json.dump(commands, fp=fp, indent=0, check_circular=False) - - -def PerformBuild(data, configurations, params): - pass diff --git a/tools/gyp/pylib/gyp/generator/dump_dependency_json.py b/tools/gyp/pylib/gyp/generator/dump_dependency_json.py deleted file mode 100644 index c919674024e..00000000000 --- a/tools/gyp/pylib/gyp/generator/dump_dependency_json.py +++ /dev/null @@ -1,104 +0,0 @@ -# Copyright (c) 2012 Google Inc. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - - -import json -import os - -import gyp -import gyp.common -import gyp.msvs_emulation - -generator_supports_multiple_toolsets = True - -generator_wants_static_library_dependencies_adjusted = False - -generator_filelist_paths = {} - -generator_default_variables = {} -for dirname in [ - "INTERMEDIATE_DIR", - "SHARED_INTERMEDIATE_DIR", - "PRODUCT_DIR", - "LIB_DIR", - "SHARED_LIB_DIR", -]: - # Some gyp steps fail if these are empty(!). - generator_default_variables[dirname] = "dir" -for unused in [ - "RULE_INPUT_PATH", - "RULE_INPUT_ROOT", - "RULE_INPUT_NAME", - "RULE_INPUT_DIRNAME", - "RULE_INPUT_EXT", - "EXECUTABLE_PREFIX", - "EXECUTABLE_SUFFIX", - "STATIC_LIB_PREFIX", - "STATIC_LIB_SUFFIX", - "SHARED_LIB_PREFIX", - "SHARED_LIB_SUFFIX", - "CONFIGURATION_NAME", -]: - generator_default_variables[unused] = "" - - -def CalculateVariables(default_variables, params): - generator_flags = params.get("generator_flags", {}) - for key, val in generator_flags.items(): - default_variables.setdefault(key, val) - default_variables.setdefault("OS", gyp.common.GetFlavor(params)) - - flavor = gyp.common.GetFlavor(params) - if flavor == "win": - gyp.msvs_emulation.CalculateCommonVariables(default_variables, params) - - -def CalculateGeneratorInputInfo(params): - """Calculate the generator specific info that gets fed to input (called by - gyp).""" - generator_flags = params.get("generator_flags", {}) - if generator_flags.get("adjust_static_libraries", False): - global generator_wants_static_library_dependencies_adjusted - generator_wants_static_library_dependencies_adjusted = True - - toplevel = params["options"].toplevel_dir - generator_dir = os.path.relpath(params["options"].generator_output or ".") - # output_dir: relative path from generator_dir to the build directory. - output_dir = generator_flags.get("output_dir", "out") - qualified_out_dir = os.path.normpath( - os.path.join(toplevel, generator_dir, output_dir, "gypfiles") - ) - global generator_filelist_paths - generator_filelist_paths = { - "toplevel": toplevel, - "qualified_out_dir": qualified_out_dir, - } - - -def GenerateOutput(target_list, target_dicts, data, params): - # Map of target -> list of targets it depends on. - edges = {} - - # Queue of targets to visit. - targets_to_visit = target_list[:] - - while len(targets_to_visit) > 0: - target = targets_to_visit.pop() - if target in edges: - continue - edges[target] = [] - - for dep in target_dicts[target].get("dependencies", []): - edges[target].append(dep) - targets_to_visit.append(dep) - - try: - filepath = params["generator_flags"]["output_dir"] - except KeyError: - filepath = "." - filename = os.path.join(filepath, "dump.json") - f = open(filename, "w") - json.dump(edges, f) - f.close() - print("Wrote json to %s." % filename) diff --git a/tools/gyp/pylib/gyp/generator/eclipse.py b/tools/gyp/pylib/gyp/generator/eclipse.py deleted file mode 100644 index 685cd08c964..00000000000 --- a/tools/gyp/pylib/gyp/generator/eclipse.py +++ /dev/null @@ -1,461 +0,0 @@ -# Copyright (c) 2012 Google Inc. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""GYP backend that generates Eclipse CDT settings files. - -This backend DOES NOT generate Eclipse CDT projects. Instead, it generates XML -files that can be imported into an Eclipse CDT project. The XML file contains a -list of include paths and symbols (i.e. defines). - -Because a full .cproject definition is not created by this generator, it's not -possible to properly define the include dirs and symbols for each file -individually. Instead, one set of includes/symbols is generated for the entire -project. This works fairly well (and is a vast improvement in general), but may -still result in a few indexer issues here and there. - -This generator has no automated tests, so expect it to be broken. -""" - -import os.path -import shlex -import subprocess -import xml.etree.ElementTree as ET -from xml.sax.saxutils import escape - -import gyp -import gyp.common -import gyp.msvs_emulation - -generator_wants_static_library_dependencies_adjusted = False - -generator_default_variables = {} - -for dirname in ["INTERMEDIATE_DIR", "PRODUCT_DIR", "LIB_DIR", "SHARED_LIB_DIR"]: - # Some gyp steps fail if these are empty(!), so we convert them to variables - generator_default_variables[dirname] = "$" + dirname - -for unused in [ - "RULE_INPUT_PATH", - "RULE_INPUT_ROOT", - "RULE_INPUT_NAME", - "RULE_INPUT_DIRNAME", - "RULE_INPUT_EXT", - "EXECUTABLE_PREFIX", - "EXECUTABLE_SUFFIX", - "STATIC_LIB_PREFIX", - "STATIC_LIB_SUFFIX", - "SHARED_LIB_PREFIX", - "SHARED_LIB_SUFFIX", - "CONFIGURATION_NAME", -]: - generator_default_variables[unused] = "" - -# Include dirs will occasionally use the SHARED_INTERMEDIATE_DIR variable as -# part of the path when dealing with generated headers. This value will be -# replaced dynamically for each configuration. -generator_default_variables["SHARED_INTERMEDIATE_DIR"] = "$SHARED_INTERMEDIATE_DIR" - - -def CalculateVariables(default_variables, params): - generator_flags = params.get("generator_flags", {}) - for key, val in generator_flags.items(): - default_variables.setdefault(key, val) - flavor = gyp.common.GetFlavor(params) - default_variables.setdefault("OS", flavor) - if flavor == "win": - gyp.msvs_emulation.CalculateCommonVariables(default_variables, params) - - -def CalculateGeneratorInputInfo(params): - """Calculate the generator specific info that gets fed to input (called by - gyp).""" - generator_flags = params.get("generator_flags", {}) - if generator_flags.get("adjust_static_libraries", False): - global generator_wants_static_library_dependencies_adjusted - generator_wants_static_library_dependencies_adjusted = True - - -def GetAllIncludeDirectories( - target_list, - target_dicts, - shared_intermediate_dirs, - config_name, - params, - compiler_path, -): - """Calculate the set of include directories to be used. - - Returns: - A list including all the include_dir's specified for every target followed - by any include directories that were added as cflag compiler options. - """ - - gyp_includes_set = set() - compiler_includes_list = [] - - # Find compiler's default include dirs. - if compiler_path: - command = shlex.split(compiler_path) - command.extend(["-E", "-xc++", "-v", "-"]) - proc = subprocess.Popen( - args=command, - stdin=subprocess.PIPE, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - ) - output = proc.communicate()[1].decode("utf-8") - # Extract the list of include dirs from the output, which has this format: - # ... - # #include "..." search starts here: - # #include <...> search starts here: - # /usr/include/c++/4.6 - # /usr/local/include - # End of search list. - # ... - in_include_list = False - for line in output.splitlines(): - if line.startswith("#include"): - in_include_list = True - continue - if line.startswith("End of search list."): - break - if in_include_list: - include_dir = line.strip() - if include_dir not in compiler_includes_list: - compiler_includes_list.append(include_dir) - - flavor = gyp.common.GetFlavor(params) - if flavor == "win": - generator_flags = params.get("generator_flags", {}) - for target_name in target_list: - target = target_dicts[target_name] - if config_name in target["configurations"]: - config = target["configurations"][config_name] - - # Look for any include dirs that were explicitly added via cflags. This - # may be done in gyp files to force certain includes to come at the end. - # TODO(jgreenwald): Change the gyp files to not abuse cflags for this, and - # remove this. - if flavor == "win": - msvs_settings = gyp.msvs_emulation.MsvsSettings(target, generator_flags) - cflags = msvs_settings.GetCflags(config_name) - else: - cflags = config["cflags"] - for cflag in cflags: - if cflag.startswith("-I"): - include_dir = cflag[2:] - if include_dir not in compiler_includes_list: - compiler_includes_list.append(include_dir) - - # Find standard gyp include dirs. - if "include_dirs" in config: - include_dirs = config["include_dirs"] - for shared_intermediate_dir in shared_intermediate_dirs: - for include_dir in include_dirs: - include_dir = include_dir.replace( - "$SHARED_INTERMEDIATE_DIR", shared_intermediate_dir - ) - if not os.path.isabs(include_dir): - base_dir = os.path.dirname(target_name) - - include_dir = base_dir + "/" + include_dir - include_dir = os.path.abspath(include_dir) - - gyp_includes_set.add(include_dir) - - # Generate a list that has all the include dirs. - all_includes_list = list(gyp_includes_set) - all_includes_list.sort() - for compiler_include in compiler_includes_list: - if compiler_include not in gyp_includes_set: - all_includes_list.append(compiler_include) - - # All done. - return all_includes_list - - -def GetCompilerPath(target_list, data, options): - """Determine a command that can be used to invoke the compiler. - - Returns: - If this is a gyp project that has explicit make settings, try to determine - the compiler from that. Otherwise, see if a compiler was specified via the - CC_target environment variable. - """ - # First, see if the compiler is configured in make's settings. - build_file, _, _ = gyp.common.ParseQualifiedTarget(target_list[0]) - make_global_settings_dict = data[build_file].get("make_global_settings", {}) - for key, value in make_global_settings_dict: - if key in ["CC", "CXX"]: - return os.path.join(options.toplevel_dir, value) - - # Check to see if the compiler was specified as an environment variable. - for key in ["CC_target", "CC", "CXX"]: - compiler = os.environ.get(key) - if compiler: - return compiler - - return "gcc" - - -def GetAllDefines(target_list, target_dicts, data, config_name, params, compiler_path): - """Calculate the defines for a project. - - Returns: - A dict that includes explicit defines declared in gyp files along with all - of the default defines that the compiler uses. - """ - - # Get defines declared in the gyp files. - all_defines = {} - flavor = gyp.common.GetFlavor(params) - if flavor == "win": - generator_flags = params.get("generator_flags", {}) - for target_name in target_list: - target = target_dicts[target_name] - - if flavor == "win": - msvs_settings = gyp.msvs_emulation.MsvsSettings(target, generator_flags) - extra_defines = msvs_settings.GetComputedDefines(config_name) - else: - extra_defines = [] - if config_name in target["configurations"]: - config = target["configurations"][config_name] - target_defines = config["defines"] - else: - target_defines = [] - for define in target_defines + extra_defines: - split_define = define.split("=", 1) - if len(split_define) == 1: - split_define.append("1") - if split_define[0].strip() in all_defines: - # Already defined - continue - all_defines[split_define[0].strip()] = split_define[1].strip() - # Get default compiler defines (if possible). - if flavor == "win": - return all_defines # Default defines already processed in the loop above. - if compiler_path: - command = shlex.split(compiler_path) - command.extend(["-E", "-dM", "-"]) - cpp_proc = subprocess.Popen( - args=command, cwd=".", stdin=subprocess.PIPE, stdout=subprocess.PIPE - ) - cpp_output = cpp_proc.communicate()[0].decode("utf-8") - cpp_lines = cpp_output.split("\n") - for cpp_line in cpp_lines: - if not cpp_line.strip(): - continue - cpp_line_parts = cpp_line.split(" ", 2) - key = cpp_line_parts[1] - val = cpp_line_parts[2] if len(cpp_line_parts) >= 3 else "1" - all_defines[key] = val - - return all_defines - - -def WriteIncludePaths(out, eclipse_langs, include_dirs): - """Write the includes section of a CDT settings export file.""" - - out.write( - '
\n' - ) - out.write(' \n') - for lang in eclipse_langs: - out.write(' \n' % lang) - for include_dir in include_dirs: - out.write( - ' %s\n' - % include_dir - ) - out.write(" \n") - out.write("
\n") - - -def WriteMacros(out, eclipse_langs, defines): - """Write the macros section of a CDT settings export file.""" - - out.write( - '
\n' - ) - out.write(' \n') - for lang in eclipse_langs: - out.write(' \n' % lang) - for key in sorted(defines): - out.write( - " %s%s\n" - % (escape(key), escape(defines[key])) - ) - out.write(" \n") - out.write("
\n") - - -def GenerateOutputForConfig(target_list, target_dicts, data, params, config_name): - options = params["options"] - generator_flags = params.get("generator_flags", {}) - - # build_dir: relative path from source root to our output files. - # e.g. "out/Debug" - build_dir = os.path.join(generator_flags.get("output_dir", "out"), config_name) - - toplevel_build = os.path.join(options.toplevel_dir, build_dir) - # Ninja uses out/Debug/gen while make uses out/Debug/obj/gen as the - # SHARED_INTERMEDIATE_DIR. Include both possible locations. - shared_intermediate_dirs = [ - os.path.join(toplevel_build, "obj", "gen"), - os.path.join(toplevel_build, "gen"), - ] - - GenerateCdtSettingsFile( - target_list, - target_dicts, - data, - params, - config_name, - os.path.join(toplevel_build, "eclipse-cdt-settings.xml"), - options, - shared_intermediate_dirs, - ) - GenerateClasspathFile( - target_list, - target_dicts, - options.toplevel_dir, - toplevel_build, - os.path.join(toplevel_build, "eclipse-classpath.xml"), - ) - - -def GenerateCdtSettingsFile( - target_list, - target_dicts, - data, - params, - config_name, - out_name, - options, - shared_intermediate_dirs, -): - gyp.common.EnsureDirExists(out_name) - with open(out_name, "w") as out: - out.write('\n') - out.write("\n") - - eclipse_langs = [ - "C++ Source File", - "C Source File", - "Assembly Source File", - "GNU C++", - "GNU C", - "Assembly", - ] - compiler_path = GetCompilerPath(target_list, data, options) - include_dirs = GetAllIncludeDirectories( - target_list, - target_dicts, - shared_intermediate_dirs, - config_name, - params, - compiler_path, - ) - WriteIncludePaths(out, eclipse_langs, include_dirs) - defines = GetAllDefines( - target_list, target_dicts, data, config_name, params, compiler_path - ) - WriteMacros(out, eclipse_langs, defines) - - out.write("\n") - - -def GenerateClasspathFile( - target_list, target_dicts, toplevel_dir, toplevel_build, out_name -): - """Generates a classpath file suitable for symbol navigation and code - completion of Java code (such as in Android projects) by finding all - .java and .jar files used as action inputs.""" - gyp.common.EnsureDirExists(out_name) - result = ET.Element("classpath") - - def AddElements(kind, paths): - # First, we need to normalize the paths so they are all relative to the - # toplevel dir. - rel_paths = set() - for path in paths: - if os.path.isabs(path): - rel_paths.add(os.path.relpath(path, toplevel_dir)) - else: - rel_paths.add(path) - - for path in sorted(rel_paths): - entry_element = ET.SubElement(result, "classpathentry") - entry_element.set("kind", kind) - entry_element.set("path", path) - - AddElements("lib", GetJavaJars(target_list, target_dicts, toplevel_dir)) - AddElements("src", GetJavaSourceDirs(target_list, target_dicts, toplevel_dir)) - # Include the standard JRE container and a dummy out folder - AddElements("con", ["org.eclipse.jdt.launching.JRE_CONTAINER"]) - # Include a dummy out folder so that Eclipse doesn't use the default /bin - # folder in the root of the project. - AddElements("output", [os.path.join(toplevel_build, ".eclipse-java-build")]) - - ET.ElementTree(result).write(out_name) - - -def GetJavaJars(target_list, target_dicts, toplevel_dir): - """Generates a sequence of all .jars used as inputs.""" - for target_name in target_list: - target = target_dicts[target_name] - for action in target.get("actions", []): - for input_ in action["inputs"]: - if os.path.splitext(input_)[1] == ".jar" and not input_.startswith("$"): - if os.path.isabs(input_): - yield input_ - else: - yield os.path.join(os.path.dirname(target_name), input_) - - -def GetJavaSourceDirs(target_list, target_dicts, toplevel_dir): - """Generates a sequence of all likely java package root directories.""" - for target_name in target_list: - target = target_dicts[target_name] - for action in target.get("actions", []): - for input_ in action["inputs"]: - if os.path.splitext(input_)[1] == ".java" and not input_.startswith( - "$" - ): - dir_ = os.path.dirname( - os.path.join(os.path.dirname(target_name), input_) - ) - # If there is a parent 'src' or 'java' folder, navigate up to it - - # these are canonical package root names in Chromium. This will - # break if 'src' or 'java' exists in the package structure. This - # could be further improved by inspecting the java file for the - # package name if this proves to be too fragile in practice. - parent_search = dir_ - while os.path.basename(parent_search) not in ["src", "java"]: - parent_search, _ = os.path.split(parent_search) - if not parent_search or parent_search == toplevel_dir: - # Didn't find a known root, just return the original path - yield dir_ - break - else: - yield parent_search - - -def GenerateOutput(target_list, target_dicts, data, params): - """Generate an XML settings file that can be imported into a CDT project.""" - - if params["options"].generator_output: - raise NotImplementedError("--generator_output not implemented for eclipse") - - if user_config := params.get("generator_flags", {}).get("config", None): - GenerateOutputForConfig(target_list, target_dicts, data, params, user_config) - else: - config_names = target_dicts[target_list[0]]["configurations"] - for config_name in config_names: - GenerateOutputForConfig( - target_list, target_dicts, data, params, config_name - ) diff --git a/tools/gyp/pylib/gyp/generator/gypd.py b/tools/gyp/pylib/gyp/generator/gypd.py deleted file mode 100644 index 89af24a201b..00000000000 --- a/tools/gyp/pylib/gyp/generator/gypd.py +++ /dev/null @@ -1,88 +0,0 @@ -# Copyright (c) 2011 Google Inc. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""gypd output module - -This module produces gyp input as its output. Output files are given the -.gypd extension to avoid overwriting the .gyp files that they are generated -from. Internal references to .gyp files (such as those found in -"dependencies" sections) are not adjusted to point to .gypd files instead; -unlike other paths, which are relative to the .gyp or .gypd file, such paths -are relative to the directory from which gyp was run to create the .gypd file. - -This generator module is intended to be a sample and a debugging aid, hence -the "d" for "debug" in .gypd. It is useful to inspect the results of the -various merges, expansions, and conditional evaluations performed by gyp -and to see a representation of what would be fed to a generator module. - -It's not advisable to rename .gypd files produced by this module to .gyp, -because they will have all merges, expansions, and evaluations already -performed and the relevant constructs not present in the output; paths to -dependencies may be wrong; and various sections that do not belong in .gyp -files such as such as "included_files" and "*_excluded" will be present. -Output will also be stripped of comments. This is not intended to be a -general-purpose gyp pretty-printer; for that, you probably just want to -run "pprint.pprint(eval(open('source.gyp').read()))", which will still strip -comments but won't do all of the other things done to this module's output. - -The specific formatting of the output generated by this module is subject -to change. -""" - -import pprint - -import gyp.common - -# These variables should just be spit back out as variable references. -_generator_identity_variables = [ - "CONFIGURATION_NAME", - "EXECUTABLE_PREFIX", - "EXECUTABLE_SUFFIX", - "INTERMEDIATE_DIR", - "LIB_DIR", - "PRODUCT_DIR", - "RULE_INPUT_ROOT", - "RULE_INPUT_DIRNAME", - "RULE_INPUT_EXT", - "RULE_INPUT_NAME", - "RULE_INPUT_PATH", - "SHARED_INTERMEDIATE_DIR", - "SHARED_LIB_DIR", - "SHARED_LIB_PREFIX", - "SHARED_LIB_SUFFIX", - "STATIC_LIB_PREFIX", - "STATIC_LIB_SUFFIX", -] - -# gypd doesn't define a default value for OS like many other generator -# modules. Specify "-D OS=whatever" on the command line to provide a value. -generator_default_variables = {} - -# gypd supports multiple toolsets -generator_supports_multiple_toolsets = True - -# TODO(mark): This always uses <, which isn't right. The input module should -# notify the generator to tell it which phase it is operating in, and this -# module should use < for the early phase and then switch to > for the late -# phase. Bonus points for carrying @ back into the output too. -for v in _generator_identity_variables: - generator_default_variables[v] = "<(%s)" % v - - -def GenerateOutput(target_list, target_dicts, data, params): - output_files = {} - for qualified_target in target_list: - [input_file, _target] = gyp.common.ParseQualifiedTarget(qualified_target)[0:2] - - if input_file[-4:] != ".gyp": - continue - input_file_stem = input_file[:-4] - output_file = input_file_stem + params["options"].suffix + ".gypd" - - output_files[output_file] = output_files.get(output_file, input_file) - - for output_file, input_file in output_files.items(): - output = open(output_file, "w") - pprint.pprint(data[input_file], output) - output.close() diff --git a/tools/gyp/pylib/gyp/generator/gypsh.py b/tools/gyp/pylib/gyp/generator/gypsh.py deleted file mode 100644 index 72d22ff32b9..00000000000 --- a/tools/gyp/pylib/gyp/generator/gypsh.py +++ /dev/null @@ -1,55 +0,0 @@ -# Copyright (c) 2011 Google Inc. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""gypsh output module - -gypsh is a GYP shell. It's not really a generator per se. All it does is -fire up an interactive Python session with a few local variables set to the -variables passed to the generator. Like gypd, it's intended as a debugging -aid, to facilitate the exploration of .gyp structures after being processed -by the input module. - -The expected usage is "gyp -f gypsh -D OS=desired_os". -""" - -import code -import sys - -# All of this stuff about generator variables was lovingly ripped from gypd.py. -# That module has a much better description of what's going on and why. -_generator_identity_variables = [ - "EXECUTABLE_PREFIX", - "EXECUTABLE_SUFFIX", - "INTERMEDIATE_DIR", - "PRODUCT_DIR", - "RULE_INPUT_ROOT", - "RULE_INPUT_DIRNAME", - "RULE_INPUT_EXT", - "RULE_INPUT_NAME", - "RULE_INPUT_PATH", - "SHARED_INTERMEDIATE_DIR", -] - -generator_default_variables = {} - -for v in _generator_identity_variables: - generator_default_variables[v] = "<(%s)" % v - - -def GenerateOutput(target_list, target_dicts, data, params): - locals = { - "target_list": target_list, - "target_dicts": target_dicts, - "data": data, - } - - # Use a banner that looks like the stock Python one and like what - # code.interact uses by default, but tack on something to indicate what - # locals are available, and identify gypsh. - banner = ( - f"Python {sys.version} on {sys.platform}\nlocals.keys() = " - f"{sorted(locals.keys())!r}\ngypsh" - ) - - code.interact(banner, local=locals) diff --git a/tools/gyp/pylib/gyp/generator/make.py b/tools/gyp/pylib/gyp/generator/make.py deleted file mode 100644 index 16b6f4e80b1..00000000000 --- a/tools/gyp/pylib/gyp/generator/make.py +++ /dev/null @@ -1,2755 +0,0 @@ -# Copyright (c) 2013 Google Inc. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# Notes: -# -# This is all roughly based on the Makefile system used by the Linux -# kernel, but is a non-recursive make -- we put the entire dependency -# graph in front of make and let it figure it out. -# -# The code below generates a separate .mk file for each target, but -# all are sourced by the top-level Makefile. This means that all -# variables in .mk-files clobber one another. Be careful to use := -# where appropriate for immediate evaluation, and similarly to watch -# that you're not relying on a variable value to last between different -# .mk files. -# -# TODOs: -# -# Global settings and utility functions are currently stuffed in the -# toplevel Makefile. It may make sense to generate some .mk files on -# the side to keep the files readable. - - -import hashlib -import os -import re -import subprocess -import sys - -import gyp -import gyp.common -import gyp.xcode_emulation -from gyp.common import GetEnvironFallback - -generator_default_variables = { - "EXECUTABLE_PREFIX": "", - "EXECUTABLE_SUFFIX": "", - "STATIC_LIB_PREFIX": "lib", - "SHARED_LIB_PREFIX": "lib", - "STATIC_LIB_SUFFIX": ".a", - "INTERMEDIATE_DIR": "$(obj).$(TOOLSET)/$(TARGET)/geni", - "SHARED_INTERMEDIATE_DIR": "$(obj)/gen", - "PRODUCT_DIR": "$(builddir)", - "RULE_INPUT_ROOT": "%(INPUT_ROOT)s", # This gets expanded by Python. - "RULE_INPUT_DIRNAME": "%(INPUT_DIRNAME)s", # This gets expanded by Python. - "RULE_INPUT_PATH": "$(abspath $<)", - "RULE_INPUT_EXT": "$(suffix $<)", - "RULE_INPUT_NAME": "$(notdir $<)", - "CONFIGURATION_NAME": "$(BUILDTYPE)", -} - -# Make supports multiple toolsets -generator_supports_multiple_toolsets = gyp.common.CrossCompileRequested() - -# Request sorted dependencies in the order from dependents to dependencies. -generator_wants_sorted_dependencies = False - -# Placates pylint. -generator_additional_non_configuration_keys = [] -generator_additional_path_sections = [] -generator_extra_sources_for_rules = [] -generator_filelist_paths = None - - -def CalculateVariables(default_variables, params): - """Calculate additional variables for use in the build (called by gyp).""" - flavor = gyp.common.GetFlavor(params) - if flavor == "mac": - default_variables.setdefault("OS", "mac") - default_variables.setdefault("SHARED_LIB_SUFFIX", ".dylib") - default_variables.setdefault( - "SHARED_LIB_DIR", generator_default_variables["PRODUCT_DIR"] - ) - default_variables.setdefault( - "LIB_DIR", generator_default_variables["PRODUCT_DIR"] - ) - - # Copy additional generator configuration data from Xcode, which is shared - # by the Mac Make generator. - import gyp.generator.xcode as xcode_generator # noqa: PLC0415 - - global generator_additional_non_configuration_keys - generator_additional_non_configuration_keys = getattr( - xcode_generator, "generator_additional_non_configuration_keys", [] - ) - global generator_additional_path_sections - generator_additional_path_sections = getattr( - xcode_generator, "generator_additional_path_sections", [] - ) - global generator_extra_sources_for_rules - generator_extra_sources_for_rules = getattr( - xcode_generator, "generator_extra_sources_for_rules", [] - ) - COMPILABLE_EXTENSIONS.update({".m": "objc", ".mm": "objcxx"}) - else: - operating_system = flavor - if flavor == "android": - operating_system = "linux" # Keep this legacy behavior for now. - default_variables.setdefault("OS", operating_system) - if flavor == "aix": - default_variables.setdefault("SHARED_LIB_SUFFIX", ".a") - elif flavor == "zos": - default_variables.setdefault("SHARED_LIB_SUFFIX", ".x") - COMPILABLE_EXTENSIONS.update({".pli": "pli"}) - else: - default_variables.setdefault("SHARED_LIB_SUFFIX", ".so") - default_variables.setdefault("SHARED_LIB_DIR", "$(builddir)/lib.$(TOOLSET)") - default_variables.setdefault("LIB_DIR", "$(obj).$(TOOLSET)") - - -def CalculateGeneratorInputInfo(params): - """Calculate the generator specific info that gets fed to input (called by - gyp).""" - generator_flags = params.get("generator_flags", {}) - android_ndk_version = generator_flags.get("android_ndk_version", None) - # Android NDK requires a strict link order. - if android_ndk_version: - global generator_wants_sorted_dependencies - generator_wants_sorted_dependencies = True - - output_dir = params["options"].generator_output or params["options"].toplevel_dir - builddir_name = generator_flags.get("output_dir", "out") - qualified_out_dir = os.path.normpath( - os.path.join(output_dir, builddir_name, "gypfiles") - ) - - global generator_filelist_paths - generator_filelist_paths = { - "toplevel": params["options"].toplevel_dir, - "qualified_out_dir": qualified_out_dir, - } - - -# The .d checking code below uses these functions: -# wildcard, sort, foreach, shell, wordlist -# wildcard can handle spaces, the rest can't. -# Since I could find no way to make foreach work with spaces in filenames -# correctly, the .d files have spaces replaced with another character. The .d -# file for -# Chromium\ Framework.framework/foo -# is for example -# out/Release/.deps/out/Release/Chromium?Framework.framework/foo -# This is the replacement character. -SPACE_REPLACEMENT = "?" - - -LINK_COMMANDS_LINUX = """\ -quiet_cmd_alink = AR($(TOOLSET)) $@ -cmd_alink = rm -f $@ && $(AR.$(TOOLSET)) crs $@ $(filter %.o,$^) - -quiet_cmd_alink_thin = AR($(TOOLSET)) $@ -cmd_alink_thin = rm -f $@ && $(AR.$(TOOLSET)) crsT $@ $(filter %.o,$^) - -# Due to circular dependencies between libraries :(, we wrap the -# special "figure out circular dependencies" flags around the entire -# input list during linking. -quiet_cmd_link = LINK($(TOOLSET)) $@ -cmd_link = $(LINK.$(TOOLSET)) -o $@ $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -Wl,--start-group $(LD_INPUTS) $(LIBS) -Wl,--end-group - -# Note: this does not handle spaces in paths -define xargs - $(1) $(word 1,$(2)) -$(if $(word 2,$(2)),$(call xargs,$(1),$(wordlist 2,$(words $(2)),$(2)))) -endef - -define write-to-file - @: >$(1) -$(call xargs,@printf "%s\\n" >>$(1),$(2)) -endef - -OBJ_FILE_LIST := ar-file-list - -define create_archive - rm -f $(1) $(1).$(OBJ_FILE_LIST); mkdir -p `dirname $(1)` - $(call write-to-file,$(1).$(OBJ_FILE_LIST),$(filter %.o,$(2))) - $(AR.$(TOOLSET)) crs $(1) @$(1).$(OBJ_FILE_LIST) -endef - -define create_thin_archive - rm -f $(1) $(OBJ_FILE_LIST); mkdir -p `dirname $(1)` - $(call write-to-file,$(1).$(OBJ_FILE_LIST),$(filter %.o,$(2))) - $(AR.$(TOOLSET)) crsT $(1) @$(1).$(OBJ_FILE_LIST) -endef - -# We support two kinds of shared objects (.so): -# 1) shared_library, which is just bundling together many dependent libraries -# into a link line. -# 2) loadable_module, which is generating a module intended for dlopen(). -# -# They differ only slightly: -# In the former case, we want to package all dependent code into the .so. -# In the latter case, we want to package just the API exposed by the -# outermost module. -# This means shared_library uses --whole-archive, while loadable_module doesn't. -# (Note that --whole-archive is incompatible with the --start-group used in -# normal linking.) - -# Other shared-object link notes: -# - Set SONAME to the library filename so our binaries don't reference -# the local, absolute paths used on the link command-line. -quiet_cmd_solink = SOLINK($(TOOLSET)) $@ -cmd_solink = $(LINK.$(TOOLSET)) -o $@ -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -Wl,-soname=$(@F) -Wl,--whole-archive $(LD_INPUTS) -Wl,--no-whole-archive $(LIBS) - -quiet_cmd_solink_module = SOLINK_MODULE($(TOOLSET)) $@ -cmd_solink_module = $(LINK.$(TOOLSET)) -o $@ -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -Wl,-soname=$(@F) -Wl,--start-group $(filter-out FORCE_DO_CMD, $^) -Wl,--end-group $(LIBS) -""" # noqa: E501 - -LINK_COMMANDS_MAC = """\ -quiet_cmd_alink = LIBTOOL-STATIC $@ -cmd_alink = rm -f $@ && %(python)s gyp-mac-tool filter-libtool libtool $(GYP_LIBTOOLFLAGS) -static -o $@ $(filter %%.o,$^) - -quiet_cmd_link = LINK($(TOOLSET)) $@ -cmd_link = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o "$@" $(LD_INPUTS) $(LIBS) - -quiet_cmd_solink = SOLINK($(TOOLSET)) $@ -cmd_solink = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o "$@" $(LD_INPUTS) $(LIBS) - -quiet_cmd_solink_module = SOLINK_MODULE($(TOOLSET)) $@ -cmd_solink_module = $(LINK.$(TOOLSET)) -bundle $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(filter-out FORCE_DO_CMD, $^) $(LIBS) -""" % {"python": sys.executable} # noqa: E501 - -LINK_COMMANDS_ANDROID = """\ -quiet_cmd_alink = AR($(TOOLSET)) $@ -cmd_alink = rm -f $@ && $(AR.$(TOOLSET)) crs $@ $(filter %.o,$^) - -quiet_cmd_alink_thin = AR($(TOOLSET)) $@ -cmd_alink_thin = rm -f $@ && $(AR.$(TOOLSET)) crsT $@ $(filter %.o,$^) - -# Note: this does not handle spaces in paths -define xargs - $(1) $(word 1,$(2)) -$(if $(word 2,$(2)),$(call xargs,$(1),$(wordlist 2,$(words $(2)),$(2)))) -endef - -define write-to-file - @: >$(1) -$(call xargs,@printf "%s\\n" >>$(1),$(2)) -endef - -OBJ_FILE_LIST := ar-file-list - -define create_archive - rm -f $(1) $(1).$(OBJ_FILE_LIST); mkdir -p `dirname $(1)` - $(call write-to-file,$(1).$(OBJ_FILE_LIST),$(filter %.o,$(2))) - $(AR.$(TOOLSET)) crs $(1) @$(1).$(OBJ_FILE_LIST) -endef - -define create_thin_archive - rm -f $(1) $(OBJ_FILE_LIST); mkdir -p `dirname $(1)` - $(call write-to-file,$(1).$(OBJ_FILE_LIST),$(filter %.o,$(2))) - $(AR.$(TOOLSET)) crsT $(1) @$(1).$(OBJ_FILE_LIST) -endef - -# Due to circular dependencies between libraries :(, we wrap the -# special "figure out circular dependencies" flags around the entire -# input list during linking. -quiet_cmd_link = LINK($(TOOLSET)) $@ -quiet_cmd_link_host = LINK($(TOOLSET)) $@ -cmd_link = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ -Wl,--start-group $(LD_INPUTS) -Wl,--end-group $(LIBS) -cmd_link_host = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ -Wl,--start-group $(LD_INPUTS) -Wl,--end-group $(LIBS) - -# Other shared-object link notes: -# - Set SONAME to the library filename so our binaries don't reference -# the local, absolute paths used on the link command-line. -quiet_cmd_solink = SOLINK($(TOOLSET)) $@ -cmd_solink = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -Wl,-soname=$(@F) -o $@ -Wl,--whole-archive $(LD_INPUTS) -Wl,--no-whole-archive $(LIBS) - -quiet_cmd_solink_module = SOLINK_MODULE($(TOOLSET)) $@ -cmd_solink_module = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -Wl,-soname=$(@F) -o $@ -Wl,--start-group $(filter-out FORCE_DO_CMD, $^) -Wl,--end-group $(LIBS) -quiet_cmd_solink_module_host = SOLINK_MODULE($(TOOLSET)) $@ -cmd_solink_module_host = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -Wl,-soname=$(@F) -o $@ $(filter-out FORCE_DO_CMD, $^) $(LIBS) -""" # noqa: E501 - - -LINK_COMMANDS_AIX = """\ -quiet_cmd_alink = AR($(TOOLSET)) $@ -cmd_alink = rm -f $@ && $(AR.$(TOOLSET)) -X32_64 crs $@ $(filter %.o,$^) - -quiet_cmd_alink_thin = AR($(TOOLSET)) $@ -cmd_alink_thin = rm -f $@ && $(AR.$(TOOLSET)) -X32_64 crs $@ $(filter %.o,$^) - -quiet_cmd_link = LINK($(TOOLSET)) $@ -cmd_link = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(LD_INPUTS) $(LIBS) - -quiet_cmd_solink = SOLINK($(TOOLSET)) $@ -cmd_solink = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(LD_INPUTS) $(LIBS) - -quiet_cmd_solink_module = SOLINK_MODULE($(TOOLSET)) $@ -cmd_solink_module = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(filter-out FORCE_DO_CMD, $^) $(LIBS) -""" # noqa: E501 - - -LINK_COMMANDS_OS400 = """\ -quiet_cmd_alink = AR($(TOOLSET)) $@ -cmd_alink = rm -f $@ && $(AR.$(TOOLSET)) -X64 crs $@ $(filter %.o,$^) - -quiet_cmd_alink_thin = AR($(TOOLSET)) $@ -cmd_alink_thin = rm -f $@ && $(AR.$(TOOLSET)) -X64 crs $@ $(filter %.o,$^) - -quiet_cmd_link = LINK($(TOOLSET)) $@ -cmd_link = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(LD_INPUTS) $(LIBS) - -quiet_cmd_solink = SOLINK($(TOOLSET)) $@ -cmd_solink = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(LD_INPUTS) $(LIBS) - -quiet_cmd_solink_module = SOLINK_MODULE($(TOOLSET)) $@ -cmd_solink_module = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(filter-out FORCE_DO_CMD, $^) $(LIBS) -""" # noqa: E501 - - -LINK_COMMANDS_OS390 = """\ -quiet_cmd_alink = AR($(TOOLSET)) $@ -cmd_alink = rm -f $@ && $(AR.$(TOOLSET)) crs $@ $(filter %.o,$^) - -quiet_cmd_alink_thin = AR($(TOOLSET)) $@ -cmd_alink_thin = rm -f $@ && $(AR.$(TOOLSET)) crsT $@ $(filter %.o,$^) - -quiet_cmd_link = LINK($(TOOLSET)) $@ -cmd_link = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(LD_INPUTS) $(LIBS) - -quiet_cmd_solink = SOLINK($(TOOLSET)) $@ -cmd_solink = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(LD_INPUTS) $(LIBS) - -quiet_cmd_solink_module = SOLINK_MODULE($(TOOLSET)) $@ -cmd_solink_module = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(filter-out FORCE_DO_CMD, $^) $(LIBS) -""" # noqa: E501 - - -# Header of toplevel Makefile. -# This should go into the build tree, but it's easier to keep it here for now. -SHARED_HEADER = ( - """\ -# We borrow heavily from the kernel build setup, though we are simpler since -# we don't have Kconfig tweaking settings on us. - -# The implicit make rules have it looking for RCS files, among other things. -# We instead explicitly write all the rules we care about. -# It's even quicker (saves ~200ms) to pass -r on the command line. -MAKEFLAGS=-r - -# The source directory tree. -srcdir := %(srcdir)s -abs_srcdir := $(abspath $(srcdir)) - -# The name of the builddir. -builddir_name ?= %(builddir)s - -# The V=1 flag on command line makes us verbosely print command lines. -ifdef V - quiet= -else - quiet=quiet_ -endif - -# Specify BUILDTYPE=Release on the command line for a release build. -BUILDTYPE ?= %(default_configuration)s - -# Directory all our build output goes into. -# Note that this must be two directories beneath src/ for unit tests to pass, -# as they reach into the src/ directory for data with relative paths. -builddir ?= $(builddir_name)/$(BUILDTYPE) -abs_builddir := $(abspath $(builddir)) -depsdir := $(builddir)/.deps - -# Object output directory. -obj := $(builddir)/obj -abs_obj := $(abspath $(obj)) - -# We build up a list of every single one of the targets so we can slurp in the -# generated dependency rule Makefiles in one pass. -all_deps := - -%(make_global_settings)s - -CC.target ?= %(CC.target)s -CFLAGS.target ?= $(CPPFLAGS) $(CFLAGS) -CXX.target ?= %(CXX.target)s -CXXFLAGS.target ?= $(CPPFLAGS) $(CXXFLAGS) -LINK.target ?= %(LINK.target)s -LDFLAGS.target ?= $(LDFLAGS) -AR.target ?= %(AR.target)s -PLI.target ?= %(PLI.target)s - -# C++ apps need to be linked with g++. -LINK ?= $(CXX.target) - -# TODO(evan): move all cross-compilation logic to gyp-time so we don't need -# to replicate this environment fallback in make as well. -CC.host ?= %(CC.host)s -CFLAGS.host ?= $(CPPFLAGS_host) $(CFLAGS_host) -CXX.host ?= %(CXX.host)s -CXXFLAGS.host ?= $(CPPFLAGS_host) $(CXXFLAGS_host) -LINK.host ?= %(LINK.host)s -LDFLAGS.host ?= $(LDFLAGS_host) -AR.host ?= %(AR.host)s -PLI.host ?= %(PLI.host)s - -# Define a dir function that can handle spaces. -# http://www.gnu.org/software/make/manual/make.html#Syntax-of-Functions -# "leading spaces cannot appear in the text of the first argument as written. -# These characters can be put into the argument value by variable substitution." -empty := -space := $(empty) $(empty) - -# http://stackoverflow.com/questions/1189781/using-make-dir-or-notdir-on-a-path-with-spaces -replace_spaces = $(subst $(space),""" - + SPACE_REPLACEMENT - + """,$1) -unreplace_spaces = $(subst """ - + SPACE_REPLACEMENT - + """,$(space),$1) -dirx = $(call unreplace_spaces,$(dir $(call replace_spaces,$1))) - -# Flags to make gcc output dependency info. Note that you need to be -# careful here to use the flags that ccache and distcc can understand. -# We write to a dep file on the side first and then rename at the end -# so we can't end up with a broken dep file. -depfile = $(depsdir)/$(call replace_spaces,$@).d -DEPFLAGS = %(makedep_args)s -MF $(depfile).raw - -# We have to fixup the deps output in a few ways. -# (1) the file output should mention the proper .o file. -# ccache or distcc lose the path to the target, so we convert a rule of -# the form: -# foobar.o: DEP1 DEP2 -# into -# path/to/foobar.o: DEP1 DEP2 -# (2) we want missing files not to cause us to fail to build. -# We want to rewrite -# foobar.o: DEP1 DEP2 \\ -# DEP3 -# to -# DEP1: -# DEP2: -# DEP3: -# so if the files are missing, they're just considered phony rules. -# We have to do some pretty insane escaping to get those backslashes -# and dollar signs past make, the shell, and sed at the same time. -# Doesn't work with spaces, but that's fine: .d files have spaces in -# their names replaced with other characters.""" - r""" -define fixup_dep -# The depfile may not exist if the input file didn't have any #includes. -touch $(depfile).raw -# Fixup path as in (1).""" - + ( - r""" -sed -e "s|^$(notdir $@)|$@|" -re 's/\\\\([^$$])/\/\1/g' $(depfile).raw >> $(depfile)""" - if sys.platform == "win32" - else r""" -sed -e "s|^$(notdir $@)|$@|" $(depfile).raw >> $(depfile)""" - ) - + r""" -# Add extra rules as in (2). -# We remove slashes and replace spaces with new lines; -# remove blank lines; -# delete the first line and append a colon to the remaining lines.""" - + ( - """ -sed -e 's/\\\\\\\\$$//' -e 's/\\\\\\\\/\\//g' -e 'y| |\\n|' $(depfile).raw |\\""" - if sys.platform == "win32" - else """ -sed -e 's|\\\\||' -e 'y| |\\n|' $(depfile).raw |\\""" - ) - + r""" - grep -v '^$$' |\ - sed -e 1d -e 's|$$|:|' \ - >> $(depfile) -rm $(depfile).raw -endef -""" - """ -# Command definitions: -# - cmd_foo is the actual command to run; -# - quiet_cmd_foo is the brief-output summary of the command. - -quiet_cmd_cc = CC($(TOOLSET)) $@ -cmd_cc = $(CC.$(TOOLSET)) -o $@ $< $(GYP_CFLAGS) $(DEPFLAGS) $(CFLAGS.$(TOOLSET)) -c - -quiet_cmd_cxx = CXX($(TOOLSET)) $@ -cmd_cxx = $(CXX.$(TOOLSET)) -o $@ $< $(GYP_CXXFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -c -%(extra_commands)s -quiet_cmd_touch = TOUCH $@ -cmd_touch = touch $@ - -quiet_cmd_copy = COPY $@ -# send stderr to /dev/null to ignore messages when linking directories. -cmd_copy = ln -f "$<" "$@" 2>/dev/null || (rm -rf "$@" && cp %(copy_archive_args)s "$<" "$@") - -quiet_cmd_symlink = SYMLINK $@ -cmd_symlink = ln -sf "$<" "$@" - -%(link_commands)s -""" # noqa: E501 - r""" -# Define an escape_quotes function to escape single quotes. -# This allows us to handle quotes properly as long as we always use -# use single quotes and escape_quotes. -escape_quotes = $(subst ','\'',$(1)) -# This comment is here just to include a ' to unconfuse syntax highlighting. -# Define an escape_vars function to escape '$' variable syntax. -# This allows us to read/write command lines with shell variables (e.g. -# $LD_LIBRARY_PATH), without triggering make substitution. -escape_vars = $(subst $$,$$$$,$(1)) -# Helper that expands to a shell command to echo a string exactly as it is in -# make. This uses printf instead of echo because printf's behaviour with respect -# to escape sequences is more portable than echo's across different shells -# (e.g., dash, bash). -exact_echo = printf '%%s\n' '$(call escape_quotes,$(1))' -""" - """ -# Helper to compare the command we're about to run against the command -# we logged the last time we ran the command. Produces an empty -# string (false) when the commands match. -# Tricky point: Make has no string-equality test function. -# The kernel uses the following, but it seems like it would have false -# positives, where one string reordered its arguments. -# arg_check = $(strip $(filter-out $(cmd_$(1)), $(cmd_$@)) \\ -# $(filter-out $(cmd_$@), $(cmd_$(1)))) -# We instead substitute each for the empty string into the other, and -# say they're equal if both substitutions produce the empty string. -# .d files contain """ - + SPACE_REPLACEMENT - + """ instead of spaces, take that into account. -command_changed = $(or $(subst $(cmd_$(1)),,$(cmd_$(call replace_spaces,$@))),\\ - $(subst $(cmd_$(call replace_spaces,$@)),,$(cmd_$(1)))) - -# Helper that is non-empty when a prerequisite changes. -# Normally make does this implicitly, but we force rules to always run -# so we can check their command lines. -# $? -- new prerequisites -# $| -- order-only dependencies -prereq_changed = $(filter-out FORCE_DO_CMD,$(filter-out $|,$?)) - -# Helper that executes all postbuilds until one fails. -define do_postbuilds - @E=0;\\ - for p in $(POSTBUILDS); do\\ - eval $$p;\\ - E=$$?;\\ - if [ $$E -ne 0 ]; then\\ - break;\\ - fi;\\ - done;\\ - if [ $$E -ne 0 ]; then\\ - rm -rf "$@";\\ - exit $$E;\\ - fi -endef - -# do_cmd: run a command via the above cmd_foo names, if necessary. -# Should always run for a given target to handle command-line changes. -# Second argument, if non-zero, makes it do asm/C/C++ dependency munging. -# Third argument, if non-zero, makes it do POSTBUILDS processing. -# Note: We intentionally do NOT call dirx for depfile, since it contains """ - + SPACE_REPLACEMENT - + """ for -# spaces already and dirx strips the """ - + SPACE_REPLACEMENT - + """ characters. -define do_cmd -$(if $(or $(command_changed),$(prereq_changed)), - @$(call exact_echo, $($(quiet)cmd_$(1))) - @mkdir -p "$(call dirx,$@)" "$(dir $(depfile))" - $(if $(findstring flock,$(word %(flock_index)d,$(cmd_$1))), - @$(cmd_$(1)) - @echo " $(quiet_cmd_$(1)): Finished", - @$(cmd_$(1)) - ) - @$(call exact_echo,$(call escape_vars,cmd_$(call replace_spaces,$@) := $(cmd_$(1)))) > $(depfile) - @$(if $(2),$(fixup_dep)) - $(if $(and $(3), $(POSTBUILDS)), - $(call do_postbuilds) - ) -) -endef - -# Declare the "%(default_target)s" target first so it is the default, -# even though we don't have the deps yet. -.PHONY: %(default_target)s -%(default_target)s: - -# make looks for ways to re-generate included makefiles, but in our case, we -# don't have a direct way. Explicitly telling make that it has nothing to do -# for them makes it go faster. -%%.d: ; - -# Use FORCE_DO_CMD to force a target to run. Should be coupled with -# do_cmd. -.PHONY: FORCE_DO_CMD -FORCE_DO_CMD: - -""" # noqa: E501 -) - -SHARED_HEADER_MAC_COMMANDS = """ -quiet_cmd_objc = CXX($(TOOLSET)) $@ -cmd_objc = $(CC.$(TOOLSET)) $(GYP_OBJCFLAGS) $(DEPFLAGS) -c -o $@ $< - -quiet_cmd_objcxx = CXX($(TOOLSET)) $@ -cmd_objcxx = $(CXX.$(TOOLSET)) $(GYP_OBJCXXFLAGS) $(DEPFLAGS) -c -o $@ $< - -# Commands for precompiled header files. -quiet_cmd_pch_c = CXX($(TOOLSET)) $@ -cmd_pch_c = $(CC.$(TOOLSET)) $(GYP_PCH_CFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -c -o $@ $< -quiet_cmd_pch_cc = CXX($(TOOLSET)) $@ -cmd_pch_cc = $(CC.$(TOOLSET)) $(GYP_PCH_CXXFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -c -o $@ $< -quiet_cmd_pch_m = CXX($(TOOLSET)) $@ -cmd_pch_m = $(CC.$(TOOLSET)) $(GYP_PCH_OBJCFLAGS) $(DEPFLAGS) -c -o $@ $< -quiet_cmd_pch_mm = CXX($(TOOLSET)) $@ -cmd_pch_mm = $(CC.$(TOOLSET)) $(GYP_PCH_OBJCXXFLAGS) $(DEPFLAGS) -c -o $@ $< - -# gyp-mac-tool is written next to the root Makefile by gyp. -# Use $(4) for the command, since $(2) and $(3) are used as flag by do_cmd -# already. -quiet_cmd_mac_tool = MACTOOL $(4) $< -cmd_mac_tool = %(python)s gyp-mac-tool $(4) $< "$@" - -quiet_cmd_mac_package_framework = PACKAGE FRAMEWORK $@ -cmd_mac_package_framework = %(python)s gyp-mac-tool package-framework "$@" $(4) - -quiet_cmd_infoplist = INFOPLIST $@ -cmd_infoplist = $(CC.$(TOOLSET)) -E -P -Wno-trigraphs -x c $(INFOPLIST_DEFINES) "$<" -o "$@" -""" % {"python": sys.executable} # noqa: E501 - - -def WriteRootHeaderSuffixRules(writer): - extensions = sorted(COMPILABLE_EXTENSIONS.keys(), key=str.lower) - - writer.write("# Suffix rules, putting all outputs into $(obj).\n") - for ext in extensions: - writer.write("$(obj).$(TOOLSET)/%%.o: $(srcdir)/%%%s FORCE_DO_CMD\n" % ext) - writer.write("\t@$(call do_cmd,%s,1)\n" % COMPILABLE_EXTENSIONS[ext]) - - writer.write("\n# Try building from generated source, too.\n") - for ext in extensions: - writer.write( - "$(obj).$(TOOLSET)/%%.o: $(obj).$(TOOLSET)/%%%s FORCE_DO_CMD\n" % ext - ) - writer.write("\t@$(call do_cmd,%s,1)\n" % COMPILABLE_EXTENSIONS[ext]) - writer.write("\n") - for ext in extensions: - writer.write("$(obj).$(TOOLSET)/%%.o: $(obj)/%%%s FORCE_DO_CMD\n" % ext) - writer.write("\t@$(call do_cmd,%s,1)\n" % COMPILABLE_EXTENSIONS[ext]) - writer.write("\n") - - -SHARED_HEADER_OS390_COMMANDS = """ -PLIFLAGS.target ?= -qlp=64 -qlimits=extname=31 $(PLIFLAGS) -PLIFLAGS.host ?= -qlp=64 -qlimits=extname=31 $(PLIFLAGS) - -quiet_cmd_pli = PLI($(TOOLSET)) $@ -cmd_pli = $(PLI.$(TOOLSET)) $(GYP_PLIFLAGS) $(PLIFLAGS.$(TOOLSET)) -c $< && \ - if [ -f $(notdir $@) ]; then /bin/cp $(notdir $@) $@; else true; fi -""" - -SHARED_HEADER_SUFFIX_RULES_COMMENT1 = """\ -# Suffix rules, putting all outputs into $(obj). -""" - - -SHARED_HEADER_SUFFIX_RULES_COMMENT2 = """\ -# Try building from generated source, too. -""" - - -SHARED_FOOTER = """\ -# "all" is a concatenation of the "all" targets from all the included -# sub-makefiles. This is just here to clarify. -all: - -# Add in dependency-tracking rules. $(all_deps) is the list of every single -# target in our tree. Only consider the ones with .d (dependency) info: -d_files := $(wildcard $(foreach f,$(all_deps),$(depsdir)/$(f).d)) -ifneq ($(d_files),) - include $(d_files) -endif -""" - -header = """\ -# This file is generated by gyp; do not edit. - -""" - -# Maps every compilable file extension to the do_cmd that compiles it. -COMPILABLE_EXTENSIONS = { - ".c": "cc", - ".cc": "cxx", - ".cpp": "cxx", - ".cxx": "cxx", - ".s": "cc", - ".S": "cc", -} - - -def Compilable(filename): - """Return true if the file is compilable (should be in OBJS).""" - return any(res for res in (filename.endswith(e) for e in COMPILABLE_EXTENSIONS)) - - -def Linkable(filename): - """Return true if the file is linkable (should be on the link line).""" - return filename.endswith(".o") - - -def Target(filename): - """Translate a compilable filename to its .o target.""" - return os.path.splitext(filename)[0] + ".o" - - -def EscapeShellArgument(s): - """Quotes an argument so that it will be interpreted literally by a POSIX - shell. Taken from - http://stackoverflow.com/questions/35817/whats-the-best-way-to-escape-ossystem-calls-in-python - """ - return "'" + s.replace("'", "'\\''") + "'" - - -def EscapeMakeVariableExpansion(s): - """Make has its own variable expansion syntax using $. We must escape it for - string to be interpreted literally.""" - return s.replace("$", "$$") - - -def EscapeCppDefine(s): - """Escapes a CPP define so that it will reach the compiler unaltered.""" - s = EscapeShellArgument(s) - s = EscapeMakeVariableExpansion(s) - # '#' characters must be escaped even embedded in a string, else Make will - # treat it as the start of a comment. - return s.replace("#", r"\#") - - -def QuoteIfNecessary(string): - """TODO: Should this ideally be replaced with one or more of the above - functions?""" - if '"' in string: - string = '"' + string.replace('"', '\\"') + '"' - return string - - -def replace_sep(string): - if sys.platform == "win32": - string = string.replace("\\\\", "/").replace("\\", "/") - return string - - -def StringToMakefileVariable(string): - """Convert a string to a value that is acceptable as a make variable name.""" - return re.sub("[^a-zA-Z0-9_]", "_", string) - - -srcdir_prefix = "" - - -def Sourceify(path): - """Convert a path to its source directory form.""" - if "$(" in path: - return path - if os.path.isabs(path): - return path - return srcdir_prefix + path - - -def QuoteSpaces(s, quote=r"\ "): - return s.replace(" ", quote) - - -def SourceifyAndQuoteSpaces(path): - """Convert a path to its source directory form and quote spaces.""" - return QuoteSpaces(Sourceify(path)) - - -# Map from qualified target to path to output. -target_outputs = {} -# Map from qualified target to any linkable output. A subset -# of target_outputs. E.g. when mybinary depends on liba, we want to -# include liba in the linker line; when otherbinary depends on -# mybinary, we just want to build mybinary first. -target_link_deps = {} - - -class MakefileWriter: - """MakefileWriter packages up the writing of one target-specific foobar.mk. - - Its only real entry point is Write(), and is mostly used for namespacing. - """ - - def __init__(self, generator_flags, flavor): - self.generator_flags = generator_flags - self.flavor = flavor - - self.suffix_rules_srcdir = {} - self.suffix_rules_objdir1 = {} - self.suffix_rules_objdir2 = {} - - # Generate suffix rules for all compilable extensions. - for ext, value in COMPILABLE_EXTENSIONS.items(): - # Suffix rules for source folder. - self.suffix_rules_srcdir.update( - { - ext: ( - """\ -$(obj).$(TOOLSET)/$(TARGET)/%%.o: $(srcdir)/%%%s FORCE_DO_CMD -\t@$(call do_cmd,%s,1) -""" - % (ext, value) - ) - } - ) - - # Suffix rules for generated source files. - self.suffix_rules_objdir1.update( - { - ext: ( - """\ -$(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj).$(TOOLSET)/%%%s FORCE_DO_CMD -\t@$(call do_cmd,%s,1) -""" - % (ext, value) - ) - } - ) - self.suffix_rules_objdir2.update( - { - ext: ( - """\ -$(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)/%%%s FORCE_DO_CMD -\t@$(call do_cmd,%s,1) -""" - % (ext, value) - ) - } - ) - - def Write( - self, qualified_target, base_path, output_filename, spec, configs, part_of_all - ): - """The main entry point: writes a .mk file for a single target. - - Arguments: - qualified_target: target we're generating - base_path: path relative to source root we're building in, used to resolve - target-relative paths - output_filename: output .mk file name to write - spec, configs: gyp info - part_of_all: flag indicating this target is part of 'all' - """ - gyp.common.EnsureDirExists(output_filename) - - self.fp = open(output_filename, "w") - - self.fp.write(header) - - self.qualified_target = qualified_target - self.path = base_path - self.target = spec["target_name"] - self.type = spec["type"] - self.toolset = spec["toolset"] - - self.is_mac_bundle = gyp.xcode_emulation.IsMacBundle(self.flavor, spec) - if self.flavor == "mac": - self.xcode_settings = gyp.xcode_emulation.XcodeSettings(spec) - else: - self.xcode_settings = None - - deps, link_deps = self.ComputeDeps(spec) - - # Some of the generation below can add extra output, sources, or - # link dependencies. All of the out params of the functions that - # follow use names like extra_foo. - extra_outputs = [] - extra_sources = [] - extra_link_deps = [] - extra_mac_bundle_resources = [] - mac_bundle_deps = [] - - if self.is_mac_bundle: - self.output = self.ComputeMacBundleOutput(spec) - self.output_binary = self.ComputeMacBundleBinaryOutput(spec) - else: - self.output = self.output_binary = replace_sep(self.ComputeOutput(spec)) - - self.is_standalone_static_library = bool( - spec.get("standalone_static_library", 0) - ) - self._INSTALLABLE_TARGETS = ("executable", "loadable_module", "shared_library") - if self.is_standalone_static_library or self.type in self._INSTALLABLE_TARGETS: - self.alias = os.path.basename(self.output) - install_path = self._InstallableTargetInstallPath() - else: - self.alias = self.output - install_path = self.output - - self.WriteLn("TOOLSET := " + self.toolset) - self.WriteLn("TARGET := " + self.target) - - # Actions must come first, since they can generate more OBJs for use below. - if "actions" in spec: - self.WriteActions( - spec["actions"], - extra_sources, - extra_outputs, - extra_mac_bundle_resources, - part_of_all, - ) - - # Rules must be early like actions. - if "rules" in spec: - self.WriteRules( - spec["rules"], - extra_sources, - extra_outputs, - extra_mac_bundle_resources, - part_of_all, - ) - - if "copies" in spec: - self.WriteCopies(spec["copies"], extra_outputs, part_of_all) - - # Bundle resources. - if self.is_mac_bundle: - all_mac_bundle_resources = ( - spec.get("mac_bundle_resources", []) + extra_mac_bundle_resources - ) - self.WriteMacBundleResources(all_mac_bundle_resources, mac_bundle_deps) - self.WriteMacInfoPlist(mac_bundle_deps) - - # Sources. - all_sources = spec.get("sources", []) + extra_sources - if all_sources: - self.WriteSources( - configs, - deps, - all_sources, - extra_outputs, - extra_link_deps, - part_of_all, - gyp.xcode_emulation.MacPrefixHeader( - self.xcode_settings, - lambda p: Sourceify(self.Absolutify(p)), - self.Pchify, - ), - ) - sources = [x for x in all_sources if Compilable(x)] - if sources: - self.WriteLn(SHARED_HEADER_SUFFIX_RULES_COMMENT1) - extensions = {os.path.splitext(s)[1] for s in sources} - for ext in extensions: - if ext in self.suffix_rules_srcdir: - self.WriteLn(self.suffix_rules_srcdir[ext]) - self.WriteLn(SHARED_HEADER_SUFFIX_RULES_COMMENT2) - for ext in extensions: - if ext in self.suffix_rules_objdir1: - self.WriteLn(self.suffix_rules_objdir1[ext]) - for ext in extensions: - if ext in self.suffix_rules_objdir2: - self.WriteLn(self.suffix_rules_objdir2[ext]) - self.WriteLn("# End of this set of suffix rules") - - # Add dependency from bundle to bundle binary. - if self.is_mac_bundle: - mac_bundle_deps.append(self.output_binary) - - self.WriteTarget( - spec, - configs, - deps, - extra_link_deps + link_deps, - mac_bundle_deps, - extra_outputs, - part_of_all, - ) - - # Update global list of target outputs, used in dependency tracking. - target_outputs[qualified_target] = install_path - - # Update global list of link dependencies. - if self.type in ("static_library", "shared_library"): - target_link_deps[qualified_target] = self.output_binary - - # Currently any versions have the same effect, but in future the behavior - # could be different. - if self.generator_flags.get("android_ndk_version", None): - self.WriteAndroidNdkModuleRule(self.target, all_sources, link_deps) - - self.fp.close() - - def WriteSubMake(self, output_filename, makefile_path, targets, build_dir): - """Write a "sub-project" Makefile. - - This is a small, wrapper Makefile that calls the top-level Makefile to build - the targets from a single gyp file (i.e. a sub-project). - - Arguments: - output_filename: sub-project Makefile name to write - makefile_path: path to the top-level Makefile - targets: list of "all" targets for this sub-project - build_dir: build output directory, relative to the sub-project - """ - gyp.common.EnsureDirExists(output_filename) - self.fp = open(output_filename, "w") - self.fp.write(header) - # For consistency with other builders, put sub-project build output in the - # sub-project dir (see test/subdirectory/gyptest-subdir-all.py). - self.WriteLn( - "export builddir_name ?= %s" - % replace_sep(os.path.join(os.path.dirname(output_filename), build_dir)) - ) - self.WriteLn(".PHONY: all") - self.WriteLn("all:") - if makefile_path: - makefile_path = " -C " + makefile_path - self.WriteLn("\t$(MAKE){} {}".format(makefile_path, " ".join(targets))) - self.fp.close() - - def WriteActions( - self, - actions, - extra_sources, - extra_outputs, - extra_mac_bundle_resources, - part_of_all, - ): - """Write Makefile code for any 'actions' from the gyp input. - - extra_sources: a list that will be filled in with newly generated source - files, if any - extra_outputs: a list that will be filled in with any outputs of these - actions (used to make other pieces dependent on these - actions) - part_of_all: flag indicating this target is part of 'all' - """ - env = self.GetSortedXcodeEnv() - for action in actions: - name = StringToMakefileVariable( - "{}_{}".format(self.qualified_target, action["action_name"]) - ) - self.WriteLn('### Rules for action "%s":' % action["action_name"]) - inputs = action["inputs"] - outputs = action["outputs"] - - # Build up a list of outputs. - # Collect the output dirs we'll need. - dirs = set() - for out in outputs: - dir = os.path.split(out)[0] - if dir: - dirs.add(dir) - if int(action.get("process_outputs_as_sources", False)): - extra_sources += outputs - if int(action.get("process_outputs_as_mac_bundle_resources", False)): - extra_mac_bundle_resources += outputs - - # Write the actual command. - action_commands = action["action"] - if self.flavor == "mac": - action_commands = [ - gyp.xcode_emulation.ExpandEnvVars(command, env) - for command in action_commands - ] - command = gyp.common.EncodePOSIXShellList(action_commands) - if "message" in action: - self.WriteLn( - "quiet_cmd_{} = ACTION {} $@".format(name, action["message"]) - ) - else: - self.WriteLn(f"quiet_cmd_{name} = ACTION {name} $@") - if len(dirs) > 0: - command = "mkdir -p %s" % " ".join(dirs) + "; " + command - - cd_action = "cd %s; " % Sourceify(self.path or ".") - - # command and cd_action get written to a toplevel variable called - # cmd_foo. Toplevel variables can't handle things that change per - # makefile like $(TARGET), so hardcode the target. - command = command.replace("$(TARGET)", self.target) - cd_action = cd_action.replace("$(TARGET)", self.target) - - # Set LD_LIBRARY_PATH in case the action runs an executable from this - # build which links to shared libs from this build. - # actions run on the host, so they should in theory only use host - # libraries, but until everything is made cross-compile safe, also use - # target libraries. - # TODO(piman): when everything is cross-compile safe, remove lib.target - if self.flavor in {"zos", "aix"}: - self.WriteLn( - "cmd_%s = LIBPATH=$(builddir)/lib.host:" - "$(builddir)/lib.target:$$LIBPATH; " - "export LIBPATH; " - "%s%s" % (name, cd_action, command) - ) - else: - self.WriteLn( - "cmd_%s = LD_LIBRARY_PATH=$(builddir)/lib.host:" - "$(builddir)/lib.target:$$LD_LIBRARY_PATH; " - "export LD_LIBRARY_PATH; " - "%s%s" % (name, cd_action, command) - ) - self.WriteLn() - outputs = [self.Absolutify(o) for o in outputs] - # The makefile rules are all relative to the top dir, but the gyp actions - # are defined relative to their containing dir. This replaces the obj - # variable for the action rule with an absolute version so that the output - # goes in the right place. - # Only write the 'obj' and 'builddir' rules for the "primary" output (:1); - # it's superfluous for the "extra outputs", and this avoids accidentally - # writing duplicate dummy rules for those outputs. - # Same for environment. - self.WriteLn("%s: obj := $(abs_obj)" % QuoteSpaces(outputs[0])) - self.WriteLn("%s: builddir := $(abs_builddir)" % QuoteSpaces(outputs[0])) - self.WriteSortedXcodeEnv(outputs[0], self.GetSortedXcodeEnv()) - - for input in inputs: - assert " " not in input, ( - "Spaces in action input filenames not supported (%s)" % input - ) - for output in outputs: - assert " " not in output, ( - "Spaces in action output filenames not supported (%s)" % output - ) - - # See the comment in WriteCopies about expanding env vars. - outputs = [gyp.xcode_emulation.ExpandEnvVars(o, env) for o in outputs] - inputs = [gyp.xcode_emulation.ExpandEnvVars(i, env) for i in inputs] - - self.WriteDoCmd( - outputs, - [Sourceify(self.Absolutify(i)) for i in inputs], - part_of_all=part_of_all, - command=name, - ) - - # Stuff the outputs in a variable so we can refer to them later. - outputs_variable = "action_%s_outputs" % name - self.WriteLn("{} := {}".format(outputs_variable, " ".join(outputs))) - extra_outputs.append("$(%s)" % outputs_variable) - self.WriteLn() - - self.WriteLn() - - def WriteRules( - self, - rules, - extra_sources, - extra_outputs, - extra_mac_bundle_resources, - part_of_all, - ): - """Write Makefile code for any 'rules' from the gyp input. - - extra_sources: a list that will be filled in with newly generated source - files, if any - extra_outputs: a list that will be filled in with any outputs of these - rules (used to make other pieces dependent on these rules) - part_of_all: flag indicating this target is part of 'all' - """ - env = self.GetSortedXcodeEnv() - for rule in rules: - name = StringToMakefileVariable( - "{}_{}".format(self.qualified_target, rule["rule_name"]) - ) - count = 0 - self.WriteLn("### Generated for rule %s:" % name) - - all_outputs = [] - - for rule_source in rule.get("rule_sources", []): - dirs = set() - (rule_source_dirname, rule_source_basename) = os.path.split(rule_source) - (rule_source_root, _rule_source_ext) = os.path.splitext( - rule_source_basename - ) - - outputs = [ - self.ExpandInputRoot(out, rule_source_root, rule_source_dirname) - for out in rule["outputs"] - ] - - for out in outputs: - dir = os.path.dirname(out) - if dir: - dirs.add(dir) - if int(rule.get("process_outputs_as_sources", False)): - extra_sources += outputs - if int(rule.get("process_outputs_as_mac_bundle_resources", False)): - extra_mac_bundle_resources += outputs - inputs = [ - Sourceify(self.Absolutify(i)) - for i in [rule_source] + rule.get("inputs", []) - ] - actions = ["$(call do_cmd,%s_%d)" % (name, count)] - - if name == "resources_grit": - # HACK: This is ugly. Grit intentionally doesn't touch the - # timestamp of its output file when the file doesn't change, - # which is fine in hash-based dependency systems like scons - # and forge, but not kosher in the make world. After some - # discussion, hacking around it here seems like the least - # amount of pain. - actions += ["@touch --no-create $@"] - - # See the comment in WriteCopies about expanding env vars. - outputs = [gyp.xcode_emulation.ExpandEnvVars(o, env) for o in outputs] - inputs = [gyp.xcode_emulation.ExpandEnvVars(i, env) for i in inputs] - - outputs = [self.Absolutify(o) for o in outputs] - all_outputs += outputs - # Only write the 'obj' and 'builddir' rules for the "primary" output - # (:1); it's superfluous for the "extra outputs", and this avoids - # accidentally writing duplicate dummy rules for those outputs. - self.WriteLn("%s: obj := $(abs_obj)" % outputs[0]) - self.WriteLn("%s: builddir := $(abs_builddir)" % outputs[0]) - self.WriteMakeRule( - outputs, inputs, actions, command="%s_%d" % (name, count) - ) - # Spaces in rule filenames are not supported, but rule variables have - # spaces in them (e.g. RULE_INPUT_PATH expands to '$(abspath $<)'). - # The spaces within the variables are valid, so remove the variables - # before checking. - variables_with_spaces = re.compile(r"\$\([^ ]* \$<\)") - for output in outputs: - output = re.sub(variables_with_spaces, "", output) - assert " " not in output, ( - "Spaces in rule filenames not yet supported (%s)" % output - ) - self.WriteLn("all_deps += %s" % " ".join(outputs)) - - action = [ - self.ExpandInputRoot(ac, rule_source_root, rule_source_dirname) - for ac in rule["action"] - ] - mkdirs = "" - if len(dirs) > 0: - mkdirs = "mkdir -p %s; " % " ".join(dirs) - cd_action = "cd %s; " % Sourceify(self.path or ".") - - # action, cd_action, and mkdirs get written to a toplevel variable - # called cmd_foo. Toplevel variables can't handle things that change - # per makefile like $(TARGET), so hardcode the target. - if self.flavor == "mac": - action = [ - gyp.xcode_emulation.ExpandEnvVars(command, env) - for command in action - ] - action = gyp.common.EncodePOSIXShellList(action) - action = action.replace("$(TARGET)", self.target) - cd_action = cd_action.replace("$(TARGET)", self.target) - mkdirs = mkdirs.replace("$(TARGET)", self.target) - - # Set LD_LIBRARY_PATH in case the rule runs an executable from this - # build which links to shared libs from this build. - # rules run on the host, so they should in theory only use host - # libraries, but until everything is made cross-compile safe, also use - # target libraries. - # TODO(piman): when everything is cross-compile safe, remove lib.target - self.WriteLn( - "cmd_%(name)s_%(count)d = LD_LIBRARY_PATH=" - "$(builddir)/lib.host:$(builddir)/lib.target:$$LD_LIBRARY_PATH; " - "export LD_LIBRARY_PATH; " - "%(cd_action)s%(mkdirs)s%(action)s" - % { - "action": action, - "cd_action": cd_action, - "count": count, - "mkdirs": mkdirs, - "name": name, - } - ) - self.WriteLn( - "quiet_cmd_%(name)s_%(count)d = RULE %(name)s_%(count)d $@" - % {"count": count, "name": name} - ) - self.WriteLn() - count += 1 - - outputs_variable = "rule_%s_outputs" % name - self.WriteList(all_outputs, outputs_variable) - extra_outputs.append("$(%s)" % outputs_variable) - - self.WriteLn("### Finished generating for rule: %s" % name) - self.WriteLn() - self.WriteLn("### Finished generating for all rules") - self.WriteLn("") - - def WriteCopies(self, copies, extra_outputs, part_of_all): - """Write Makefile code for any 'copies' from the gyp input. - - extra_outputs: a list that will be filled in with any outputs of this action - (used to make other pieces dependent on this action) - part_of_all: flag indicating this target is part of 'all' - """ - self.WriteLn("### Generated for copy rule.") - - variable = StringToMakefileVariable(self.qualified_target + "_copies") - outputs = [] - for copy in copies: - for path in copy["files"]: - # Absolutify() may call normpath, and will strip trailing slashes. - path = Sourceify(self.Absolutify(path)) - filename = os.path.split(path)[1] - output = Sourceify( - self.Absolutify(os.path.join(copy["destination"], filename)) - ) - - # If the output path has variables in it, which happens in practice for - # 'copies', writing the environment as target-local doesn't work, - # because the variables are already needed for the target name. - # Copying the environment variables into global make variables doesn't - # work either, because then the .d files will potentially contain spaces - # after variable expansion, and .d file handling cannot handle spaces. - # As a workaround, manually expand variables at gyp time. Since 'copies' - # can't run scripts, there's no need to write the env then. - # WriteDoCmd() will escape spaces for .d files. - env = self.GetSortedXcodeEnv() - output = gyp.xcode_emulation.ExpandEnvVars(output, env) - path = gyp.xcode_emulation.ExpandEnvVars(path, env) - self.WriteDoCmd([output], [path], "copy", part_of_all) - outputs.append(output) - self.WriteLn( - "{} = {}".format(variable, " ".join(QuoteSpaces(o) for o in outputs)) - ) - extra_outputs.append("$(%s)" % variable) - self.WriteLn() - - def WriteMacBundleResources(self, resources, bundle_deps): - """Writes Makefile code for 'mac_bundle_resources'.""" - self.WriteLn("### Generated for mac_bundle_resources") - - for output, res in gyp.xcode_emulation.GetMacBundleResources( - generator_default_variables["PRODUCT_DIR"], - self.xcode_settings, - [Sourceify(self.Absolutify(r)) for r in resources], - ): - _, ext = os.path.splitext(output) - if ext != ".xcassets": - # Make does not supports '.xcassets' emulation. - self.WriteDoCmd( - [output], [res], "mac_tool,,,copy-bundle-resource", part_of_all=True - ) - bundle_deps.append(output) - - def WriteMacInfoPlist(self, bundle_deps): - """Write Makefile code for bundle Info.plist files.""" - info_plist, out, defines, extra_env = gyp.xcode_emulation.GetMacInfoPlist( - generator_default_variables["PRODUCT_DIR"], - self.xcode_settings, - lambda p: Sourceify(self.Absolutify(p)), - ) - if not info_plist: - return - if defines: - # Create an intermediate file to store preprocessed results. - intermediate_plist = "$(obj).$(TOOLSET)/$(TARGET)/" + os.path.basename( - info_plist - ) - self.WriteList( - defines, - intermediate_plist + ": INFOPLIST_DEFINES", - "-D", - quoter=EscapeCppDefine, - ) - self.WriteMakeRule( - [intermediate_plist], - [info_plist], - [ - "$(call do_cmd,infoplist)", - # "Convert" the plist so that any weird whitespace changes from the - # preprocessor do not affect the XML parser in mac_tool. - "@plutil -convert xml1 $@ $@", - ], - ) - info_plist = intermediate_plist - # plists can contain envvars and substitute them into the file. - self.WriteSortedXcodeEnv( - out, self.GetSortedXcodeEnv(additional_settings=extra_env) - ) - self.WriteDoCmd( - [out], [info_plist], "mac_tool,,,copy-info-plist", part_of_all=True - ) - bundle_deps.append(out) - - def WriteSources( - self, - configs, - deps, - sources, - extra_outputs, - extra_link_deps, - part_of_all, - precompiled_header, - ): - """Write Makefile code for any 'sources' from the gyp input. - These are source files necessary to build the current target. - - configs, deps, sources: input from gyp. - extra_outputs: a list of extra outputs this action should be dependent on; - used to serialize action/rules before compilation - extra_link_deps: a list that will be filled in with any outputs of - compilation (to be used in link lines) - part_of_all: flag indicating this target is part of 'all' - """ - - # Write configuration-specific variables for CFLAGS, etc. - for configname in sorted(configs.keys()): - config = configs[configname] - self.WriteList( - config.get("defines"), - "DEFS_%s" % configname, - prefix="-D", - quoter=EscapeCppDefine, - ) - - if self.flavor == "mac": - cflags = self.xcode_settings.GetCflags( - configname, arch=config.get("xcode_configuration_platform") - ) - cflags_c = self.xcode_settings.GetCflagsC(configname) - cflags_cc = self.xcode_settings.GetCflagsCC(configname) - cflags_objc = self.xcode_settings.GetCflagsObjC(configname) - cflags_objcc = self.xcode_settings.GetCflagsObjCC(configname) - else: - cflags = config.get("cflags") - cflags_c = config.get("cflags_c") - cflags_cc = config.get("cflags_cc") - - self.WriteLn("# Flags passed to all source files.") - self.WriteList(cflags, "CFLAGS_%s" % configname) - self.WriteLn("# Flags passed to only C files.") - self.WriteList(cflags_c, "CFLAGS_C_%s" % configname) - self.WriteLn("# Flags passed to only C++ files.") - self.WriteList(cflags_cc, "CFLAGS_CC_%s" % configname) - if self.flavor == "mac": - self.WriteLn("# Flags passed to only ObjC files.") - self.WriteList(cflags_objc, "CFLAGS_OBJC_%s" % configname) - self.WriteLn("# Flags passed to only ObjC++ files.") - self.WriteList(cflags_objcc, "CFLAGS_OBJCC_%s" % configname) - includes = config.get("include_dirs") - if includes: - includes = [Sourceify(self.Absolutify(i)) for i in includes] - self.WriteList(includes, "INCS_%s" % configname, prefix="-I") - - compilable = list(filter(Compilable, sources)) - objs = [self.Objectify(self.Absolutify(Target(c))) for c in compilable] - self.WriteList(objs, "OBJS") - - for obj in objs: - assert " " not in obj, "Spaces in object filenames not supported (%s)" % obj - self.WriteLn("# Add to the list of files we specially track dependencies for.") - self.WriteLn("all_deps += $(OBJS)") - self.WriteLn() - - # Make sure our dependencies are built first. - if deps: - self.WriteMakeRule( - ["$(OBJS)"], - deps, - comment="Make sure our dependencies are built before any of us.", - order_only=True, - ) - - # Make sure the actions and rules run first. - # If they generate any extra headers etc., the per-.o file dep tracking - # will catch the proper rebuilds, so order only is still ok here. - if extra_outputs: - self.WriteMakeRule( - ["$(OBJS)"], - extra_outputs, - comment="Make sure our actions/rules run before any of us.", - order_only=True, - ) - - if pchdeps := precompiled_header.GetObjDependencies(compilable, objs): - self.WriteLn("# Dependencies from obj files to their precompiled headers") - for source, obj, gch in pchdeps: - self.WriteLn(f"{obj}: {gch}") - self.WriteLn("# End precompiled header dependencies") - - if objs: - extra_link_deps.append("$(OBJS)") - self.WriteLn( - """\ -# CFLAGS et al overrides must be target-local. -# See "Target-specific Variable Values" in the GNU Make manual.""" - ) - self.WriteLn("$(OBJS): TOOLSET := $(TOOLSET)") - self.WriteLn( - "$(OBJS): GYP_CFLAGS := " - "$(DEFS_$(BUILDTYPE)) " - "$(INCS_$(BUILDTYPE)) " - "%s " % precompiled_header.GetInclude("c") + "$(CFLAGS_$(BUILDTYPE)) " - "$(CFLAGS_C_$(BUILDTYPE))" - ) - self.WriteLn( - "$(OBJS): GYP_CXXFLAGS := " - "$(DEFS_$(BUILDTYPE)) " - "$(INCS_$(BUILDTYPE)) " - "%s " % precompiled_header.GetInclude("cc") + "$(CFLAGS_$(BUILDTYPE)) " - "$(CFLAGS_CC_$(BUILDTYPE))" - ) - if self.flavor == "mac": - self.WriteLn( - "$(OBJS): GYP_OBJCFLAGS := " - "$(DEFS_$(BUILDTYPE)) " - "$(INCS_$(BUILDTYPE)) " - "%s " - % precompiled_header.GetInclude("m") - + "$(CFLAGS_$(BUILDTYPE)) " - "$(CFLAGS_C_$(BUILDTYPE)) " - "$(CFLAGS_OBJC_$(BUILDTYPE))" - ) - self.WriteLn( - "$(OBJS): GYP_OBJCXXFLAGS := " - "$(DEFS_$(BUILDTYPE)) " - "$(INCS_$(BUILDTYPE)) " - "%s " - % precompiled_header.GetInclude("mm") - + "$(CFLAGS_$(BUILDTYPE)) " - "$(CFLAGS_CC_$(BUILDTYPE)) " - "$(CFLAGS_OBJCC_$(BUILDTYPE))" - ) - - self.WritePchTargets(precompiled_header.GetPchBuildCommands()) - - # If there are any object files in our input file list, link them into our - # output. - extra_link_deps += [source for source in sources if Linkable(source)] - - self.WriteLn() - - def WritePchTargets(self, pch_commands): - """Writes make rules to compile prefix headers.""" - if not pch_commands: - return - - for gch, lang_flag, lang, input in pch_commands: - extra_flags = { - "c": "$(CFLAGS_C_$(BUILDTYPE))", - "cc": "$(CFLAGS_CC_$(BUILDTYPE))", - "m": "$(CFLAGS_C_$(BUILDTYPE)) $(CFLAGS_OBJC_$(BUILDTYPE))", - "mm": "$(CFLAGS_CC_$(BUILDTYPE)) $(CFLAGS_OBJCC_$(BUILDTYPE))", - }[lang] - var_name = { - "c": "GYP_PCH_CFLAGS", - "cc": "GYP_PCH_CXXFLAGS", - "m": "GYP_PCH_OBJCFLAGS", - "mm": "GYP_PCH_OBJCXXFLAGS", - }[lang] - self.WriteLn( - f"{gch}: {var_name} := {lang_flag} " + "$(DEFS_$(BUILDTYPE)) " - "$(INCS_$(BUILDTYPE)) " - "$(CFLAGS_$(BUILDTYPE)) " + extra_flags - ) - - self.WriteLn(f"{gch}: {input} FORCE_DO_CMD") - self.WriteLn("\t@$(call do_cmd,pch_%s,1)" % lang) - self.WriteLn("") - assert " " not in gch, "Spaces in gch filenames not supported (%s)" % gch - self.WriteLn("all_deps += %s" % gch) - self.WriteLn("") - - def ComputeOutputBasename(self, spec): - """Return the 'output basename' of a gyp spec. - - E.g., the loadable module 'foobar' in directory 'baz' will produce - 'libfoobar.so' - """ - assert not self.is_mac_bundle - - if self.flavor == "mac" and self.type in ( - "static_library", - "executable", - "shared_library", - "loadable_module", - ): - return self.xcode_settings.GetExecutablePath() - - target = spec["target_name"] - target_prefix = "" - target_ext = "" - if self.type == "static_library": - if target[:3] == "lib": - target = target[3:] - target_prefix = "lib" - target_ext = ".a" - elif self.type in ("loadable_module", "shared_library"): - if target[:3] == "lib": - target = target[3:] - target_prefix = "lib" - if self.flavor == "aix": - target_ext = ".a" - elif self.flavor == "zos": - target_ext = ".x" - else: - target_ext = ".so" - elif self.type == "none": - target = "%s.stamp" % target - elif self.type != "executable": - print( - "ERROR: What output file should be generated?", - "type", - self.type, - "target", - target, - ) - - target_prefix = spec.get("product_prefix", target_prefix) - target = spec.get("product_name", target) - if product_ext := spec.get("product_extension"): - target_ext = "." + product_ext - - return target_prefix + target + target_ext - - def _InstallImmediately(self): - return ( - self.toolset == "target" - and self.flavor == "mac" - and self.type - in ("static_library", "executable", "shared_library", "loadable_module") - ) - - def ComputeOutput(self, spec): - """Return the 'output' (full output path) of a gyp spec. - - E.g., the loadable module 'foobar' in directory 'baz' will produce - '$(obj)/baz/libfoobar.so' - """ - assert not self.is_mac_bundle - - path = os.path.join("$(obj)." + self.toolset, self.path) - if self.type == "executable" or self._InstallImmediately(): - path = "$(builddir)" - path = spec.get("product_dir", path) - return os.path.join(path, self.ComputeOutputBasename(spec)) - - def ComputeMacBundleOutput(self, spec): - """Return the 'output' (full output path) to a bundle output directory.""" - assert self.is_mac_bundle - path = generator_default_variables["PRODUCT_DIR"] - return os.path.join(path, self.xcode_settings.GetWrapperName()) - - def ComputeMacBundleBinaryOutput(self, spec): - """Return the 'output' (full output path) to the binary in a bundle.""" - path = generator_default_variables["PRODUCT_DIR"] - return os.path.join(path, self.xcode_settings.GetExecutablePath()) - - def ComputeDeps(self, spec): - """Compute the dependencies of a gyp spec. - - Returns a tuple (deps, link_deps), where each is a list of - filenames that will need to be put in front of make for either - building (deps) or linking (link_deps). - """ - deps = [] - link_deps = [] - if "dependencies" in spec: - deps.extend( - [ - target_outputs[dep] - for dep in spec["dependencies"] - if target_outputs[dep] - ] - ) - for dep in spec["dependencies"]: - if dep in target_link_deps: - link_deps.append(target_link_deps[dep]) - deps.extend(link_deps) - # TODO: It seems we need to transitively link in libraries (e.g. -lfoo)? - # This hack makes it work: - # link_deps.extend(spec.get('libraries', [])) - return (gyp.common.uniquer(deps), gyp.common.uniquer(link_deps)) - - def GetSharedObjectFromSidedeck(self, sidedeck): - """Return the shared object files based on sidedeck""" - return re.sub(r"\.x$", ".so", sidedeck) - - def GetUnversionedSidedeckFromSidedeck(self, sidedeck): - """Return the shared object files based on sidedeck""" - return re.sub(r"\.\d+\.x$", ".x", sidedeck) - - def WriteDependencyOnExtraOutputs(self, target, extra_outputs): - self.WriteMakeRule( - [self.output_binary], - extra_outputs, - comment="Build our special outputs first.", - order_only=True, - ) - - def WriteTarget( - self, spec, configs, deps, link_deps, bundle_deps, extra_outputs, part_of_all - ): - """Write Makefile code to produce the final target of the gyp spec. - - spec, configs: input from gyp. - deps, link_deps: dependency lists; see ComputeDeps() - extra_outputs: any extra outputs that our target should depend on - part_of_all: flag indicating this target is part of 'all' - """ - - self.WriteLn("### Rules for final target.") - - if extra_outputs: - self.WriteDependencyOnExtraOutputs(self.output_binary, extra_outputs) - self.WriteMakeRule( - extra_outputs, - deps, - comment=("Preserve order dependency of special output on deps."), - order_only=True, - ) - - target_postbuilds = {} - if self.type != "none": - for configname in sorted(configs.keys()): - config = configs[configname] - if self.flavor == "mac": - ldflags = self.xcode_settings.GetLdflags( - configname, - generator_default_variables["PRODUCT_DIR"], - lambda p: Sourceify(self.Absolutify(p)), - arch=config.get("xcode_configuration_platform"), - ) - - # TARGET_POSTBUILDS_$(BUILDTYPE) is added to postbuilds later on. - gyp_to_build = gyp.common.InvertRelativePath(self.path) - target_postbuild = self.xcode_settings.AddImplicitPostbuilds( - configname, - QuoteSpaces( - os.path.normpath(os.path.join(gyp_to_build, self.output)) - ), - QuoteSpaces( - os.path.normpath( - os.path.join(gyp_to_build, self.output_binary) - ) - ), - ) - if target_postbuild: - target_postbuilds[configname] = target_postbuild - else: - ldflags = config.get("ldflags", []) - # Compute an rpath for this output if needed. - if any(dep.endswith(".so") or ".so." in dep for dep in deps): - # We want to get the literal string "$ORIGIN" - # into the link command, so we need lots of escaping. - ldflags.append(r"-Wl,-rpath=\$$ORIGIN/") - ldflags.append(r"-Wl,-rpath-link=\$(builddir)/") - if library_dirs := config.get("library_dirs", []): - library_dirs = [Sourceify(self.Absolutify(i)) for i in library_dirs] - ldflags += [("-L%s" % library_dir) for library_dir in library_dirs] - self.WriteList(ldflags, "LDFLAGS_%s" % configname) - if self.flavor == "mac": - self.WriteList( - self.xcode_settings.GetLibtoolflags(configname), - "LIBTOOLFLAGS_%s" % configname, - ) - libraries = spec.get("libraries") - if libraries: - # Remove duplicate entries - libraries = gyp.common.uniquer(libraries) - if self.flavor == "mac": - libraries = self.xcode_settings.AdjustLibraries(libraries) - self.WriteList(libraries, "LIBS") - self.WriteLn( - "%s: GYP_LDFLAGS := $(LDFLAGS_$(BUILDTYPE))" - % QuoteSpaces(self.output_binary) - ) - self.WriteLn("%s: LIBS := $(LIBS)" % QuoteSpaces(self.output_binary)) - - if self.flavor == "mac": - self.WriteLn( - "%s: GYP_LIBTOOLFLAGS := $(LIBTOOLFLAGS_$(BUILDTYPE))" - % QuoteSpaces(self.output_binary) - ) - - # Postbuild actions. Like actions, but implicitly depend on the target's - # output. - postbuilds = [] - if self.flavor == "mac": - if target_postbuilds: - postbuilds.append("$(TARGET_POSTBUILDS_$(BUILDTYPE))") - postbuilds.extend(gyp.xcode_emulation.GetSpecPostbuildCommands(spec)) - - if postbuilds: - # Envvars may be referenced by TARGET_POSTBUILDS_$(BUILDTYPE), - # so we must output its definition first, since we declare variables - # using ":=". - self.WriteSortedXcodeEnv(self.output, self.GetSortedXcodePostbuildEnv()) - - for configname, value in target_postbuilds.items(): - self.WriteLn( - "%s: TARGET_POSTBUILDS_%s := %s" - % ( - QuoteSpaces(self.output), - configname, - gyp.common.EncodePOSIXShellList(value), - ) - ) - - # Postbuilds expect to be run in the gyp file's directory, so insert an - # implicit postbuild to cd to there. - postbuilds.insert(0, gyp.common.EncodePOSIXShellList(["cd", self.path])) - for i, postbuild in enumerate(postbuilds): - if not postbuild.startswith("$"): - postbuilds[i] = EscapeShellArgument(postbuild) - self.WriteLn("%s: builddir := $(abs_builddir)" % QuoteSpaces(self.output)) - self.WriteLn( - "%s: POSTBUILDS := %s" - % (QuoteSpaces(self.output), " ".join(postbuilds)) - ) - - # A bundle directory depends on its dependencies such as bundle resources - # and bundle binary. When all dependencies have been built, the bundle - # needs to be packaged. - if self.is_mac_bundle: - # If the framework doesn't contain a binary, then nothing depends - # on the actions -- make the framework depend on them directly too. - self.WriteDependencyOnExtraOutputs(self.output, extra_outputs) - - # Bundle dependencies. Note that the code below adds actions to this - # target, so if you move these two lines, move the lines below as well. - self.WriteList([QuoteSpaces(dep) for dep in bundle_deps], "BUNDLE_DEPS") - self.WriteLn("%s: $(BUNDLE_DEPS)" % QuoteSpaces(self.output)) - - # After the framework is built, package it. Needs to happen before - # postbuilds, since postbuilds depend on this. - if self.type in ("shared_library", "loadable_module"): - self.WriteLn( - "\t@$(call do_cmd,mac_package_framework,,,%s)" - % self.xcode_settings.GetFrameworkVersion() - ) - - # Bundle postbuilds can depend on the whole bundle, so run them after - # the bundle is packaged, not already after the bundle binary is done. - if postbuilds: - self.WriteLn("\t@$(call do_postbuilds)") - postbuilds = [] # Don't write postbuilds for target's output. - - # Needed by test/mac/gyptest-rebuild.py. - self.WriteLn("\t@true # No-op, used by tests") - - # Since this target depends on binary and resources which are in - # nested subfolders, the framework directory will be older than - # its dependencies usually. To prevent this rule from executing - # on every build (expensive, especially with postbuilds), explicitly - # update the time on the framework directory. - self.WriteLn("\t@touch -c %s" % QuoteSpaces(self.output)) - - if postbuilds: - assert not self.is_mac_bundle, ( - "Postbuilds for bundles should be done " - "on the bundle, not the binary (target '%s')" % self.target - ) - assert "product_dir" not in spec, ( - "Postbuilds do not work with custom product_dir" - ) - - if self.type == "executable": - self.WriteLn( - "%s: LD_INPUTS := %s" - % ( - QuoteSpaces(self.output_binary), - " ".join(QuoteSpaces(dep) for dep in link_deps), - ) - ) - if self.toolset == "host" and self.flavor == "android": - self.WriteDoCmd( - [self.output_binary], - link_deps, - "link_host", - part_of_all, - postbuilds=postbuilds, - ) - else: - self.WriteDoCmd( - [self.output_binary], - link_deps, - "link", - part_of_all, - postbuilds=postbuilds, - ) - - elif self.type == "static_library": - for link_dep in link_deps: - assert " " not in link_dep, ( - "Spaces in alink input filenames not supported (%s)" % link_dep - ) - if ( - self.flavor not in ("mac", "openbsd", "netbsd", "win") - and not self.is_standalone_static_library - ): - if self.flavor in ("linux", "android", "openharmony"): - self.WriteMakeRule( - [self.output_binary], - link_deps, - actions=["$(call create_thin_archive,$@,$^)"], - ) - else: - self.WriteDoCmd( - [self.output_binary], - link_deps, - "alink_thin", - part_of_all, - postbuilds=postbuilds, - ) - elif self.flavor in ("linux", "android", "openharmony"): - self.WriteMakeRule( - [self.output_binary], - link_deps, - actions=["$(call create_archive,$@,$^)"], - ) - else: - self.WriteDoCmd( - [self.output_binary], - link_deps, - "alink", - part_of_all, - postbuilds=postbuilds, - ) - elif self.type == "shared_library": - self.WriteLn( - "%s: LD_INPUTS := %s" - % ( - QuoteSpaces(self.output_binary), - " ".join(QuoteSpaces(dep) for dep in link_deps), - ) - ) - self.WriteDoCmd( - [self.output_binary], - link_deps, - "solink", - part_of_all, - postbuilds=postbuilds, - ) - # z/OS has a .so target as well as a sidedeck .x target - if self.flavor == "zos": - self.WriteLn( - "%s: %s" - % ( - QuoteSpaces( - self.GetSharedObjectFromSidedeck(self.output_binary) - ), - QuoteSpaces(self.output_binary), - ) - ) - elif self.type == "loadable_module": - for link_dep in link_deps: - assert " " not in link_dep, ( - "Spaces in module input filenames not supported (%s)" % link_dep - ) - if self.toolset == "host" and self.flavor == "android": - self.WriteDoCmd( - [self.output_binary], - link_deps, - "solink_module_host", - part_of_all, - postbuilds=postbuilds, - ) - else: - self.WriteDoCmd( - [self.output_binary], - link_deps, - "solink_module", - part_of_all, - postbuilds=postbuilds, - ) - elif self.type == "none": - # Write a stamp line. - self.WriteDoCmd( - [self.output_binary], deps, "touch", part_of_all, postbuilds=postbuilds - ) - else: - print("WARNING: no output for", self.type, self.target) - - # Add an alias for each target (if there are any outputs). - # Installable target aliases are created below. - if (self.output and self.output != self.target) and ( - self.type not in self._INSTALLABLE_TARGETS - ): - self.WriteMakeRule( - [self.target], [self.output], comment="Add target alias", phony=True - ) - if part_of_all: - self.WriteMakeRule( - ["all"], - [self.target], - comment='Add target alias to "all" target.', - phony=True, - ) - - # Add special-case rules for our installable targets. - # 1) They need to install to the build dir or "product" dir. - # 2) They get shortcuts for building (e.g. "make chrome"). - # 3) They are part of "make all". - if self.type in self._INSTALLABLE_TARGETS or self.is_standalone_static_library: - if self.type == "shared_library": - file_desc = "shared library" - elif self.type == "static_library": - file_desc = "static library" - else: - file_desc = "executable" - install_path = self._InstallableTargetInstallPath() - installable_deps = [] - if self.flavor != "zos": - installable_deps.append(self.output) - if ( - self.flavor == "mac" - and "product_dir" not in spec - and self.toolset == "target" - ): - # On mac, products are created in install_path immediately. - assert install_path == self.output, f"{install_path} != {self.output}" - - # Point the target alias to the final binary output. - self.WriteMakeRule( - [self.target], [install_path], comment="Add target alias", phony=True - ) - if install_path != self.output: - assert not self.is_mac_bundle # See comment a few lines above. - self.WriteDoCmd( - [install_path], - [self.output], - "copy", - comment="Copy this to the %s output path." % file_desc, - part_of_all=part_of_all, - ) - if self.flavor != "zos": - installable_deps.append(install_path) - if self.flavor == "zos" and self.type == "shared_library": - # lib.target/libnode.so has a dependency on $(obj).target/libnode.so - self.WriteDoCmd( - [self.GetSharedObjectFromSidedeck(install_path)], - [self.GetSharedObjectFromSidedeck(self.output)], - "copy", - comment="Copy this to the %s output path." % file_desc, - part_of_all=part_of_all, - ) - # Create a symlink of libnode.x to libnode.version.x - self.WriteDoCmd( - [self.GetUnversionedSidedeckFromSidedeck(install_path)], - [install_path], - "symlink", - comment="Symlnk this to the %s output path." % file_desc, - part_of_all=part_of_all, - ) - # Place libnode.version.so and libnode.x symlink in lib.target dir - installable_deps.append(self.GetSharedObjectFromSidedeck(install_path)) - installable_deps.append( - self.GetUnversionedSidedeckFromSidedeck(install_path) - ) - if self.alias not in (self.output, self.target): - self.WriteMakeRule( - [self.alias], - installable_deps, - comment="Short alias for building this %s." % file_desc, - phony=True, - ) - if self.flavor == "zos" and self.type == "shared_library": - # Make sure that .x symlink target is run - self.WriteMakeRule( - ["all"], - [ - self.GetUnversionedSidedeckFromSidedeck(install_path), - self.GetSharedObjectFromSidedeck(install_path), - ], - comment='Add %s to "all" target.' % file_desc, - phony=True, - ) - elif part_of_all: - self.WriteMakeRule( - ["all"], - [install_path], - comment='Add %s to "all" target.' % file_desc, - phony=True, - ) - - def WriteList(self, value_list, variable=None, prefix="", quoter=QuoteIfNecessary): - """Write a variable definition that is a list of values. - - E.g. WriteList(['a','b'], 'foo', prefix='blah') writes out - foo = blaha blahb - but in a pretty-printed style. - """ - values = "" - if value_list: - value_list = [replace_sep(quoter(prefix + value)) for value in value_list] - values = " \\\n\t" + " \\\n\t".join(value_list) - self.fp.write(f"{variable} :={values}\n\n") - - def WriteDoCmd( - self, outputs, inputs, command, part_of_all, comment=None, postbuilds=False - ): - """Write a Makefile rule that uses do_cmd. - - This makes the outputs dependent on the command line that was run, - as well as support the V= make command line flag. - """ - suffix = "" - if postbuilds: - assert "," not in command - suffix = ",,1" # Tell do_cmd to honor $POSTBUILDS - self.WriteMakeRule( - outputs, - inputs, - actions=[f"$(call do_cmd,{command}{suffix})"], - comment=comment, - command=command, - force=True, - ) - # Add our outputs to the list of targets we read depfiles from. - # all_deps is only used for deps file reading, and for deps files we replace - # spaces with ? because escaping doesn't work with make's $(sort) and - # other functions. - outputs = [QuoteSpaces(o, SPACE_REPLACEMENT) for o in outputs] - self.WriteLn("all_deps += %s" % " ".join(outputs)) - - def WriteMakeRule( - self, - outputs, - inputs, - actions=None, - comment=None, - order_only=False, - force=False, - phony=False, - command=None, - ): - """Write a Makefile rule, with some extra tricks. - - outputs: a list of outputs for the rule (note: this is not directly - supported by make; see comments below) - inputs: a list of inputs for the rule - actions: a list of shell commands to run for the rule - comment: a comment to put in the Makefile above the rule (also useful - for making this Python script's code self-documenting) - order_only: if true, makes the dependency order-only - force: if true, include FORCE_DO_CMD as an order-only dep - phony: if true, the rule does not actually generate the named output, the - output is just a name to run the rule - command: (optional) command name to generate unambiguous labels - """ - outputs = [QuoteSpaces(o) for o in outputs] - inputs = [QuoteSpaces(i) for i in inputs] - - if comment: - self.WriteLn("# " + comment) - if phony: - self.WriteLn(".PHONY: " + " ".join(outputs)) - if actions: - self.WriteLn("%s: TOOLSET := $(TOOLSET)" % outputs[0]) - force_append = " FORCE_DO_CMD" if force else "" - - if order_only: - # Order only rule: Just write a simple rule. - # TODO(evanm): just make order_only a list of deps instead of this hack. - self.WriteLn( - "{}: | {}{}".format(" ".join(outputs), " ".join(inputs), force_append) - ) - elif len(outputs) == 1: - # Regular rule, one output: Just write a simple rule. - self.WriteLn("{}: {}{}".format(outputs[0], " ".join(inputs), force_append)) - else: - # Regular rule, more than one output: Multiple outputs are tricky in - # make. We will write three rules: - # - All outputs depend on an intermediate file. - # - Make .INTERMEDIATE depend on the intermediate. - # - The intermediate file depends on the inputs and executes the - # actual command. - # - The intermediate recipe will 'touch' the intermediate file. - # - The multi-output rule will have an do-nothing recipe. - - # Hash the target name to avoid generating overlong filenames. - cmddigest = hashlib.sha256( - (command or self.target).encode("utf-8") - ).hexdigest() - intermediate = "%s.intermediate" % cmddigest - self.WriteLn("{}: {}".format(" ".join(outputs), intermediate)) - self.WriteLn("\t%s" % "@:") - self.WriteLn("{}: {}".format(".INTERMEDIATE", intermediate)) - self.WriteLn( - "{}: {}{}".format(intermediate, " ".join(inputs), force_append) - ) - actions.insert(0, "$(call do_cmd,touch)") - - if actions: - for action in actions: - self.WriteLn("\t%s" % action) - self.WriteLn() - - def WriteAndroidNdkModuleRule(self, module_name, all_sources, link_deps): - """Write a set of LOCAL_XXX definitions for Android NDK. - - These variable definitions will be used by Android NDK but do nothing for - non-Android applications. - - Arguments: - module_name: Android NDK module name, which must be unique among all - module names. - all_sources: A list of source files (will be filtered by Compilable). - link_deps: A list of link dependencies, which must be sorted in - the order from dependencies to dependents. - """ - if self.type not in ("executable", "shared_library", "static_library"): - return - - self.WriteLn("# Variable definitions for Android applications") - self.WriteLn("include $(CLEAR_VARS)") - self.WriteLn("LOCAL_MODULE := " + module_name) - self.WriteLn( - "LOCAL_CFLAGS := $(CFLAGS_$(BUILDTYPE)) " - "$(DEFS_$(BUILDTYPE)) " - # LOCAL_CFLAGS is applied to both of C and C++. There is - # no way to specify $(CFLAGS_C_$(BUILDTYPE)) only for C - # sources. - "$(CFLAGS_C_$(BUILDTYPE)) " - # $(INCS_$(BUILDTYPE)) includes the prefix '-I' while - # LOCAL_C_INCLUDES does not expect it. So put it in - # LOCAL_CFLAGS. - "$(INCS_$(BUILDTYPE))" - ) - # LOCAL_CXXFLAGS is obsolete and LOCAL_CPPFLAGS is preferred. - self.WriteLn("LOCAL_CPPFLAGS := $(CFLAGS_CC_$(BUILDTYPE))") - self.WriteLn("LOCAL_C_INCLUDES :=") - self.WriteLn("LOCAL_LDLIBS := $(LDFLAGS_$(BUILDTYPE)) $(LIBS)") - - # Detect the C++ extension. - cpp_ext = {".cc": 0, ".cpp": 0, ".cxx": 0} - default_cpp_ext = ".cpp" - for filename in all_sources: - ext = os.path.splitext(filename)[1] - if ext in cpp_ext: - cpp_ext[ext] += 1 - if cpp_ext[ext] > cpp_ext[default_cpp_ext]: - default_cpp_ext = ext - self.WriteLn("LOCAL_CPP_EXTENSION := " + default_cpp_ext) - - self.WriteList( - list(map(self.Absolutify, filter(Compilable, all_sources))), - "LOCAL_SRC_FILES", - ) - - # Filter out those which do not match prefix and suffix and produce - # the resulting list without prefix and suffix. - def DepsToModules(deps, prefix, suffix): - modules = [] - for filepath in deps: - filename = os.path.basename(filepath) - if filename.startswith(prefix) and filename.endswith(suffix): - modules.append(filename[len(prefix) : -len(suffix)]) - return modules - - # Retrieve the default value of 'SHARED_LIB_SUFFIX' - params = {"flavor": "linux"} - default_variables = {} - CalculateVariables(default_variables, params) - - self.WriteList( - DepsToModules( - link_deps, - generator_default_variables["SHARED_LIB_PREFIX"], - default_variables["SHARED_LIB_SUFFIX"], - ), - "LOCAL_SHARED_LIBRARIES", - ) - self.WriteList( - DepsToModules( - link_deps, - generator_default_variables["STATIC_LIB_PREFIX"], - generator_default_variables["STATIC_LIB_SUFFIX"], - ), - "LOCAL_STATIC_LIBRARIES", - ) - - if self.type == "executable": - self.WriteLn("include $(BUILD_EXECUTABLE)") - elif self.type == "shared_library": - self.WriteLn("include $(BUILD_SHARED_LIBRARY)") - elif self.type == "static_library": - self.WriteLn("include $(BUILD_STATIC_LIBRARY)") - self.WriteLn() - - def WriteLn(self, text=""): - self.fp.write(text + "\n") - - def GetSortedXcodeEnv(self, additional_settings=None): - return gyp.xcode_emulation.GetSortedXcodeEnv( - self.xcode_settings, - "$(abs_builddir)", - os.path.join("$(abs_srcdir)", self.path), - "$(BUILDTYPE)", - additional_settings, - ) - - def GetSortedXcodePostbuildEnv(self): - # CHROMIUM_STRIP_SAVE_FILE is a chromium-specific hack. - # TODO(thakis): It would be nice to have some general mechanism instead. - strip_save_file = self.xcode_settings.GetPerTargetSetting( - "CHROMIUM_STRIP_SAVE_FILE", "" - ) - # Even if strip_save_file is empty, explicitly write it. Else a postbuild - # might pick up an export from an earlier target. - return self.GetSortedXcodeEnv( - additional_settings={"CHROMIUM_STRIP_SAVE_FILE": strip_save_file} - ) - - def WriteSortedXcodeEnv(self, target, env): - for k, v in env: - # For - # foo := a\ b - # the escaped space does the right thing. For - # export foo := a\ b - # it does not -- the backslash is written to the env as literal character. - # So don't escape spaces in |env[k]|. - self.WriteLn(f"{QuoteSpaces(target)}: export {k} := {v}") - - def Objectify(self, path): - """Convert a path to its output directory form.""" - if "$(" in path: - path = path.replace("$(obj)/", "$(obj).%s/$(TARGET)/" % self.toolset) - if "$(obj)" not in path: - path = f"$(obj).{self.toolset}/$(TARGET)/{path}" - return path - - def Pchify(self, path, lang): - """Convert a prefix header path to its output directory form.""" - path = self.Absolutify(path) - if "$(" in path: - path = path.replace( - "$(obj)/", f"$(obj).{self.toolset}/$(TARGET)/pch-{lang}" - ) - return path - return f"$(obj).{self.toolset}/$(TARGET)/pch-{lang}/{path}" - - def Absolutify(self, path): - """Convert a subdirectory-relative path into a base-relative path. - Skips over paths that contain variables.""" - if "$(" in path: - # Don't call normpath in this case, as it might collapse the - # path too aggressively if it features '..'. However it's still - # important to strip trailing slashes. - return path.rstrip("/") - return os.path.normpath(os.path.join(self.path, path)) - - def ExpandInputRoot(self, template, expansion, dirname): - if "%(INPUT_ROOT)s" not in template and "%(INPUT_DIRNAME)s" not in template: - return template - path = template % { - "INPUT_ROOT": expansion, - "INPUT_DIRNAME": dirname, - } - return path - - def _InstallableTargetInstallPath(self): - """Returns the location of the final output for an installable target.""" - # Functionality removed for all platforms to match Xcode and hoist - # shared libraries into PRODUCT_DIR for users: - # Xcode puts shared_library results into PRODUCT_DIR, and some gyp files - # rely on this. Emulate this behavior for mac. - # if self.type == "shared_library" and ( - # self.flavor != "mac" or self.toolset != "target" - # ): - # # Install all shared libs into a common directory (per toolset) for - # # convenient access with LD_LIBRARY_PATH. - # return "$(builddir)/lib.%s/%s" % (self.toolset, self.alias) - if self.flavor == "zos" and self.type == "shared_library": - return "$(builddir)/lib.%s/%s" % (self.toolset, self.alias) - - return "$(builddir)/" + self.alias - - -def WriteAutoRegenerationRule(params, root_makefile, makefile_name, build_files): - """Write the target to regenerate the Makefile.""" - options = params["options"] - build_files_args = [ - gyp.common.RelativePath(filename, options.toplevel_dir) - for filename in params["build_files_arg"] - ] - - gyp_binary = gyp.common.FixIfRelativePath( - params["gyp_binary"], options.toplevel_dir - ) - if not gyp_binary.startswith(os.sep): - gyp_binary = os.path.join(".", gyp_binary) - - root_makefile.write( - "quiet_cmd_regen_makefile = ACTION Regenerating $@\n" - "cmd_regen_makefile = cd $(srcdir); %(cmd)s\n" - "%(makefile_name)s: %(deps)s\n" - "\t$(call do_cmd,regen_makefile)\n\n" - % { - "makefile_name": makefile_name, - "deps": replace_sep( - " ".join(sorted(SourceifyAndQuoteSpaces(bf) for bf in build_files)) - ), - "cmd": replace_sep( - gyp.common.EncodePOSIXShellList( - [gyp_binary, "-fmake"] - + gyp.RegenerateFlags(options) - + build_files_args - ) - ), - } - ) - - -def PerformBuild(data, configurations, params): - options = params["options"] - for config in configurations: - arguments = ["make"] - if options.toplevel_dir and options.toplevel_dir != ".": - arguments += "-C", options.toplevel_dir - arguments.append("BUILDTYPE=" + config) - print(f"Building [{config}]: {arguments}") - subprocess.check_call(arguments) - - -def GenerateOutput(target_list, target_dicts, data, params): - options = params["options"] - flavor = gyp.common.GetFlavor(params) - generator_flags = params.get("generator_flags", {}) - builddir_name = generator_flags.get("output_dir", "out") - android_ndk_version = generator_flags.get("android_ndk_version", None) - default_target = generator_flags.get("default_target", "all") - - def CalculateMakefilePath(build_file, base_name): - """Determine where to write a Makefile for a given gyp file.""" - # Paths in gyp files are relative to the .gyp file, but we want - # paths relative to the source root for the master makefile. Grab - # the path of the .gyp file as the base to relativize against. - # E.g. "foo/bar" when we're constructing targets for "foo/bar/baz.gyp". - base_path = gyp.common.RelativePath(os.path.dirname(build_file), options.depth) - # We write the file in the base_path directory. - output_file = os.path.join(options.depth, base_path, base_name) - if options.generator_output: - output_file = os.path.join( - options.depth, options.generator_output, base_path, base_name - ) - base_path = gyp.common.RelativePath( - os.path.dirname(build_file), options.toplevel_dir - ) - return base_path, output_file - - # TODO: search for the first non-'Default' target. This can go - # away when we add verification that all targets have the - # necessary configurations. - default_configuration = None - toolsets = {target_dicts[target]["toolset"] for target in target_list} - for target in target_list: - spec = target_dicts[target] - if spec["default_configuration"] != "Default": - default_configuration = spec["default_configuration"] - break - if not default_configuration: - default_configuration = "Default" - - srcdir = "." - makefile_name = "Makefile" + options.suffix - makefile_path = os.path.join(options.toplevel_dir, makefile_name) - if options.generator_output: - global srcdir_prefix - makefile_path = os.path.join( - options.toplevel_dir, options.generator_output, makefile_name - ) - srcdir = replace_sep(gyp.common.RelativePath(srcdir, options.generator_output)) - srcdir_prefix = "$(srcdir)/" - - flock_command = "flock" - copy_archive_arguments = "-af" - makedep_arguments = "-MMD" - - # wasm-ld doesn't support --start-group/--end-group - link_commands = LINK_COMMANDS_LINUX - if flavor in ["wasi", "wasm"]: - link_commands = link_commands.replace(" -Wl,--start-group", "").replace( - " -Wl,--end-group", "" - ) - - CC_target = replace_sep(GetEnvironFallback(("CC_target", "CC"), "$(CC)")) - AR_target = replace_sep(GetEnvironFallback(("AR_target", "AR"), "$(AR)")) - CXX_target = replace_sep(GetEnvironFallback(("CXX_target", "CXX"), "$(CXX)")) - LINK_target = replace_sep(GetEnvironFallback(("LINK_target", "LINK"), "$(LINK)")) - PLI_target = replace_sep(GetEnvironFallback(("PLI_target", "PLI"), "pli")) - CC_host = replace_sep(GetEnvironFallback(("CC_host", "CC"), "gcc")) - AR_host = replace_sep(GetEnvironFallback(("AR_host", "AR"), "ar")) - CXX_host = replace_sep(GetEnvironFallback(("CXX_host", "CXX"), "g++")) - LINK_host = replace_sep(GetEnvironFallback(("LINK_host", "LINK"), "$(CXX.host)")) - PLI_host = replace_sep(GetEnvironFallback(("PLI_host", "PLI"), "pli")) - - header_params = { - "default_target": default_target, - "builddir": builddir_name, - "default_configuration": default_configuration, - "flock": flock_command, - "flock_index": 1, - "link_commands": link_commands, - "extra_commands": "", - "srcdir": srcdir, - "copy_archive_args": copy_archive_arguments, - "makedep_args": makedep_arguments, - "CC.target": CC_target, - "AR.target": AR_target, - "CXX.target": CXX_target, - "LINK.target": LINK_target, - "PLI.target": PLI_target, - "CC.host": CC_host, - "AR.host": AR_host, - "CXX.host": CXX_host, - "LINK.host": LINK_host, - "PLI.host": PLI_host, - } - if flavor == "mac": - flock_command = "%s gyp-mac-tool flock" % sys.executable - header_params.update( - { - "flock": flock_command, - "flock_index": 2, - "link_commands": LINK_COMMANDS_MAC, - "extra_commands": SHARED_HEADER_MAC_COMMANDS, - } - ) - elif flavor == "android": - header_params.update({"link_commands": LINK_COMMANDS_ANDROID}) - elif flavor == "zos": - copy_archive_arguments = "-fPR" - CC_target = GetEnvironFallback(("CC_target", "CC"), "njsc") - makedep_arguments = "-MMD" - if CC_target == "clang": - CC_host = GetEnvironFallback(("CC_host", "CC"), "clang") - CXX_target = GetEnvironFallback(("CXX_target", "CXX"), "clang++") - CXX_host = GetEnvironFallback(("CXX_host", "CXX"), "clang++") - elif CC_target == "ibm-clang64": - CC_host = GetEnvironFallback(("CC_host", "CC"), "ibm-clang64") - CXX_target = GetEnvironFallback(("CXX_target", "CXX"), "ibm-clang++64") - CXX_host = GetEnvironFallback(("CXX_host", "CXX"), "ibm-clang++64") - elif CC_target == "ibm-clang": - CC_host = GetEnvironFallback(("CC_host", "CC"), "ibm-clang") - CXX_target = GetEnvironFallback(("CXX_target", "CXX"), "ibm-clang++") - CXX_host = GetEnvironFallback(("CXX_host", "CXX"), "ibm-clang++") - else: - # Node.js versions prior to v18: - makedep_arguments = "-qmakedep=gcc" - CC_host = GetEnvironFallback(("CC_host", "CC"), "njsc") - CXX_target = GetEnvironFallback(("CXX_target", "CXX"), "njsc++") - CXX_host = GetEnvironFallback(("CXX_host", "CXX"), "njsc++") - header_params.update( - { - "copy_archive_args": copy_archive_arguments, - "makedep_args": makedep_arguments, - "link_commands": LINK_COMMANDS_OS390, - "extra_commands": SHARED_HEADER_OS390_COMMANDS, - "CC.target": CC_target, - "CXX.target": CXX_target, - "CC.host": CC_host, - "CXX.host": CXX_host, - } - ) - elif flavor == "solaris": - copy_archive_arguments = "-pPRf@" - header_params.update( - { - "copy_archive_args": copy_archive_arguments, - "flock": "%s gyp-flock-tool flock" % sys.executable, - "flock_index": 2, - } - ) - elif flavor == "freebsd": - # Note: OpenBSD has sysutils/flock. lockf seems to be FreeBSD specific. - header_params.update({"flock": "lockf"}) - elif flavor == "openbsd": - copy_archive_arguments = "-pPRf" - header_params.update({"copy_archive_args": copy_archive_arguments}) - elif flavor == "aix": - copy_archive_arguments = "-pPRf" - header_params.update( - { - "copy_archive_args": copy_archive_arguments, - "link_commands": LINK_COMMANDS_AIX, - "flock": "%s gyp-flock-tool flock" % sys.executable, - "flock_index": 2, - } - ) - elif flavor == "os400": - copy_archive_arguments = "-pPRf" - header_params.update( - { - "copy_archive_args": copy_archive_arguments, - "link_commands": LINK_COMMANDS_OS400, - "flock": "%s gyp-flock-tool flock" % sys.executable, - "flock_index": 2, - } - ) - - build_file, _, _ = gyp.common.ParseQualifiedTarget(target_list[0]) - make_global_settings_array = data[build_file].get("make_global_settings", []) - wrappers = {} - for key, value in make_global_settings_array: - if key.endswith("_wrapper"): - wrappers[key[: -len("_wrapper")]] = "$(abspath %s)" % value - make_global_settings = "" - for key, value in make_global_settings_array: - if re.match(".*_wrapper", key): - continue - if value[0] != "$": - value = "$(abspath %s)" % value - wrapper = wrappers.get(key) - if wrapper: - value = f"{wrapper} {value}" - del wrappers[key] - if key in ("CC", "CC.host", "CXX", "CXX.host"): - make_global_settings += ( - "ifneq (,$(filter $(origin %s), undefined default))\n" % key - ) - # Let gyp-time envvars win over global settings. - env_key = key.replace(".", "_") # CC.host -> CC_host - if env_key in os.environ: - value = os.environ[env_key] - make_global_settings += f" {key} = {value}\n" - make_global_settings += "endif\n" - else: - make_global_settings += f"{key} ?= {value}\n" - # TODO(ukai): define cmd when only wrapper is specified in - # make_global_settings. - - header_params["make_global_settings"] = make_global_settings - - gyp.common.EnsureDirExists(makefile_path) - root_makefile = open(makefile_path, "w") - root_makefile.write(SHARED_HEADER % header_params) - # Currently any versions have the same effect, but in future the behavior - # could be different. - if android_ndk_version: - root_makefile.write( - "# Define LOCAL_PATH for build of Android applications.\n" - "LOCAL_PATH := $(call my-dir)\n" - "\n" - ) - for toolset in toolsets: - root_makefile.write("TOOLSET := %s\n" % toolset) - WriteRootHeaderSuffixRules(root_makefile) - - # Put build-time support tools next to the root Makefile. - dest_path = os.path.dirname(makefile_path) - gyp.common.CopyTool(flavor, dest_path) - - # Find the list of targets that derive from the gyp file(s) being built. - needed_targets = set() - for build_file in params["build_files"]: - for target in gyp.common.AllTargets(target_list, target_dicts, build_file): - needed_targets.add(target) - - build_files = set() - include_list = set() - for qualified_target in target_list: - build_file, target, toolset = gyp.common.ParseQualifiedTarget(qualified_target) - - this_make_global_settings = data[build_file].get("make_global_settings", []) - assert make_global_settings_array == this_make_global_settings, ( - "make_global_settings needs to be the same for all targets " - f"{this_make_global_settings} vs. {make_global_settings}" - ) - - build_files.add(gyp.common.RelativePath(build_file, options.toplevel_dir)) - included_files = data[build_file]["included_files"] - for included_file in included_files: - # The included_files entries are relative to the dir of the build file - # that included them, so we have to undo that and then make them relative - # to the root dir. - relative_include_file = gyp.common.RelativePath( - gyp.common.UnrelativePath(included_file, build_file), - options.toplevel_dir, - ) - abs_include_file = os.path.abspath(relative_include_file) - # If the include file is from the ~/.gyp dir, we should use absolute path - # so that relocating the src dir doesn't break the path. - if params["home_dot_gyp"] and abs_include_file.startswith( - params["home_dot_gyp"] - ): - build_files.add(abs_include_file) - else: - build_files.add(relative_include_file) - - base_path, output_file = CalculateMakefilePath( - build_file, target + "." + toolset + options.suffix + ".mk" - ) - - spec = target_dicts[qualified_target] - configs = spec["configurations"] - - if flavor == "mac": - gyp.xcode_emulation.MergeGlobalXcodeSettingsToSpec(data[build_file], spec) - - writer = MakefileWriter(generator_flags, flavor) - writer.Write( - qualified_target, - base_path, - output_file, - spec, - configs, - part_of_all=qualified_target in needed_targets, - ) - - # Our root_makefile lives at the source root. Compute the relative path - # from there to the output_file for including. - mkfile_rel_path = gyp.common.RelativePath( - output_file, os.path.dirname(makefile_path) - ) - include_list.add(mkfile_rel_path) - - # Write out per-gyp (sub-project) Makefiles. - depth_rel_path = gyp.common.RelativePath(options.depth, os.getcwd()) - for build_file in build_files: - # The paths in build_files were relativized above, so undo that before - # testing against the non-relativized items in target_list and before - # calculating the Makefile path. - build_file = os.path.join(depth_rel_path, build_file) - gyp_targets = [ - target_dicts[qualified_target]["target_name"] - for qualified_target in target_list - if qualified_target.startswith(build_file) - and qualified_target in needed_targets - ] - # Only generate Makefiles for gyp files with targets. - if not gyp_targets: - continue - base_path, output_file = CalculateMakefilePath( - build_file, os.path.splitext(os.path.basename(build_file))[0] + ".Makefile" - ) - makefile_rel_path = gyp.common.RelativePath( - os.path.dirname(makefile_path), os.path.dirname(output_file) - ) - writer.WriteSubMake(output_file, makefile_rel_path, gyp_targets, builddir_name) - - # Write out the sorted list of includes. - root_makefile.write("\n") - for include_file in sorted(include_list): - # We wrap each .mk include in an if statement so users can tell make to - # not load a file by setting NO_LOAD. The below make code says, only - # load the .mk file if the .mk filename doesn't start with a token in - # NO_LOAD. - root_makefile.write( - "ifeq ($(strip $(foreach prefix,$(NO_LOAD),\\\n" - " $(findstring $(join ^,$(prefix)),\\\n" - " $(join ^," + include_file + ")))),)\n" - ) - root_makefile.write(" include " + include_file + "\n") - root_makefile.write("endif\n") - root_makefile.write("\n") - - if not generator_flags.get("standalone") and generator_flags.get( - "auto_regeneration", True - ): - WriteAutoRegenerationRule(params, root_makefile, makefile_name, build_files) - - root_makefile.write(SHARED_FOOTER) - - root_makefile.close() diff --git a/tools/gyp/pylib/gyp/generator/msvs.py b/tools/gyp/pylib/gyp/generator/msvs.py deleted file mode 100644 index 42bee33d9b6..00000000000 --- a/tools/gyp/pylib/gyp/generator/msvs.py +++ /dev/null @@ -1,3970 +0,0 @@ -# Copyright (c) 2012 Google Inc. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - - -import ntpath -import os -import posixpath -import re -import subprocess -import sys -from collections import OrderedDict - -import gyp.common -import gyp.generator.ninja as ninja_generator -from gyp import ( - MSVSNew, - MSVSProject, - MSVSSettings, - MSVSToolFile, - MSVSUserFile, - MSVSUtil, - MSVSVersion, - easy_xml, -) -from gyp.common import GypError, OrderedSet - -# Regular expression for validating Visual Studio GUIDs. If the GUID -# contains lowercase hex letters, MSVS will be fine. However, -# IncrediBuild BuildConsole will parse the solution file, but then -# silently skip building the target causing hard to track down errors. -# Note that this only happens with the BuildConsole, and does not occur -# if IncrediBuild is executed from inside Visual Studio. This regex -# validates that the string looks like a GUID with all uppercase hex -# letters. -VALID_MSVS_GUID_CHARS = re.compile(r"^[A-F0-9\-]+$") - -generator_supports_multiple_toolsets = gyp.common.CrossCompileRequested() - -generator_default_variables = { - "DRIVER_PREFIX": "", - "DRIVER_SUFFIX": ".sys", - "EXECUTABLE_PREFIX": "", - "EXECUTABLE_SUFFIX": ".exe", - "STATIC_LIB_PREFIX": "", - "SHARED_LIB_PREFIX": "", - "STATIC_LIB_SUFFIX": ".lib", - "SHARED_LIB_SUFFIX": ".dll", - "INTERMEDIATE_DIR": "$(IntDir)", - "SHARED_INTERMEDIATE_DIR": "$(OutDir)/obj/global_intermediate", - "OS": "win", - "PRODUCT_DIR": "$(OutDir)", - "LIB_DIR": "$(OutDir)lib", - "RULE_INPUT_ROOT": "$(InputName)", - "RULE_INPUT_DIRNAME": "$(InputDir)", - "RULE_INPUT_EXT": "$(InputExt)", - "RULE_INPUT_NAME": "$(InputFileName)", - "RULE_INPUT_PATH": "$(InputPath)", - "CONFIGURATION_NAME": "$(ConfigurationName)", -} - - -# The msvs specific sections that hold paths -generator_additional_path_sections = [ - "msvs_cygwin_dirs", - "msvs_props", -] - - -generator_additional_non_configuration_keys = [ - "msvs_cygwin_dirs", - "msvs_cygwin_shell", - "msvs_large_pdb", - "msvs_shard", - "msvs_external_builder", - "msvs_external_builder_out_dir", - "msvs_external_builder_build_cmd", - "msvs_external_builder_clean_cmd", - "msvs_external_builder_clcompile_cmd", - "msvs_enable_winrt", - "msvs_requires_importlibrary", - "msvs_enable_winphone", - "msvs_application_type_revision", - "msvs_target_platform_version", - "msvs_target_platform_minversion", -] - -generator_filelist_paths = None - -# List of precompiled header related keys. -precomp_keys = [ - "msvs_precompiled_header", - "msvs_precompiled_source", -] - - -cached_username = None - - -cached_domain = None - - -# TODO(gspencer): Switch the os.environ calls to be -# win32api.GetDomainName() and win32api.GetUserName() once the -# python version in depot_tools has been updated to work on Vista -# 64-bit. -def _GetDomainAndUserName(): - if sys.platform not in ("win32", "cygwin"): - return ("DOMAIN", "USERNAME") - global cached_username - global cached_domain - if not cached_domain or not cached_username: - domain = os.environ.get("USERDOMAIN") - username = os.environ.get("USERNAME") - if not domain or not username: - call = subprocess.Popen( - ["net", "config", "Workstation"], stdout=subprocess.PIPE - ) - config = call.communicate()[0].decode("utf-8") - username_re = re.compile(r"^User name\s+(\S+)", re.MULTILINE) - username_match = username_re.search(config) - if username_match: - username = username_match.group(1) - domain_re = re.compile(r"^Logon domain\s+(\S+)", re.MULTILINE) - domain_match = domain_re.search(config) - if domain_match: - domain = domain_match.group(1) - cached_domain = domain - cached_username = username - return (cached_domain, cached_username) - - -fixpath_prefix = None - - -def _NormalizedSource(source): - """Normalize the path. - - But not if that gets rid of a variable, as this may expand to something - larger than one directory. - - Arguments: - source: The path to be normalize.d - - Returns: - The normalized path. - """ - normalized = os.path.normpath(source) - if source.count("$") == normalized.count("$"): - source = normalized - return source - - -def _FixPath(path, separator="\\"): - """Convert paths to a form that will make sense in a vcproj file. - - Arguments: - path: The path to convert, may contain / etc. - Returns: - The path with all slashes made into backslashes. - """ - if ( - fixpath_prefix - and path - and not os.path.isabs(path) - and path[0] != "$" - and not _IsWindowsAbsPath(path) - ): - path = os.path.join(fixpath_prefix, path) - if separator == "\\": - path = path.replace("/", "\\") - path = _NormalizedSource(path) - if separator == "/": - path = path.replace("\\", "/") - if path and path[-1] == separator: - path = path[:-1] - return path - - -def _IsWindowsAbsPath(path): - """ - On Cygwin systems Python needs a little help determining if a path - is an absolute Windows path or not, so that - it does not treat those as relative, which results in bad paths like: - '..\\C:\\\\some_source_code_file.cc' - """ - return path.startswith(("c:", "C:")) - - -def _FixPaths(paths, separator="\\"): - """Fix each of the paths of the list.""" - return [_FixPath(i, separator) for i in paths] - - -def _ConvertSourcesToFilterHierarchy( - sources, prefix=None, excluded=None, list_excluded=True, msvs_version=None -): - """Converts a list split source file paths into a vcproj folder hierarchy. - - Arguments: - sources: A list of source file paths split. - prefix: A list of source file path layers meant to apply to each of sources. - excluded: A set of excluded files. - msvs_version: A MSVSVersion object. - - Returns: - A hierarchy of filenames and MSVSProject.Filter objects that matches the - layout of the source tree. - For example: - _ConvertSourcesToFilterHierarchy([['a', 'bob1.c'], ['b', 'bob2.c']], - prefix=['joe']) - --> - [MSVSProject.Filter('a', contents=['joe\\a\\bob1.c']), - MSVSProject.Filter('b', contents=['joe\\b\\bob2.c'])] - """ - if not prefix: - prefix = [] - result = [] - excluded_result = [] - folders = OrderedDict() - # Gather files into the final result, excluded, or folders. - for s in sources: - if len(s) == 1: - filename = _NormalizedSource("\\".join(prefix + s)) - if filename in excluded: - excluded_result.append(filename) - else: - result.append(filename) - elif msvs_version and not msvs_version.UsesVcxproj(): - # For MSVS 2008 and earlier, we need to process all files before walking - # the sub folders. - if not folders.get(s[0]): - folders[s[0]] = [] - folders[s[0]].append(s[1:]) - else: - contents = _ConvertSourcesToFilterHierarchy( - [s[1:]], - prefix + [s[0]], - excluded=excluded, - list_excluded=list_excluded, - msvs_version=msvs_version, - ) - contents = MSVSProject.Filter(s[0], contents=contents) - result.append(contents) - # Add a folder for excluded files. - if excluded_result and list_excluded: - excluded_folder = MSVSProject.Filter( - "_excluded_files", contents=excluded_result - ) - result.append(excluded_folder) - - if msvs_version and msvs_version.UsesVcxproj(): - return result - - # Populate all the folders. - for f in folders: - contents = _ConvertSourcesToFilterHierarchy( - folders[f], - prefix=prefix + [f], - excluded=excluded, - list_excluded=list_excluded, - msvs_version=msvs_version, - ) - contents = MSVSProject.Filter(f, contents=contents) - result.append(contents) - return result - - -def _ToolAppend(tools, tool_name, setting, value, only_if_unset=False): - if not value: - return - _ToolSetOrAppend(tools, tool_name, setting, value, only_if_unset) - - -def _ToolSetOrAppend(tools, tool_name, setting, value, only_if_unset=False): - # TODO(bradnelson): ugly hack, fix this more generally!!! - if "Directories" in setting or "Dependencies" in setting: - if isinstance(value, str): - value = value.replace("/", "\\") - else: - value = [i.replace("/", "\\") for i in value] - if not tools.get(tool_name): - tools[tool_name] = {} - tool = tools[tool_name] - if setting == "CompileAsWinRT": - return - if tool.get(setting): - if only_if_unset: - return - if isinstance(tool[setting], list) and isinstance(value, list): - tool[setting] += value - else: - raise TypeError( - 'Appending "%s" to a non-list setting "%s" for tool "%s" is ' - "not allowed, previous value: %s" - % (value, setting, tool_name, str(tool[setting])) - ) - else: - tool[setting] = value - - -def _ConfigTargetVersion(config_data): - return config_data.get("msvs_target_version", "Windows7") - - -def _ConfigPlatform(config_data): - return config_data.get("msvs_configuration_platform", "Win32") - - -def _ConfigBaseName(config_name, platform_name): - if config_name.endswith("_" + platform_name): - return config_name[0 : -len(platform_name) - 1] - else: - return config_name - - -def _ConfigFullName(config_name, config_data): - platform_name = _ConfigPlatform(config_data) - return f"{_ConfigBaseName(config_name, platform_name)}|{platform_name}" - - -def _ConfigWindowsTargetPlatformVersion(config_data, version): - target_ver = config_data.get("msvs_windows_target_platform_version") - if target_ver and re.match(r"^\d+", target_ver): - return target_ver - config_ver = config_data.get("msvs_windows_sdk_version") - vers = [config_ver] if config_ver else version.compatible_sdks - for ver in vers: - for key in [ - r"HKLM\Software\Microsoft\Microsoft SDKs\Windows\%s", - r"HKLM\Software\Wow6432Node\Microsoft\Microsoft SDKs\Windows\%s", - ]: - sdk_dir = MSVSVersion._RegistryGetValue(key % ver, "InstallationFolder") - if not sdk_dir: - continue - version = MSVSVersion._RegistryGetValue(key % ver, "ProductVersion") or "" - # Find a matching entry in sdk_dir\include. - expected_sdk_dir = r"%s\include" % sdk_dir - names = sorted( - ( - x - for x in ( - os.listdir(expected_sdk_dir) - if os.path.isdir(expected_sdk_dir) - else [] - ) - if x.startswith(version) - ), - reverse=True, - ) - if names: - return names[0] - else: - print( - "Warning: No include files found for detected " - "Windows SDK version %s" % (version), - file=sys.stdout, - ) - - -def _BuildCommandLineForRuleRaw( - spec, cmd, cygwin_shell, has_input_path, quote_cmd, do_setup_env -): - if [x for x in cmd if "$(InputDir)" in x]: - input_dir_preamble = ( - "set INPUTDIR=$(InputDir)\n" - "if NOT DEFINED INPUTDIR set INPUTDIR=.\\\n" - "set INPUTDIR=%INPUTDIR:~0,-1%\n" - ) - else: - input_dir_preamble = "" - - if cygwin_shell: - # Find path to cygwin. - cygwin_dir = _FixPath(spec.get("msvs_cygwin_dirs", ["."])[0]) - # Prepare command. - direct_cmd = cmd - direct_cmd = [ - i.replace("$(IntDir)", '`cygpath -m "${INTDIR}"`') for i in direct_cmd - ] - direct_cmd = [ - i.replace("$(OutDir)", '`cygpath -m "${OUTDIR}"`') for i in direct_cmd - ] - direct_cmd = [ - i.replace("$(InputDir)", '`cygpath -m "${INPUTDIR}"`') for i in direct_cmd - ] - if has_input_path: - direct_cmd = [ - i.replace("$(InputPath)", '`cygpath -m "${INPUTPATH}"`') - for i in direct_cmd - ] - direct_cmd = ['\\"%s\\"' % i.replace('"', '\\\\\\"') for i in direct_cmd] - # direct_cmd = gyp.common.EncodePOSIXShellList(direct_cmd) - direct_cmd = " ".join(direct_cmd) - # TODO(quote): regularize quoting path names throughout the module - cmd = "" - if do_setup_env: - cmd += 'call "$(ProjectDir)%(cygwin_dir)s\\setup_env.bat" && ' - cmd += "set CYGWIN=nontsec&& " - if direct_cmd.find("NUMBER_OF_PROCESSORS") >= 0: - cmd += "set /a NUMBER_OF_PROCESSORS_PLUS_1=%%NUMBER_OF_PROCESSORS%%+1&& " - if direct_cmd.find("INTDIR") >= 0: - cmd += "set INTDIR=$(IntDir)&& " - if direct_cmd.find("OUTDIR") >= 0: - cmd += "set OUTDIR=$(OutDir)&& " - if has_input_path and direct_cmd.find("INPUTPATH") >= 0: - cmd += "set INPUTPATH=$(InputPath) && " - cmd += 'bash -c "%(cmd)s"' - cmd = cmd % {"cygwin_dir": cygwin_dir, "cmd": direct_cmd} - return input_dir_preamble + cmd - else: - # Convert cat --> type to mimic unix. - command = ["type"] if cmd[0] == "cat" else [cmd[0].replace("/", "\\")] - # Add call before command to ensure that commands can be tied together one - # after the other without aborting in Incredibuild, since IB makes a bat - # file out of the raw command string, and some commands (like python) are - # actually batch files themselves. - command.insert(0, "call") - # Fix the paths - # TODO(quote): This is a really ugly heuristic, and will miss path fixing - # for arguments like "--arg=path", arg=path, or "/opt:path". - # If the argument starts with a slash or dash, or contains an equal sign, - # it's probably a command line switch. - # Return the path with forward slashes because the command using it might - # not support backslashes. - arguments = [ - i if (i[:1] in "/-" or "=" in i) else _FixPath(i, "/") for i in cmd[1:] - ] - arguments = [i.replace("$(InputDir)", "%INPUTDIR%") for i in arguments] - arguments = [MSVSSettings.FixVCMacroSlashes(i) for i in arguments] - if quote_cmd: - # Support a mode for using cmd directly. - # Convert any paths to native form (first element is used directly). - # TODO(quote): regularize quoting path names throughout the module - command[1] = '"%s"' % command[1] - arguments = ['"%s"' % i for i in arguments] - # Collapse into a single command. - return input_dir_preamble + " ".join(command + arguments) - - -def _BuildCommandLineForRule(spec, rule, has_input_path, do_setup_env): - # Currently this weird argument munging is used to duplicate the way a - # python script would need to be run as part of the chrome tree. - # Eventually we should add some sort of rule_default option to set this - # per project. For now the behavior chrome needs is the default. - mcs = rule.get("msvs_cygwin_shell") - if mcs is None: - mcs = int(spec.get("msvs_cygwin_shell", 1)) - elif isinstance(mcs, str): - mcs = int(mcs) - quote_cmd = int(rule.get("msvs_quote_cmd", 1)) - return _BuildCommandLineForRuleRaw( - spec, rule["action"], mcs, has_input_path, quote_cmd, do_setup_env=do_setup_env - ) - - -def _AddActionStep(actions_dict, inputs, outputs, description, command): - """Merge action into an existing list of actions. - - Care must be taken so that actions which have overlapping inputs either don't - get assigned to the same input, or get collapsed into one. - - Arguments: - actions_dict: dictionary keyed on input name, which maps to a list of - dicts describing the actions attached to that input file. - inputs: list of inputs - outputs: list of outputs - description: description of the action - command: command line to execute - """ - # Require there to be at least one input (call sites will ensure this). - assert inputs - - action = { - "inputs": inputs, - "outputs": outputs, - "description": description, - "command": command, - } - - # Pick where to stick this action. - # While less than optimal in terms of build time, attach them to the first - # input for now. - chosen_input = inputs[0] - - # Add it there. - if chosen_input not in actions_dict: - actions_dict[chosen_input] = [] - actions_dict[chosen_input].append(action) - - -def _AddCustomBuildToolForMSVS( - p, spec, primary_input, inputs, outputs, description, cmd -): - """Add a custom build tool to execute something. - - Arguments: - p: the target project - spec: the target project dict - primary_input: input file to attach the build tool to - inputs: list of inputs - outputs: list of outputs - description: description of the action - cmd: command line to execute - """ - inputs = _FixPaths(inputs) - outputs = _FixPaths(outputs) - tool = MSVSProject.Tool( - "VCCustomBuildTool", - { - "Description": description, - "AdditionalDependencies": ";".join(inputs), - "Outputs": ";".join(outputs), - "CommandLine": cmd, - }, - ) - # Add to the properties of primary input for each config. - for config_name, c_data in spec["configurations"].items(): - p.AddFileConfig( - _FixPath(primary_input), _ConfigFullName(config_name, c_data), tools=[tool] - ) - - -def _AddAccumulatedActionsToMSVS(p, spec, actions_dict): - """Add actions accumulated into an actions_dict, merging as needed. - - Arguments: - p: the target project - spec: the target project dict - actions_dict: dictionary keyed on input name, which maps to a list of - dicts describing the actions attached to that input file. - """ - for primary_input in actions_dict: - inputs = OrderedSet() - outputs = OrderedSet() - descriptions = [] - commands = [] - for action in actions_dict[primary_input]: - inputs.update(OrderedSet(action["inputs"])) - outputs.update(OrderedSet(action["outputs"])) - descriptions.append(action["description"]) - commands.append(action["command"]) - # Add the custom build step for one input file. - description = ", and also ".join(descriptions) - command = "\r\n".join(commands) - _AddCustomBuildToolForMSVS( - p, - spec, - primary_input=primary_input, - inputs=inputs, - outputs=outputs, - description=description, - cmd=command, - ) - - -def _RuleExpandPath(path, input_file): - """Given the input file to which a rule applied, string substitute a path. - - Arguments: - path: a path to string expand - input_file: the file to which the rule applied. - Returns: - The string substituted path. - """ - path = path.replace( - "$(InputName)", os.path.splitext(os.path.split(input_file)[1])[0] - ) - path = path.replace("$(InputDir)", os.path.dirname(input_file)) - path = path.replace( - "$(InputExt)", os.path.splitext(os.path.split(input_file)[1])[1] - ) - path = path.replace("$(InputFileName)", os.path.split(input_file)[1]) - path = path.replace("$(InputPath)", input_file) - return path - - -def _FindRuleTriggerFiles(rule, sources): - """Find the list of files which a particular rule applies to. - - Arguments: - rule: the rule in question - sources: the set of all known source files for this project - Returns: - The list of sources that trigger a particular rule. - """ - return rule.get("rule_sources", []) - - -def _RuleInputsAndOutputs(rule, trigger_file): - """Find the inputs and outputs generated by a rule. - - Arguments: - rule: the rule in question. - trigger_file: the main trigger for this rule. - Returns: - The pair of (inputs, outputs) involved in this rule. - """ - raw_inputs = _FixPaths(rule.get("inputs", [])) - raw_outputs = _FixPaths(rule.get("outputs", [])) - inputs = OrderedSet() - outputs = OrderedSet() - inputs.add(trigger_file) - for i in raw_inputs: - inputs.add(_RuleExpandPath(i, trigger_file)) - for o in raw_outputs: - outputs.add(_RuleExpandPath(o, trigger_file)) - return (inputs, outputs) - - -def _GenerateNativeRulesForMSVS(p, rules, output_dir, spec, options): - """Generate a native rules file. - - Arguments: - p: the target project - rules: the set of rules to include - output_dir: the directory in which the project/gyp resides - spec: the project dict - options: global generator options - """ - rules_filename = "{}{}.rules".format(spec["target_name"], options.suffix) - rules_file = MSVSToolFile.Writer( - os.path.join(output_dir, rules_filename), spec["target_name"] - ) - # Add each rule. - for r in rules: - rule_name = r["rule_name"] - rule_ext = r["extension"] - inputs = _FixPaths(r.get("inputs", [])) - outputs = _FixPaths(r.get("outputs", [])) - # Skip a rule with no action and no inputs. - if "action" not in r and not r.get("rule_sources", []): - continue - cmd = _BuildCommandLineForRule(spec, r, has_input_path=True, do_setup_env=True) - rules_file.AddCustomBuildRule( - name=rule_name, - description=r.get("message", rule_name), - extensions=[rule_ext], - additional_dependencies=inputs, - outputs=outputs, - cmd=cmd, - ) - # Write out rules file. - rules_file.WriteIfChanged() - - # Add rules file to project. - p.AddToolFile(rules_filename) - - -def _Cygwinify(path): - path = path.replace("$(OutDir)", "$(OutDirCygwin)") - path = path.replace("$(IntDir)", "$(IntDirCygwin)") - return path - - -def _GenerateExternalRules(rules, output_dir, spec, sources, options, actions_to_add): - """Generate an external makefile to do a set of rules. - - Arguments: - rules: the list of rules to include - output_dir: path containing project and gyp files - spec: project specification data - sources: set of sources known - options: global generator options - actions_to_add: The list of actions we will add to. - """ - filename = "{}_rules{}.mk".format(spec["target_name"], options.suffix) - mk_file = gyp.common.WriteOnDiff(os.path.join(output_dir, filename)) - # Find cygwin style versions of some paths. - mk_file.write('OutDirCygwin:=$(shell cygpath -u "$(OutDir)")\n') - mk_file.write('IntDirCygwin:=$(shell cygpath -u "$(IntDir)")\n') - # Gather stuff needed to emit all: target. - all_inputs = OrderedSet() - all_outputs = OrderedSet() - all_output_dirs = OrderedSet() - first_outputs = [] - for rule in rules: - trigger_files = _FindRuleTriggerFiles(rule, sources) - for tf in trigger_files: - inputs, outputs = _RuleInputsAndOutputs(rule, tf) - all_inputs.update(OrderedSet(inputs)) - all_outputs.update(OrderedSet(outputs)) - # Only use one target from each rule as the dependency for - # 'all' so we don't try to build each rule multiple times. - first_outputs.append(next(iter(outputs))) - # Get the unique output directories for this rule. - output_dirs = [os.path.split(i)[0] for i in outputs] - for od in output_dirs: - all_output_dirs.add(od) - first_outputs_cyg = [_Cygwinify(i) for i in first_outputs] - # Write out all: target, including mkdir for each output directory. - mk_file.write("all: %s\n" % " ".join(first_outputs_cyg)) - for od in all_output_dirs: - if od: - mk_file.write('\tmkdir -p `cygpath -u "%s"`\n' % od) - mk_file.write("\n") - # Define how each output is generated. - for rule in rules: - trigger_files = _FindRuleTriggerFiles(rule, sources) - for tf in trigger_files: - # Get all the inputs and outputs for this rule for this trigger file. - inputs, outputs = _RuleInputsAndOutputs(rule, tf) - inputs = [_Cygwinify(i) for i in inputs] - outputs = [_Cygwinify(i) for i in outputs] - # Prepare the command line for this rule. - cmd = [_RuleExpandPath(c, tf) for c in rule["action"]] - cmd = ['"%s"' % i for i in cmd] - cmd = " ".join(cmd) - # Add it to the makefile. - mk_file.write("{}: {}\n".format(" ".join(outputs), " ".join(inputs))) - mk_file.write("\t%s\n\n" % cmd) - # Close up the file. - mk_file.close() - - # Add makefile to list of sources. - sources.add(filename) - # Add a build action to call makefile. - cmd = [ - "make", - "OutDir=$(OutDir)", - "IntDir=$(IntDir)", - "-j", - "${NUMBER_OF_PROCESSORS_PLUS_1}", - "-f", - filename, - ] - cmd = _BuildCommandLineForRuleRaw(spec, cmd, True, False, True, True) - # Insert makefile as 0'th input, so it gets the action attached there, - # as this is easier to understand from in the IDE. - all_inputs = list(all_inputs) - all_inputs.insert(0, filename) - _AddActionStep( - actions_to_add, - inputs=_FixPaths(all_inputs), - outputs=_FixPaths(all_outputs), - description="Running external rules for %s" % spec["target_name"], - command=cmd, - ) - - -def _EscapeEnvironmentVariableExpansion(s): - """Escapes % characters. - - Escapes any % characters so that Windows-style environment variable - expansions will leave them alone. - See http://connect.microsoft.com/VisualStudio/feedback/details/106127/cl-d-name-text-containing-percentage-characters-doesnt-compile - to understand why we have to do this. - - Args: - s: The string to be escaped. - - Returns: - The escaped string. - """ - s = s.replace("%", "%%") - return s - - -quote_replacer_regex = re.compile(r'(\\*)"') - - -def _EscapeCommandLineArgumentForMSVS(s): - """Escapes a Windows command-line argument. - - So that the Win32 CommandLineToArgv function will turn the escaped result back - into the original string. - See http://msdn.microsoft.com/en-us/library/17w5ykft.aspx - ("Parsing C++ Command-Line Arguments") to understand why we have to do - this. - - Args: - s: the string to be escaped. - Returns: - the escaped string. - """ - - def _Replace(match): - # For a literal quote, CommandLineToArgv requires an odd number of - # backslashes preceding it, and it produces half as many literal backslashes - # (rounded down). So we need to produce 2n+1 backslashes. - return 2 * match.group(1) + '\\"' - - # Escape all quotes so that they are interpreted literally. - s = quote_replacer_regex.sub(_Replace, s) - # Now add unescaped quotes so that any whitespace is interpreted literally. - s = '"' + s + '"' - return s - - -delimiters_replacer_regex = re.compile(r"(\\*)([,;]+)") - - -def _EscapeVCProjCommandLineArgListItem(s): - """Escapes command line arguments for MSVS. - - The VCProj format stores string lists in a single string using commas and - semi-colons as separators, which must be quoted if they are to be - interpreted literally. However, command-line arguments may already have - quotes, and the VCProj parser is ignorant of the backslash escaping - convention used by CommandLineToArgv, so the command-line quotes and the - VCProj quotes may not be the same quotes. So to store a general - command-line argument in a VCProj list, we need to parse the existing - quoting according to VCProj's convention and quote any delimiters that are - not already quoted by that convention. The quotes that we add will also be - seen by CommandLineToArgv, so if backslashes precede them then we also have - to escape those backslashes according to the CommandLineToArgv - convention. - - Args: - s: the string to be escaped. - Returns: - the escaped string. - """ - - def _Replace(match): - # For a non-literal quote, CommandLineToArgv requires an even number of - # backslashes preceding it, and it produces half as many literal - # backslashes. So we need to produce 2n backslashes. - return 2 * match.group(1) + '"' + match.group(2) + '"' - - segments = s.split('"') - # The unquoted segments are at the even-numbered indices. - for i in range(0, len(segments), 2): - segments[i] = delimiters_replacer_regex.sub(_Replace, segments[i]) - # Concatenate back into a single string - s = '"'.join(segments) - if len(segments) % 2 == 0: - # String ends while still quoted according to VCProj's convention. This - # means the delimiter and the next list item that follow this one in the - # .vcproj file will be misinterpreted as part of this item. There is nothing - # we can do about this. Adding an extra quote would correct the problem in - # the VCProj but cause the same problem on the final command-line. Moving - # the item to the end of the list does works, but that's only possible if - # there's only one such item. Let's just warn the user. - print( - "Warning: MSVS may misinterpret the odd number of " + "quotes in " + s, - file=sys.stderr, - ) - return s - - -def _EscapeCppDefineForMSVS(s): - """Escapes a CPP define so that it will reach the compiler unaltered.""" - s = _EscapeEnvironmentVariableExpansion(s) - s = _EscapeCommandLineArgumentForMSVS(s) - s = _EscapeVCProjCommandLineArgListItem(s) - # cl.exe replaces literal # characters with = in preprocessor definitions for - # some reason. Octal-encode to work around that. - s = s.replace("#", "\\%03o" % ord("#")) - return s - - -quote_replacer_regex2 = re.compile(r'(\\+)"') - - -def _EscapeCommandLineArgumentForMSBuild(s): - """Escapes a Windows command-line argument for use by MSBuild.""" - - def _Replace(match): - return (len(match.group(1)) // 2 * 4) * "\\" + '\\"' - - # Escape all quotes so that they are interpreted literally. - s = quote_replacer_regex2.sub(_Replace, s) - return s - - -def _EscapeMSBuildSpecialCharacters(s): - escape_dictionary = { - "%": "%25", - "$": "%24", - "@": "%40", - "'": "%27", - ";": "%3B", - "?": "%3F", - "*": "%2A", - } - result = "".join([escape_dictionary.get(c, c) for c in s]) - return result - - -def _EscapeCppDefineForMSBuild(s): - """Escapes a CPP define so that it will reach the compiler unaltered.""" - s = _EscapeEnvironmentVariableExpansion(s) - s = _EscapeCommandLineArgumentForMSBuild(s) - s = _EscapeMSBuildSpecialCharacters(s) - # cl.exe replaces literal # characters with = in preprocessor definitions for - # some reason. Octal-encode to work around that. - s = s.replace("#", "\\%03o" % ord("#")) - return s - - -def _GenerateRulesForMSVS( - p, output_dir, options, spec, sources, excluded_sources, actions_to_add -): - """Generate all the rules for a particular project. - - Arguments: - p: the project - output_dir: directory to emit rules to - options: global options passed to the generator - spec: the specification for this project - sources: the set of all known source files in this project - excluded_sources: the set of sources excluded from normal processing - actions_to_add: deferred list of actions to add in - """ - rules = spec.get("rules", []) - rules_native = [r for r in rules if not int(r.get("msvs_external_rule", 0))] - rules_external = [r for r in rules if int(r.get("msvs_external_rule", 0))] - - # Handle rules that use a native rules file. - if rules_native: - _GenerateNativeRulesForMSVS(p, rules_native, output_dir, spec, options) - - # Handle external rules (non-native rules). - if rules_external: - _GenerateExternalRules( - rules_external, output_dir, spec, sources, options, actions_to_add - ) - _AdjustSourcesForRules(rules, sources, excluded_sources, False) - - -def _AdjustSourcesForRules(rules, sources, excluded_sources, is_msbuild): - # Add outputs generated by each rule (if applicable). - for rule in rules: - # Add in the outputs from this rule. - trigger_files = _FindRuleTriggerFiles(rule, sources) - for trigger_file in trigger_files: - # Remove trigger_file from excluded_sources to let the rule be triggered - # (e.g. rule trigger ax_enums.idl is added to excluded_sources - # because it's also in an action's inputs in the same project) - excluded_sources.discard(_FixPath(trigger_file)) - # Done if not processing outputs as sources. - if int(rule.get("process_outputs_as_sources", False)): - inputs, outputs = _RuleInputsAndOutputs(rule, trigger_file) - inputs = OrderedSet(_FixPaths(inputs)) - outputs = OrderedSet(_FixPaths(outputs)) - inputs.remove(_FixPath(trigger_file)) - sources.update(inputs) - if not is_msbuild: - excluded_sources.update(inputs) - sources.update(outputs) - - -def _FilterActionsFromExcluded(excluded_sources, actions_to_add): - """Take inputs with actions attached out of the list of exclusions. - - Arguments: - excluded_sources: list of source files not to be built. - actions_to_add: dict of actions keyed on source file they're attached to. - Returns: - excluded_sources with files that have actions attached removed. - """ - must_keep = OrderedSet(_FixPaths(actions_to_add.keys())) - return [s for s in excluded_sources if s not in must_keep] - - -def _GetDefaultConfiguration(spec): - return spec["configurations"][spec["default_configuration"]] - - -def _GetGuidOfProject(proj_path, spec): - """Get the guid for the project. - - Arguments: - proj_path: Path of the vcproj or vcxproj file to generate. - spec: The target dictionary containing the properties of the target. - Returns: - the guid. - Raises: - ValueError: if the specified GUID is invalid. - """ - # Pluck out the default configuration. - default_config = _GetDefaultConfiguration(spec) - # Decide the guid of the project. - guid = default_config.get("msvs_guid") - if guid: - if VALID_MSVS_GUID_CHARS.match(guid) is None: - raise ValueError( - 'Invalid MSVS guid: "%s". Must match regex: "%s".' - % (guid, VALID_MSVS_GUID_CHARS.pattern) - ) - guid = "{%s}" % guid - guid = guid or MSVSNew.MakeGuid(proj_path) - return guid - - -def _GetMsbuildToolsetOfProject(proj_path, spec, version): - """Get the platform toolset for the project. - - Arguments: - proj_path: Path of the vcproj or vcxproj file to generate. - spec: The target dictionary containing the properties of the target. - version: The MSVSVersion object. - Returns: - the platform toolset string or None. - """ - # Pluck out the default configuration. - default_config = _GetDefaultConfiguration(spec) - toolset = default_config.get("msbuild_toolset") - if not toolset and version.DefaultToolset(): - toolset = version.DefaultToolset() - if spec["type"] == "windows_driver": - toolset = "WindowsKernelModeDriver10.0" - return toolset - - -def _GenerateProject(project, options, version, generator_flags, spec): - """Generates a vcproj file. - - Arguments: - project: the MSVSProject object. - options: global generator options. - version: the MSVSVersion object. - generator_flags: dict of generator-specific flags. - Returns: - A list of source files that cannot be found on disk. - """ - default_config = _GetDefaultConfiguration(project.spec) - - # Skip emitting anything if told to with msvs_existing_vcproj option. - if default_config.get("msvs_existing_vcproj"): - return [] - - if version.UsesVcxproj(): - return _GenerateMSBuildProject(project, options, version, generator_flags, spec) - else: - return _GenerateMSVSProject(project, options, version, generator_flags) - - -def _GenerateMSVSProject(project, options, version, generator_flags): - """Generates a .vcproj file. It may create .rules and .user files too. - - Arguments: - project: The project object we will generate the file for. - options: Global options passed to the generator. - version: The VisualStudioVersion object. - generator_flags: dict of generator-specific flags. - """ - spec = project.spec - gyp.common.EnsureDirExists(project.path) - - platforms = _GetUniquePlatforms(spec) - p = MSVSProject.Writer( - project.path, version, spec["target_name"], project.guid, platforms - ) - - # Get directory project file is in. - project_dir = os.path.split(project.path)[0] - gyp_path = _NormalizedSource(project.build_file) - relative_path_of_gyp_file = gyp.common.RelativePath(gyp_path, project_dir) - - config_type = _GetMSVSConfigurationType(spec, project.build_file) - for config_name, config in spec["configurations"].items(): - _AddConfigurationToMSVSProject(p, spec, config_type, config_name, config) - - # Prepare list of sources and excluded sources. - gyp_file = os.path.split(project.build_file)[1] - sources, excluded_sources = _PrepareListOfSources(spec, generator_flags, gyp_file) - - # Add rules. - actions_to_add = {} - _GenerateRulesForMSVS( - p, project_dir, options, spec, sources, excluded_sources, actions_to_add - ) - list_excluded = generator_flags.get("msvs_list_excluded_files", True) - sources, excluded_sources, excluded_idl = _AdjustSourcesAndConvertToFilterHierarchy( - spec, options, project_dir, sources, excluded_sources, list_excluded, version - ) - - # Add in files. - missing_sources = _VerifySourcesExist(sources, project_dir) - p.AddFiles(sources) - - _AddToolFilesToMSVS(p, spec) - _HandlePreCompiledHeaders(p, sources, spec) - _AddActions(actions_to_add, spec, relative_path_of_gyp_file) - _AddCopies(actions_to_add, spec) - _WriteMSVSUserFile(project.path, version, spec) - - # NOTE: this stanza must appear after all actions have been decided. - # Don't excluded sources with actions attached, or they won't run. - excluded_sources = _FilterActionsFromExcluded(excluded_sources, actions_to_add) - _ExcludeFilesFromBeingBuilt(p, spec, excluded_sources, excluded_idl, list_excluded) - _AddAccumulatedActionsToMSVS(p, spec, actions_to_add) - - # Write it out. - p.WriteIfChanged() - - return missing_sources - - -def _GetUniquePlatforms(spec): - """Returns the list of unique platforms for this spec, e.g ['win32', ...]. - - Arguments: - spec: The target dictionary containing the properties of the target. - Returns: - The MSVSUserFile object created. - """ - # Gather list of unique platforms. - platforms = OrderedSet() - for configuration in spec["configurations"]: - platforms.add(_ConfigPlatform(spec["configurations"][configuration])) - platforms = list(platforms) - return platforms - - -def _CreateMSVSUserFile(proj_path, version, spec): - """Generates a .user file for the user running this Gyp program. - - Arguments: - proj_path: The path of the project file being created. The .user file - shares the same path (with an appropriate suffix). - version: The VisualStudioVersion object. - spec: The target dictionary containing the properties of the target. - Returns: - The MSVSUserFile object created. - """ - (domain, username) = _GetDomainAndUserName() - vcuser_filename = ".".join([proj_path, domain, username, "user"]) - user_file = MSVSUserFile.Writer(vcuser_filename, version, spec["target_name"]) - return user_file - - -def _GetMSVSConfigurationType(spec, build_file): - """Returns the configuration type for this project. - - It's a number defined by Microsoft. May raise an exception. - - Args: - spec: The target dictionary containing the properties of the target. - build_file: The path of the gyp file. - Returns: - An integer, the configuration type. - """ - try: - config_type = { - "executable": "1", # .exe - "shared_library": "2", # .dll - "loadable_module": "2", # .dll - "static_library": "4", # .lib - "windows_driver": "5", # .sys - "none": "10", # Utility type - }[spec["type"]] - except KeyError: - if spec.get("type"): - raise GypError( - "Target type %s is not a valid target type for " - "target %s in %s." % (spec["type"], spec["target_name"], build_file) - ) - else: - raise GypError( - "Missing type field for target %s in %s." - % (spec["target_name"], build_file) - ) - return config_type - - -def _AddConfigurationToMSVSProject(p, spec, config_type, config_name, config): - """Adds a configuration to the MSVS project. - - Many settings in a vcproj file are specific to a configuration. This - function the main part of the vcproj file that's configuration specific. - - Arguments: - p: The target project being generated. - spec: The target dictionary containing the properties of the target. - config_type: The configuration type, a number as defined by Microsoft. - config_name: The name of the configuration. - config: The dictionary that defines the special processing to be done - for this configuration. - """ - # Get the information for this configuration - include_dirs, midl_include_dirs, resource_include_dirs = _GetIncludeDirs(config) - libraries = _GetLibraries(spec) - library_dirs = _GetLibraryDirs(config) - out_file, vc_tool, _ = _GetOutputFilePathAndTool(spec, msbuild=False) - defines = _GetDefines(config) - defines = [_EscapeCppDefineForMSVS(d) for d in defines] - disabled_warnings = _GetDisabledWarnings(config) - prebuild = config.get("msvs_prebuild") - postbuild = config.get("msvs_postbuild") - def_file = _GetModuleDefinition(spec) - precompiled_header = config.get("msvs_precompiled_header") - - # Prepare the list of tools as a dictionary. - tools = {} - # Add in user specified msvs_settings. - msvs_settings = config.get("msvs_settings", {}) - MSVSSettings.ValidateMSVSSettings(msvs_settings) - - # Prevent default library inheritance from the environment. - _ToolAppend(tools, "VCLinkerTool", "AdditionalDependencies", ["$(NOINHERIT)"]) - - for tool in msvs_settings: - settings = config["msvs_settings"][tool] - for setting in settings: - _ToolAppend(tools, tool, setting, settings[setting]) - # Add the information to the appropriate tool - _ToolAppend(tools, "VCCLCompilerTool", "AdditionalIncludeDirectories", include_dirs) - _ToolAppend(tools, "VCMIDLTool", "AdditionalIncludeDirectories", midl_include_dirs) - _ToolAppend( - tools, - "VCResourceCompilerTool", - "AdditionalIncludeDirectories", - resource_include_dirs, - ) - # Add in libraries. - _ToolAppend(tools, "VCLinkerTool", "AdditionalDependencies", libraries) - _ToolAppend(tools, "VCLinkerTool", "AdditionalLibraryDirectories", library_dirs) - if out_file: - _ToolAppend(tools, vc_tool, "OutputFile", out_file, only_if_unset=True) - # Add defines. - _ToolAppend(tools, "VCCLCompilerTool", "PreprocessorDefinitions", defines) - _ToolAppend(tools, "VCResourceCompilerTool", "PreprocessorDefinitions", defines) - # Change program database directory to prevent collisions. - _ToolAppend( - tools, - "VCCLCompilerTool", - "ProgramDataBaseFileName", - "$(IntDir)$(ProjectName)\\vc80.pdb", - only_if_unset=True, - ) - # Add disabled warnings. - _ToolAppend(tools, "VCCLCompilerTool", "DisableSpecificWarnings", disabled_warnings) - # Add Pre-build. - _ToolAppend(tools, "VCPreBuildEventTool", "CommandLine", prebuild) - # Add Post-build. - _ToolAppend(tools, "VCPostBuildEventTool", "CommandLine", postbuild) - # Turn on precompiled headers if appropriate. - if precompiled_header: - precompiled_header = os.path.split(precompiled_header)[1] - _ToolAppend(tools, "VCCLCompilerTool", "UsePrecompiledHeader", "2") - _ToolAppend( - tools, "VCCLCompilerTool", "PrecompiledHeaderThrough", precompiled_header - ) - _ToolAppend(tools, "VCCLCompilerTool", "ForcedIncludeFiles", precompiled_header) - # Loadable modules don't generate import libraries; - # tell dependent projects to not expect one. - if spec["type"] == "loadable_module": - _ToolAppend(tools, "VCLinkerTool", "IgnoreImportLibrary", "true") - # Set the module definition file if any. - if def_file: - _ToolAppend(tools, "VCLinkerTool", "ModuleDefinitionFile", def_file) - - _AddConfigurationToMSVS(p, spec, tools, config, config_type, config_name) - - -def _GetIncludeDirs(config): - """Returns the list of directories to be used for #include directives. - - Arguments: - config: The dictionary that defines the special processing to be done - for this configuration. - Returns: - The list of directory paths. - """ - # TODO(bradnelson): include_dirs should really be flexible enough not to - # require this sort of thing. - include_dirs = config.get("include_dirs", []) + config.get( - "msvs_system_include_dirs", [] - ) - midl_include_dirs = config.get("midl_include_dirs", []) + config.get( - "msvs_system_include_dirs", [] - ) - resource_include_dirs = config.get("resource_include_dirs", include_dirs) - include_dirs = _FixPaths(include_dirs) - midl_include_dirs = _FixPaths(midl_include_dirs) - resource_include_dirs = _FixPaths(resource_include_dirs) - return include_dirs, midl_include_dirs, resource_include_dirs - - -def _GetLibraryDirs(config): - """Returns the list of directories to be used for library search paths. - - Arguments: - config: The dictionary that defines the special processing to be done - for this configuration. - Returns: - The list of directory paths. - """ - - library_dirs = config.get("library_dirs", []) - library_dirs = _FixPaths(library_dirs) - return library_dirs - - -def _GetLibraries(spec): - """Returns the list of libraries for this configuration. - - Arguments: - spec: The target dictionary containing the properties of the target. - Returns: - The list of directory paths. - """ - libraries = spec.get("libraries", []) - # Strip out -l, as it is not used on windows (but is needed so we can pass - # in libraries that are assumed to be in the default library path). - # Also remove duplicate entries, leaving only the last duplicate, while - # preserving order. - found = OrderedSet() - unique_libraries_list = [] - for entry in reversed(libraries): - library = re.sub(r"^\-l", "", entry) - if not os.path.splitext(library)[1]: - library += ".lib" - if library not in found: - found.add(library) - unique_libraries_list.append(library) - unique_libraries_list.reverse() - return unique_libraries_list - - -def _GetOutputFilePathAndTool(spec, msbuild): - """Returns the path and tool to use for this target. - - Figures out the path of the file this spec will create and the name of - the VC tool that will create it. - - Arguments: - spec: The target dictionary containing the properties of the target. - Returns: - A triple of (file path, name of the vc tool, name of the msbuild tool) - """ - # Select a name for the output file. - out_file = "" - vc_tool = "" - msbuild_tool = "" - output_file_map = { - "executable": ("VCLinkerTool", "Link", "$(OutDir)", ".exe"), - "shared_library": ("VCLinkerTool", "Link", "$(OutDir)", ".dll"), - "loadable_module": ("VCLinkerTool", "Link", "$(OutDir)", ".dll"), - "windows_driver": ("VCLinkerTool", "Link", "$(OutDir)", ".sys"), - "static_library": ("VCLibrarianTool", "Lib", "$(OutDir)lib\\", ".lib"), - } - output_file_props = output_file_map.get(spec["type"]) - if output_file_props and int(spec.get("msvs_auto_output_file", 1)): - vc_tool, msbuild_tool, out_dir, suffix = output_file_props - if spec.get("standalone_static_library", 0): - out_dir = "$(OutDir)" - out_dir = spec.get("product_dir", out_dir) - product_extension = spec.get("product_extension") - if product_extension: - suffix = "." + product_extension - elif msbuild: - suffix = "$(TargetExt)" - prefix = spec.get("product_prefix", "") - product_name = spec.get("product_name", "$(ProjectName)") - out_file = ntpath.join(out_dir, prefix + product_name + suffix) - return out_file, vc_tool, msbuild_tool - - -def _GetOutputTargetExt(spec): - """Returns the extension for this target, including the dot - - If product_extension is specified, set target_extension to this to avoid - MSB8012, returns None otherwise. Ignores any target_extension settings in - the input files. - - Arguments: - spec: The target dictionary containing the properties of the target. - Returns: - A string with the extension, or None - """ - if target_extension := spec.get("product_extension"): - return "." + target_extension - return None - - -def _GetDefines(config): - """Returns the list of preprocessor definitions for this configuration. - - Arguments: - config: The dictionary that defines the special processing to be done - for this configuration. - Returns: - The list of preprocessor definitions. - """ - defines = [] - for d in config.get("defines", []): - fd = "=".join([str(dpart) for dpart in d]) if isinstance(d, list) else str(d) - defines.append(fd) - return defines - - -def _GetDisabledWarnings(config): - return [str(i) for i in config.get("msvs_disabled_warnings", [])] - - -def _GetModuleDefinition(spec): - def_file = "" - if spec["type"] in [ - "shared_library", - "loadable_module", - "executable", - "windows_driver", - ]: - def_files = [s for s in spec.get("sources", []) if s.endswith(".def")] - if len(def_files) == 1: - def_file = _FixPath(def_files[0]) - elif def_files: - raise ValueError( - "Multiple module definition files in one target, target %s lists " - "multiple .def files: %s" % (spec["target_name"], " ".join(def_files)) - ) - return def_file - - -def _ConvertToolsToExpectedForm(tools): - """Convert tools to a form expected by Visual Studio. - - Arguments: - tools: A dictionary of settings; the tool name is the key. - Returns: - A list of Tool objects. - """ - tool_list = [] - for tool, settings in tools.items(): - # Collapse settings with lists. - settings_fixed = {} - for setting, value in settings.items(): - if isinstance(value, list): - if ( - tool == "VCLinkerTool" and setting == "AdditionalDependencies" - ) or setting == "AdditionalOptions": - settings_fixed[setting] = " ".join(value) - else: - settings_fixed[setting] = ";".join(value) - else: - settings_fixed[setting] = value - # Add in this tool. - tool_list.append(MSVSProject.Tool(tool, settings_fixed)) - return tool_list - - -def _AddConfigurationToMSVS(p, spec, tools, config, config_type, config_name): - """Add to the project file the configuration specified by config. - - Arguments: - p: The target project being generated. - spec: the target project dict. - tools: A dictionary of settings; the tool name is the key. - config: The dictionary that defines the special processing to be done - for this configuration. - config_type: The configuration type, a number as defined by Microsoft. - config_name: The name of the configuration. - """ - attributes = _GetMSVSAttributes(spec, config, config_type) - # Add in this configuration. - tool_list = _ConvertToolsToExpectedForm(tools) - p.AddConfig(_ConfigFullName(config_name, config), attrs=attributes, tools=tool_list) - - -def _GetMSVSAttributes(spec, config, config_type): - # Prepare configuration attributes. - prepared_attrs = {} - source_attrs = config.get("msvs_configuration_attributes", {}) - for a in source_attrs: - prepared_attrs[a] = source_attrs[a] - # Add props files. - vsprops_dirs = config.get("msvs_props", []) - vsprops_dirs = _FixPaths(vsprops_dirs) - if vsprops_dirs: - prepared_attrs["InheritedPropertySheets"] = ";".join(vsprops_dirs) - # Set configuration type. - prepared_attrs["ConfigurationType"] = config_type - output_dir = prepared_attrs.get( - "OutputDirectory", "$(SolutionDir)$(ConfigurationName)" - ) - prepared_attrs["OutputDirectory"] = _FixPath(output_dir) + "\\" - if "IntermediateDirectory" not in prepared_attrs: - intermediate = "$(ConfigurationName)\\obj\\$(ProjectName)" - prepared_attrs["IntermediateDirectory"] = _FixPath(intermediate) + "\\" - else: - intermediate = _FixPath(prepared_attrs["IntermediateDirectory"]) + "\\" - intermediate = MSVSSettings.FixVCMacroSlashes(intermediate) - prepared_attrs["IntermediateDirectory"] = intermediate - return prepared_attrs - - -def _AddNormalizedSources(sources_set, sources_array): - sources_set.update(_NormalizedSource(s) for s in sources_array) - - -def _PrepareListOfSources(spec, generator_flags, gyp_file): - """Prepare list of sources and excluded sources. - - Besides the sources specified directly in the spec, adds the gyp file so - that a change to it will cause a re-compile. Also adds appropriate sources - for actions and copies. Assumes later stage will un-exclude files which - have custom build steps attached. - - Arguments: - spec: The target dictionary containing the properties of the target. - gyp_file: The name of the gyp file. - Returns: - A pair of (list of sources, list of excluded sources). - The sources will be relative to the gyp file. - """ - sources = OrderedSet() - _AddNormalizedSources(sources, spec.get("sources", [])) - excluded_sources = OrderedSet() - # Add in the gyp file. - if not generator_flags.get("standalone"): - sources.add(gyp_file) - - # Add in 'action' inputs and outputs. - for a in spec.get("actions", []): - inputs = a["inputs"] - inputs = [_NormalizedSource(i) for i in inputs] - # Add all inputs to sources and excluded sources. - inputs = OrderedSet(inputs) - sources.update(inputs) - if not spec.get("msvs_external_builder"): - excluded_sources.update(inputs) - if int(a.get("process_outputs_as_sources", False)): - _AddNormalizedSources(sources, a.get("outputs", [])) - # Add in 'copies' inputs and outputs. - for cpy in spec.get("copies", []): - _AddNormalizedSources(sources, cpy.get("files", [])) - return (sources, excluded_sources) - - -def _AdjustSourcesAndConvertToFilterHierarchy( - spec, options, gyp_dir, sources, excluded_sources, list_excluded, version -): - """Adjusts the list of sources and excluded sources. - - Also converts the sets to lists. - - Arguments: - spec: The target dictionary containing the properties of the target. - options: Global generator options. - gyp_dir: The path to the gyp file being processed. - sources: A set of sources to be included for this project. - excluded_sources: A set of sources to be excluded for this project. - version: A MSVSVersion object. - Returns: - A trio of (list of sources, list of excluded sources, - path of excluded IDL file) - """ - # Exclude excluded sources coming into the generator. - excluded_sources.update(OrderedSet(spec.get("sources_excluded", []))) - # Add excluded sources into sources for good measure. - sources.update(excluded_sources) - # Convert to proper windows form. - # NOTE: sources goes from being a set to a list here. - # NOTE: excluded_sources goes from being a set to a list here. - sources = _FixPaths(sources) - # Convert to proper windows form. - excluded_sources = _FixPaths(excluded_sources) - - excluded_idl = _IdlFilesHandledNonNatively(spec, sources) - - precompiled_related = _GetPrecompileRelatedFiles(spec) - # Find the excluded ones, minus the precompiled header related ones. - fully_excluded = [i for i in excluded_sources if i not in precompiled_related] - - # Convert to folders and the right slashes. - sources = [i.split("\\") for i in sources] - sources = _ConvertSourcesToFilterHierarchy( - sources, - excluded=fully_excluded, - list_excluded=list_excluded, - msvs_version=version, - ) - - # Prune filters with a single child to flatten ugly directory structures - # such as ../../src/modules/module1 etc. - if version.UsesVcxproj(): - while ( - all(isinstance(s, MSVSProject.Filter) for s in sources) - and len({s.name for s in sources}) == 1 - ): - assert all(len(s.contents) == 1 for s in sources) - sources = [s.contents[0] for s in sources] - else: - while len(sources) == 1 and isinstance(sources[0], MSVSProject.Filter): - sources = sources[0].contents - - return sources, excluded_sources, excluded_idl - - -def _IdlFilesHandledNonNatively(spec, sources): - # If any non-native rules use 'idl' as an extension exclude idl files. - # Gather a list here to use later. - using_idl = False - for rule in spec.get("rules", []): - if rule["extension"] == "idl" and int(rule.get("msvs_external_rule", 0)): - using_idl = True - break - excluded_idl = [i for i in sources if i.endswith(".idl")] if using_idl else [] - return excluded_idl - - -def _GetPrecompileRelatedFiles(spec): - # Gather a list of precompiled header related sources. - precompiled_related = [] - for _, config in spec["configurations"].items(): - for k in precomp_keys: - f = config.get(k) - if f: - precompiled_related.append(_FixPath(f)) - return precompiled_related - - -def _ExcludeFilesFromBeingBuilt(p, spec, excluded_sources, excluded_idl, list_excluded): - exclusions = _GetExcludedFilesFromBuild(spec, excluded_sources, excluded_idl) - for file_name, excluded_configs in exclusions.items(): - if not list_excluded and len(excluded_configs) == len(spec["configurations"]): - # If we're not listing excluded files, then they won't appear in the - # project, so don't try to configure them to be excluded. - pass - else: - for config_name, config in excluded_configs: - p.AddFileConfig( - file_name, - _ConfigFullName(config_name, config), - {"ExcludedFromBuild": "true"}, - ) - - -def _GetExcludedFilesFromBuild(spec, excluded_sources, excluded_idl): - exclusions = {} - # Exclude excluded sources from being built. - for f in excluded_sources: - excluded_configs = [] - for config_name, config in spec["configurations"].items(): - precomped = [_FixPath(config.get(i, "")) for i in precomp_keys] - # Don't do this for ones that are precompiled header related. - if f not in precomped: - excluded_configs.append((config_name, config)) - exclusions[f] = excluded_configs - # If any non-native rules use 'idl' as an extension exclude idl files. - # Exclude them now. - for f in excluded_idl: - excluded_configs = [] - for config_name, config in spec["configurations"].items(): - excluded_configs.append((config_name, config)) - exclusions[f] = excluded_configs - return exclusions - - -def _AddToolFilesToMSVS(p, spec): - # Add in tool files (rules). - tool_files = OrderedSet() - for _, config in spec["configurations"].items(): - for f in config.get("msvs_tool_files", []): - tool_files.add(f) - for f in tool_files: - p.AddToolFile(f) - - -def _HandlePreCompiledHeaders(p, sources, spec): - # Pre-compiled header source stubs need a different compiler flag - # (generate precompiled header) and any source file not of the same - # kind (i.e. C vs. C++) as the precompiled header source stub needs - # to have use of precompiled headers disabled. - extensions_excluded_from_precompile = [] - for config_name, config in spec["configurations"].items(): - source = config.get("msvs_precompiled_source") - if source: - source = _FixPath(source) - # UsePrecompiledHeader=1 for if using precompiled headers. - tool = MSVSProject.Tool("VCCLCompilerTool", {"UsePrecompiledHeader": "1"}) - p.AddFileConfig( - source, _ConfigFullName(config_name, config), {}, tools=[tool] - ) - _basename, extension = os.path.splitext(source) - if extension == ".c": - extensions_excluded_from_precompile = [".cc", ".cpp", ".cxx"] - else: - extensions_excluded_from_precompile = [".c"] - - def DisableForSourceTree(source_tree): - for source in source_tree: - if isinstance(source, MSVSProject.Filter): - DisableForSourceTree(source.contents) - else: - _basename, extension = os.path.splitext(source) - if extension in extensions_excluded_from_precompile: - for config_name, config in spec["configurations"].items(): - tool = MSVSProject.Tool( - "VCCLCompilerTool", - { - "UsePrecompiledHeader": "0", - "ForcedIncludeFiles": "$(NOINHERIT)", - }, - ) - p.AddFileConfig( - _FixPath(source), - _ConfigFullName(config_name, config), - {}, - tools=[tool], - ) - - # Do nothing if there was no precompiled source. - if extensions_excluded_from_precompile: - DisableForSourceTree(sources) - - -def _AddActions(actions_to_add, spec, relative_path_of_gyp_file): - # Add actions. - actions = spec.get("actions", []) - # Don't setup_env every time. When all the actions are run together in one - # batch file in VS, the PATH will grow too long. - # Membership in this set means that the cygwin environment has been set up, - # and does not need to be set up again. - have_setup_env = set() - for a in actions: - # Attach actions to the gyp file if nothing else is there. - inputs = a.get("inputs") or [relative_path_of_gyp_file] - attached_to = inputs[0] - need_setup_env = attached_to not in have_setup_env - cmd = _BuildCommandLineForRule( - spec, a, has_input_path=False, do_setup_env=need_setup_env - ) - have_setup_env.add(attached_to) - # Add the action. - _AddActionStep( - actions_to_add, - inputs=inputs, - outputs=a.get("outputs", []), - description=a.get("message", a["action_name"]), - command=cmd, - ) - - -def _WriteMSVSUserFile(project_path, version, spec): - # Add run_as and test targets. - if "run_as" in spec: - run_as = spec["run_as"] - action = run_as.get("action", []) - environment = run_as.get("environment", []) - working_directory = run_as.get("working_directory", ".") - elif int(spec.get("test", 0)): - action = ["$(TargetPath)", "--gtest_print_time"] - environment = [] - working_directory = "." - else: - return # Nothing to add - # Write out the user file. - user_file = _CreateMSVSUserFile(project_path, version, spec) - for config_name, c_data in spec["configurations"].items(): - user_file.AddDebugSettings( - _ConfigFullName(config_name, c_data), action, environment, working_directory - ) - user_file.WriteIfChanged() - - -def _AddCopies(actions_to_add, spec): - copies = _GetCopies(spec) - for inputs, outputs, cmd, description in copies: - _AddActionStep( - actions_to_add, - inputs=inputs, - outputs=outputs, - description=description, - command=cmd, - ) - - -def _GetCopies(spec): - copies = [] - # Add copies. - for cpy in spec.get("copies", []): - for src in cpy.get("files", []): - dst = os.path.join(cpy["destination"], os.path.basename(src)) - # _AddCustomBuildToolForMSVS() will call _FixPath() on the inputs and - # outputs, so do the same for our generated command line. - if src.endswith("/"): - src_bare = src[:-1] - base_dir = posixpath.split(src_bare)[0] - outer_dir = posixpath.split(src_bare)[1] - fixed_dst = _FixPath(dst) - full_dst = f'"{fixed_dst}\\{outer_dir}\\"' - cmd = ( - f'mkdir {full_dst} 2>nul & cd "{_FixPath(base_dir)}" ' - f'&& xcopy /e /f /y "{outer_dir}" {full_dst}' - ) - copies.append( - ( - [src], - ["dummy_copies", dst], - cmd, - f"Copying {src} to {fixed_dst}", - ) - ) - else: - fix_dst = _FixPath(cpy["destination"]) - cmd = ( - f'mkdir "{fix_dst}" 2>nul & set ERRORLEVEL=0 & ' - f'copy /Y "{_FixPath(src)}" "{_FixPath(dst)}"' - ) - copies.append(([src], [dst], cmd, f"Copying {src} to {fix_dst}")) - return copies - - -def _GetPathDict(root, path): - # |path| will eventually be empty (in the recursive calls) if it was initially - # relative; otherwise it will eventually end up as '\', 'D:\', etc. - if not path or path.endswith(os.sep): - return root - parent, folder = os.path.split(path) - parent_dict = _GetPathDict(root, parent) - if folder not in parent_dict: - parent_dict[folder] = {} - return parent_dict[folder] - - -def _DictsToFolders(base_path, bucket, flat): - # Convert to folders recursively. - children = [] - for folder, contents in bucket.items(): - if isinstance(contents, dict): - folder_children = _DictsToFolders( - os.path.join(base_path, folder), contents, flat - ) - if flat: - children += folder_children - else: - folder_children = MSVSNew.MSVSFolder( - os.path.join(base_path, folder), - name="(" + folder + ")", - entries=folder_children, - ) - children.append(folder_children) - else: - children.append(contents) - return children - - -def _CollapseSingles(parent, node): - # Recursively explorer the tree of dicts looking for projects which are - # the sole item in a folder which has the same name as the project. Bring - # such projects up one level. - if ( - isinstance(node, dict) - and len(node) == 1 - and next(iter(node)) == parent + ".vcproj" - ): - return node[next(iter(node))] - if not isinstance(node, dict): - return node - for child in node: - node[child] = _CollapseSingles(child, node[child]) - return node - - -def _GatherSolutionFolders(sln_projects, project_objects, flat): - root = {} - # Convert into a tree of dicts on path. - for p in sln_projects: - gyp_file, target = gyp.common.ParseQualifiedTarget(p)[0:2] - if p.endswith("#host"): - target += "_host" - gyp_dir = os.path.dirname(gyp_file) - path_dict = _GetPathDict(root, gyp_dir) - path_dict[target + ".vcproj"] = project_objects[p] - # Walk down from the top until we hit a folder that has more than one entry. - # In practice, this strips the top-level "src/" dir from the hierarchy in - # the solution. - while len(root) == 1 and isinstance(root[next(iter(root))], dict): - root = root[next(iter(root))] - # Collapse singles. - root = _CollapseSingles("", root) - # Merge buckets until everything is a root entry. - return _DictsToFolders("", root, flat) - - -def _GetPathOfProject(qualified_target, spec, options, msvs_version): - default_config = _GetDefaultConfiguration(spec) - proj_filename = default_config.get("msvs_existing_vcproj") - if not proj_filename: - proj_filename = spec["target_name"] - if spec["toolset"] == "host": - proj_filename += "_host" - proj_filename = proj_filename + options.suffix + msvs_version.ProjectExtension() - - build_file = gyp.common.BuildFile(qualified_target) - proj_path = os.path.join(os.path.dirname(build_file), proj_filename) - fix_prefix = None - if options.generator_output: - project_dir_path = os.path.dirname(os.path.abspath(proj_path)) - proj_path = os.path.join(options.generator_output, proj_path) - fix_prefix = gyp.common.RelativePath( - project_dir_path, os.path.dirname(proj_path) - ) - return proj_path, fix_prefix - - -def _GetPlatformOverridesOfProject(spec): - # Prepare a dict indicating which project configurations are used for which - # solution configurations for this target. - config_platform_overrides = {} - for config_name, c in spec["configurations"].items(): - config_fullname = _ConfigFullName(config_name, c) - platform = c.get("msvs_target_platform", _ConfigPlatform(c)) - base_name = _ConfigBaseName(config_name, _ConfigPlatform(c)) - fixed_config_fullname = f"{base_name}|{platform}" - if spec["toolset"] == "host" and generator_supports_multiple_toolsets: - fixed_config_fullname = f"{config_name}|x64" - config_platform_overrides[config_fullname] = fixed_config_fullname - return config_platform_overrides - - -def _CreateProjectObjects(target_list, target_dicts, options, msvs_version): - """Create a MSVSProject object for the targets found in target list. - - Arguments: - target_list: the list of targets to generate project objects for. - target_dicts: the dictionary of specifications. - options: global generator options. - msvs_version: the MSVSVersion object. - Returns: - A set of created projects, keyed by target. - """ - global fixpath_prefix - # Generate each project. - projects = {} - for qualified_target in target_list: - spec = target_dicts[qualified_target] - proj_path, fixpath_prefix = _GetPathOfProject( - qualified_target, spec, options, msvs_version - ) - guid = _GetGuidOfProject(proj_path, spec) - overrides = _GetPlatformOverridesOfProject(spec) - build_file = gyp.common.BuildFile(qualified_target) - # Create object for this project. - target_name = spec["target_name"] - if spec["toolset"] == "host": - target_name += "_host" - obj = MSVSNew.MSVSProject( - proj_path, - name=target_name, - guid=guid, - spec=spec, - build_file=build_file, - config_platform_overrides=overrides, - fixpath_prefix=fixpath_prefix, - ) - # Set project toolset if any (MS build only) - if msvs_version.UsesVcxproj(): - obj.set_msbuild_toolset( - _GetMsbuildToolsetOfProject(proj_path, spec, msvs_version) - ) - projects[qualified_target] = obj - # Set all the dependencies, but not if we are using an external builder like - # ninja - for project in projects.values(): - if not project.spec.get("msvs_external_builder"): - deps = project.spec.get("dependencies", []) - deps = [projects[d] for d in deps] - project.set_dependencies(deps) - return projects - - -def _InitNinjaFlavor(params, target_list, target_dicts): - """Initialize targets for the ninja flavor. - - This sets up the necessary variables in the targets to generate msvs projects - that use ninja as an external builder. The variables in the spec are only set - if they have not been set. This allows individual specs to override the - default values initialized here. - Arguments: - params: Params provided to the generator. - target_list: List of target pairs: 'base/base.gyp:base'. - target_dicts: Dict of target properties keyed on target pair. - """ - for qualified_target in target_list: - spec = target_dicts[qualified_target] - if spec.get("msvs_external_builder"): - # The spec explicitly defined an external builder, so don't change it. - continue - - path_to_ninja = spec.get("msvs_path_to_ninja", "ninja.exe") - - spec["msvs_external_builder"] = "ninja" - if not spec.get("msvs_external_builder_out_dir"): - gyp_file, _, _ = gyp.common.ParseQualifiedTarget(qualified_target) - gyp_dir = os.path.dirname(gyp_file) - configuration = "$(Configuration)" - if params.get("target_arch") == "x64": - configuration += "_x64" - if params.get("target_arch") == "arm64": - configuration += "_arm64" - spec["msvs_external_builder_out_dir"] = os.path.join( - gyp.common.RelativePath(params["options"].toplevel_dir, gyp_dir), - ninja_generator.ComputeOutputDir(params), - configuration, - ) - if not spec.get("msvs_external_builder_build_cmd"): - spec["msvs_external_builder_build_cmd"] = [ - path_to_ninja, - "-C", - "$(OutDir)", - "$(ProjectName)", - ] - if not spec.get("msvs_external_builder_clean_cmd"): - spec["msvs_external_builder_clean_cmd"] = [ - path_to_ninja, - "-C", - "$(OutDir)", - "-tclean", - "$(ProjectName)", - ] - - -def CalculateVariables(default_variables, params): - """Generated variables that require params to be known.""" - - generator_flags = params.get("generator_flags", {}) - - # Select project file format version (if unset, default to auto detecting). - msvs_version = MSVSVersion.SelectVisualStudioVersion( - generator_flags.get("msvs_version", "auto") - ) - # Stash msvs_version for later (so we don't have to probe the system twice). - params["msvs_version"] = msvs_version - - # Set a variable so conditions can be based on msvs_version. - default_variables["MSVS_VERSION"] = msvs_version.ShortName() - - # To determine processor word size on Windows, in addition to checking - # PROCESSOR_ARCHITECTURE (which reflects the word size of the current - # process), it is also necessary to check PROCESSOR_ARCITEW6432 (which - # contains the actual word size of the system when running thru WOW64). - if ( - os.environ.get("PROCESSOR_ARCHITECTURE", "").find("64") >= 0 - or os.environ.get("PROCESSOR_ARCHITEW6432", "").find("64") >= 0 - ): - default_variables["MSVS_OS_BITS"] = 64 - else: - default_variables["MSVS_OS_BITS"] = 32 - - if gyp.common.GetFlavor(params) == "ninja": - default_variables["SHARED_INTERMEDIATE_DIR"] = "$(OutDir)gen" - - -def PerformBuild(data, configurations, params): - options = params["options"] - msvs_version = params["msvs_version"] - devenv = os.path.join(msvs_version.path, "Common7", "IDE", "devenv.com") - - for build_file, build_file_dict in data.items(): - (build_file_root, build_file_ext) = os.path.splitext(build_file) - if build_file_ext != ".gyp": - continue - sln_path = build_file_root + options.suffix + ".sln" - if options.generator_output: - sln_path = os.path.join(options.generator_output, sln_path) - - for config in configurations: - arguments = [devenv, sln_path, "/Build", config] - print(f"Building [{config}]: {arguments}") - subprocess.check_call(arguments) - - -def CalculateGeneratorInputInfo(params): - if params.get("flavor") == "ninja": - toplevel = params["options"].toplevel_dir - qualified_out_dir = os.path.normpath( - os.path.join( - toplevel, - ninja_generator.ComputeOutputDir(params), - "gypfiles-msvs-ninja", - ) - ) - - global generator_filelist_paths - generator_filelist_paths = { - "toplevel": toplevel, - "qualified_out_dir": qualified_out_dir, - } - - -def GenerateOutput(target_list, target_dicts, data, params): - """Generate .sln and .vcproj files. - - This is the entry point for this generator. - Arguments: - target_list: List of target pairs: 'base/base.gyp:base'. - target_dicts: Dict of target properties keyed on target pair. - data: Dictionary containing per .gyp data. - """ - global fixpath_prefix - - options = params["options"] - - # Get the project file format version back out of where we stashed it in - # GeneratorCalculatedVariables. - msvs_version = params["msvs_version"] - - generator_flags = params.get("generator_flags", {}) - - # Optionally shard targets marked with 'msvs_shard': SHARD_COUNT. - (target_list, target_dicts) = MSVSUtil.ShardTargets(target_list, target_dicts) - - # Optionally use the large PDB workaround for targets marked with - # 'msvs_large_pdb': 1. - (target_list, target_dicts) = MSVSUtil.InsertLargePdbShims( - target_list, target_dicts, generator_default_variables - ) - - # Optionally configure each spec to use ninja as the external builder. - if params.get("flavor") == "ninja": - _InitNinjaFlavor(params, target_list, target_dicts) - - # Prepare the set of configurations. - configs = set() - for qualified_target in target_list: - spec = target_dicts[qualified_target] - for config_name, config in spec["configurations"].items(): - config_name = _ConfigFullName(config_name, config) - configs.add(config_name) - if config_name == "Release|arm64": - configs.add("Release|x64") - configs = list(configs) - - # Figure out all the projects that will be generated and their guids - project_objects = _CreateProjectObjects( - target_list, target_dicts, options, msvs_version - ) - - # Generate each project. - missing_sources = [] - for project in project_objects.values(): - fixpath_prefix = project.fixpath_prefix - missing_sources.extend( - _GenerateProject(project, options, msvs_version, generator_flags, spec) - ) - fixpath_prefix = None - - for build_file in data: - # Validate build_file extension - target_only_configs = configs - if generator_supports_multiple_toolsets: - target_only_configs = [i for i in configs if i.endswith("arm64")] - if not build_file.endswith(".gyp"): - continue - sln_path = os.path.splitext(build_file)[0] + options.suffix + ".sln" - if options.generator_output: - sln_path = os.path.join(options.generator_output, sln_path) - # Get projects in the solution, and their dependents. - sln_projects = gyp.common.BuildFileTargets(target_list, build_file) - sln_projects += gyp.common.DeepDependencyTargets(target_dicts, sln_projects) - # Create folder hierarchy. - root_entries = _GatherSolutionFolders( - sln_projects, project_objects, flat=msvs_version.FlatSolution() - ) - # Create solution. - sln = MSVSNew.MSVSSolution( - sln_path, - entries=root_entries, - variants=target_only_configs, - websiteProperties=False, - version=msvs_version, - ) - sln.Write() - - if missing_sources: - error_message = "Missing input files:\n" + "\n".join(set(missing_sources)) - if generator_flags.get("msvs_error_on_missing_sources", False): - raise GypError(error_message) - else: - print("Warning: " + error_message, file=sys.stdout) - - -def _GenerateMSBuildFiltersFile( - filters_path, - source_files, - rule_dependencies, - extension_to_rule_name, - platforms, - toolset, -): - """Generate the filters file. - - This file is used by Visual Studio to organize the presentation of source - files into folders. - - Arguments: - filters_path: The path of the file to be created. - source_files: The hierarchical structure of all the sources. - extension_to_rule_name: A dictionary mapping file extensions to rules. - """ - filter_group = [] - source_group = [] - _AppendFiltersForMSBuild( - "", - source_files, - rule_dependencies, - extension_to_rule_name, - platforms, - toolset, - filter_group, - source_group, - ) - if filter_group: - content = [ - "Project", - { - "ToolsVersion": "4.0", - "xmlns": "http://schemas.microsoft.com/developer/msbuild/2003", - }, - ["ItemGroup"] + filter_group, - ["ItemGroup"] + source_group, - ] - easy_xml.WriteXmlIfChanged(content, filters_path, pretty=True, win32=True) - elif os.path.exists(filters_path): - # We don't need this filter anymore. Delete the old filter file. - os.unlink(filters_path) - - -def _AppendFiltersForMSBuild( - parent_filter_name, - sources, - rule_dependencies, - extension_to_rule_name, - platforms, - toolset, - filter_group, - source_group, -): - """Creates the list of filters and sources to be added in the filter file. - - Args: - parent_filter_name: The name of the filter under which the sources are - found. - sources: The hierarchy of filters and sources to process. - extension_to_rule_name: A dictionary mapping file extensions to rules. - filter_group: The list to which filter entries will be appended. - source_group: The list to which source entries will be appended. - """ - for source in sources: - if isinstance(source, MSVSProject.Filter): - # We have a sub-filter. Create the name of that sub-filter. - if not parent_filter_name: - filter_name = source.name - else: - filter_name = f"{parent_filter_name}\\{source.name}" - # Add the filter to the group. - filter_group.append( - [ - "Filter", - {"Include": filter_name}, - ["UniqueIdentifier", MSVSNew.MakeGuid(source.name)], - ] - ) - # Recurse and add its dependents. - _AppendFiltersForMSBuild( - filter_name, - source.contents, - rule_dependencies, - extension_to_rule_name, - platforms, - toolset, - filter_group, - source_group, - ) - else: - # It's a source. Create a source entry. - _, element = _MapFileToMsBuildSourceType( - source, rule_dependencies, extension_to_rule_name, platforms, toolset - ) - source_entry = [element, {"Include": source}] - # Specify the filter it is part of, if any. - if parent_filter_name: - source_entry.append(["Filter", parent_filter_name]) - source_group.append(source_entry) - - -def _MapFileToMsBuildSourceType( - source, rule_dependencies, extension_to_rule_name, platforms, toolset -): - """Returns the group and element type of the source file. - - Arguments: - source: The source file name. - extension_to_rule_name: A dictionary mapping file extensions to rules. - - Returns: - A pair of (group this file should be part of, the label of element) - """ - _, ext = os.path.splitext(source) - ext = ext.lower() - if ext in extension_to_rule_name: - group = "rule" - element = extension_to_rule_name[ext] - elif ext in [".cc", ".cpp", ".c", ".cxx", ".mm"]: - group = "compile" - element = "ClCompile" - elif ext in [".h", ".hxx"]: - group = "include" - element = "ClInclude" - elif ext == ".rc": - group = "resource" - element = "ResourceCompile" - elif ext in [".s", ".asm"]: - group = "masm" - element = "MASM" - if "arm64" in platforms and toolset == "target": - element = "MARMASM" - elif ext == ".idl": - group = "midl" - element = "Midl" - elif source in rule_dependencies: - group = "rule_dependency" - element = "CustomBuild" - else: - group = "none" - element = "None" - return (group, element) - - -def _GenerateRulesForMSBuild( - output_dir, - options, - spec, - sources, - excluded_sources, - props_files_of_rules, - targets_files_of_rules, - actions_to_add, - rule_dependencies, - extension_to_rule_name, -): - # MSBuild rules are implemented using three files: an XML file, a .targets - # file and a .props file. - # For more details see: - # https://devblogs.microsoft.com/cppblog/quick-help-on-vs2010-custom-build-rule/ - rules = spec.get("rules", []) - rules_native = [r for r in rules if not int(r.get("msvs_external_rule", 0))] - rules_external = [r for r in rules if int(r.get("msvs_external_rule", 0))] - - msbuild_rules = [] - for rule in rules_native: - # Skip a rule with no action and no inputs. - if "action" not in rule and not rule.get("rule_sources", []): - continue - msbuild_rule = MSBuildRule(rule, spec) - msbuild_rules.append(msbuild_rule) - rule_dependencies.update(msbuild_rule.additional_dependencies.split(";")) - extension_to_rule_name[msbuild_rule.extension] = msbuild_rule.rule_name - if msbuild_rules: - base = spec["target_name"] + options.suffix - props_name = base + ".props" - targets_name = base + ".targets" - xml_name = base + ".xml" - - props_files_of_rules.add(props_name) - targets_files_of_rules.add(targets_name) - - props_path = os.path.join(output_dir, props_name) - targets_path = os.path.join(output_dir, targets_name) - xml_path = os.path.join(output_dir, xml_name) - - _GenerateMSBuildRulePropsFile(props_path, msbuild_rules) - _GenerateMSBuildRuleTargetsFile(targets_path, msbuild_rules) - _GenerateMSBuildRuleXmlFile(xml_path, msbuild_rules) - - if rules_external: - _GenerateExternalRules( - rules_external, output_dir, spec, sources, options, actions_to_add - ) - _AdjustSourcesForRules(rules, sources, excluded_sources, True) - - -class MSBuildRule: - """Used to store information used to generate an MSBuild rule. - - Attributes: - rule_name: The rule name, sanitized to use in XML. - target_name: The name of the target. - after_targets: The name of the AfterTargets element. - before_targets: The name of the BeforeTargets element. - depends_on: The name of the DependsOn element. - compute_output: The name of the ComputeOutput element. - dirs_to_make: The name of the DirsToMake element. - inputs: The name of the _inputs element. - tlog: The name of the _tlog element. - extension: The extension this rule applies to. - description: The message displayed when this rule is invoked. - additional_dependencies: A string listing additional dependencies. - outputs: The outputs of this rule. - command: The command used to run the rule. - """ - - def __init__(self, rule, spec): - self.display_name = rule["rule_name"] - # Assure that the rule name is only characters and numbers - self.rule_name = re.sub(r"\W", "_", self.display_name) - # Create the various element names, following the example set by the - # Visual Studio 2008 to 2010 conversion. I don't know if VS2010 - # is sensitive to the exact names. - self.target_name = "_" + self.rule_name - self.after_targets = self.rule_name + "AfterTargets" - self.before_targets = self.rule_name + "BeforeTargets" - self.depends_on = self.rule_name + "DependsOn" - self.compute_output = "Compute%sOutput" % self.rule_name - self.dirs_to_make = self.rule_name + "DirsToMake" - self.inputs = self.rule_name + "_inputs" - self.tlog = self.rule_name + "_tlog" - self.extension = rule["extension"] - if not self.extension.startswith("."): - self.extension = "." + self.extension - - self.description = MSVSSettings.ConvertVCMacrosToMSBuild( - rule.get("message", self.rule_name) - ) - old_additional_dependencies = _FixPaths(rule.get("inputs", [])) - self.additional_dependencies = ";".join( - [ - MSVSSettings.ConvertVCMacrosToMSBuild(i) - for i in old_additional_dependencies - ] - ) - old_outputs = _FixPaths(rule.get("outputs", [])) - self.outputs = ";".join( - [MSVSSettings.ConvertVCMacrosToMSBuild(i) for i in old_outputs] - ) - old_command = _BuildCommandLineForRule( - spec, rule, has_input_path=True, do_setup_env=True - ) - self.command = MSVSSettings.ConvertVCMacrosToMSBuild(old_command) - - -def _GenerateMSBuildRulePropsFile(props_path, msbuild_rules): - """Generate the .props file.""" - content = [ - "Project", - {"xmlns": "http://schemas.microsoft.com/developer/msbuild/2003"}, - ] - for rule in msbuild_rules: - content.extend( - [ - [ - "PropertyGroup", - { - "Condition": "'$(%s)' == '' and '$(%s)' == '' and " - "'$(ConfigurationType)' != 'Makefile'" - % (rule.before_targets, rule.after_targets) - }, - [rule.before_targets, "Midl"], - [rule.after_targets, "CustomBuild"], - ], - [ - "PropertyGroup", - [ - rule.depends_on, - {"Condition": "'$(ConfigurationType)' != 'Makefile'"}, - "_SelectedFiles;$(%s)" % rule.depends_on, - ], - ], - [ - "ItemDefinitionGroup", - [ - rule.rule_name, - ["CommandLineTemplate", rule.command], - ["Outputs", rule.outputs], - ["ExecutionDescription", rule.description], - ["AdditionalDependencies", rule.additional_dependencies], - ], - ], - ] - ) - easy_xml.WriteXmlIfChanged(content, props_path, pretty=True, win32=True) - - -def _GenerateMSBuildRuleTargetsFile(targets_path, msbuild_rules): - """Generate the .targets file.""" - content = [ - "Project", - {"xmlns": "http://schemas.microsoft.com/developer/msbuild/2003"}, - ] - item_group = [ - "ItemGroup", - [ - "PropertyPageSchema", - {"Include": "$(MSBuildThisFileDirectory)$(MSBuildThisFileName).xml"}, - ], - ] - for rule in msbuild_rules: - item_group.append( - [ - "AvailableItemName", - {"Include": rule.rule_name}, - ["Targets", rule.target_name], - ] - ) - content.append(item_group) - - for rule in msbuild_rules: - content.append( - [ - "UsingTask", - { - "TaskName": rule.rule_name, - "TaskFactory": "XamlTaskFactory", - "AssemblyName": "Microsoft.Build.Tasks.v4.0", - }, - ["Task", "$(MSBuildThisFileDirectory)$(MSBuildThisFileName).xml"], - ] - ) - for rule in msbuild_rules: - rule_name = rule.rule_name - target_outputs = "%%(%s.Outputs)" % rule_name - target_inputs = ( - "%%(%s.Identity);%%(%s.AdditionalDependencies);$(MSBuildProjectFile)" - ) % (rule_name, rule_name) - rule_inputs = "%%(%s.Identity)" % rule_name - extension_condition = ( - "'%(Extension)'=='.obj' or " - "'%(Extension)'=='.res' or " - "'%(Extension)'=='.rsc' or " - "'%(Extension)'=='.lib'" - ) - remove_section = [ - "ItemGroup", - {"Condition": "'@(SelectedFiles)' != ''"}, - [ - rule_name, - { - "Remove": "@(%s)" % rule_name, - "Condition": "'%(Identity)' != '@(SelectedFiles)'", - }, - ], - ] - inputs_section = [ - "ItemGroup", - [rule.inputs, {"Include": "%%(%s.AdditionalDependencies)" % rule_name}], - ] - logging_section = [ - "ItemGroup", - [ - rule.tlog, - { - "Include": "%%(%s.Outputs)" % rule_name, - "Condition": ( - "'%%(%s.Outputs)' != '' and " - "'%%(%s.ExcludedFromBuild)' != 'true'" % (rule_name, rule_name) - ), - }, - ["Source", "@(%s, '|')" % rule_name], - ["Inputs", "@(%s -> '%%(Fullpath)', ';')" % rule.inputs], - ], - ] - message_section = [ - "Message", - {"Importance": "High", "Text": "%%(%s.ExecutionDescription)" % rule_name}, - ] - write_tlog_section = [ - "WriteLinesToFile", - { - "Condition": "'@(%s)' != '' and '%%(%s.ExcludedFromBuild)' != " - "'true'" % (rule.tlog, rule.tlog), - "File": "$(IntDir)$(ProjectName).write.1.tlog", - "Lines": "^%%(%s.Source);@(%s->'%%(Fullpath)')" - % (rule.tlog, rule.tlog), - }, - ] - read_tlog_section = [ - "WriteLinesToFile", - { - "Condition": "'@(%s)' != '' and '%%(%s.ExcludedFromBuild)' != " - "'true'" % (rule.tlog, rule.tlog), - "File": "$(IntDir)$(ProjectName).read.1.tlog", - "Lines": f"^%({rule.tlog}.Source);%({rule.tlog}.Inputs)", - }, - ] - command_and_input_section = [ - rule_name, - { - "Condition": "'@(%s)' != '' and '%%(%s.ExcludedFromBuild)' != " - "'true'" % (rule_name, rule_name), - "EchoOff": "true", - "StandardOutputImportance": "High", - "StandardErrorImportance": "High", - "CommandLineTemplate": "%%(%s.CommandLineTemplate)" % rule_name, - "AdditionalOptions": "%%(%s.AdditionalOptions)" % rule_name, - "Inputs": rule_inputs, - }, - ] - content.extend( - [ - [ - "Target", - { - "Name": rule.target_name, - "BeforeTargets": "$(%s)" % rule.before_targets, - "AfterTargets": "$(%s)" % rule.after_targets, - "Condition": "'@(%s)' != ''" % rule_name, - "DependsOnTargets": "$(%s);%s" - % (rule.depends_on, rule.compute_output), - "Outputs": target_outputs, - "Inputs": target_inputs, - }, - remove_section, - inputs_section, - logging_section, - message_section, - write_tlog_section, - read_tlog_section, - command_and_input_section, - ], - [ - "PropertyGroup", - [ - "ComputeLinkInputsTargets", - "$(ComputeLinkInputsTargets);", - "%s;" % rule.compute_output, - ], - [ - "ComputeLibInputsTargets", - "$(ComputeLibInputsTargets);", - "%s;" % rule.compute_output, - ], - ], - [ - "Target", - { - "Name": rule.compute_output, - "Condition": "'@(%s)' != ''" % rule_name, - }, - [ - "ItemGroup", - [ - rule.dirs_to_make, - { - "Condition": "'@(%s)' != '' and " - "'%%(%s.ExcludedFromBuild)' != 'true'" - % (rule_name, rule_name), - "Include": "%%(%s.Outputs)" % rule_name, - }, - ], - [ - "Link", - { - "Include": "%%(%s.Identity)" % rule.dirs_to_make, - "Condition": extension_condition, - }, - ], - [ - "Lib", - { - "Include": "%%(%s.Identity)" % rule.dirs_to_make, - "Condition": extension_condition, - }, - ], - [ - "ImpLib", - { - "Include": "%%(%s.Identity)" % rule.dirs_to_make, - "Condition": extension_condition, - }, - ], - ], - [ - "MakeDir", - { - "Directories": ( - "@(%s->'%%(RootDir)%%(Directory)')" % rule.dirs_to_make - ) - }, - ], - ], - ] - ) - easy_xml.WriteXmlIfChanged(content, targets_path, pretty=True, win32=True) - - -def _GenerateMSBuildRuleXmlFile(xml_path, msbuild_rules): - # Generate the .xml file - content = [ - "ProjectSchemaDefinitions", - { - "xmlns": ( - "clr-namespace:Microsoft.Build.Framework.XamlTypes;" - "assembly=Microsoft.Build.Framework" - ), - "xmlns:x": "http://schemas.microsoft.com/winfx/2006/xaml", - "xmlns:sys": "clr-namespace:System;assembly=mscorlib", - "xmlns:transformCallback": "Microsoft.Cpp.Dev10.ConvertPropertyCallback", - }, - ] - for rule in msbuild_rules: - content.extend( - [ - [ - "Rule", - { - "Name": rule.rule_name, - "PageTemplate": "tool", - "DisplayName": rule.display_name, - "Order": "200", - }, - [ - "Rule.DataSource", - [ - "DataSource", - {"Persistence": "ProjectFile", "ItemType": rule.rule_name}, - ], - ], - [ - "Rule.Categories", - [ - "Category", - {"Name": "General"}, - ["Category.DisplayName", ["sys:String", "General"]], - ], - [ - "Category", - {"Name": "Command Line", "Subtype": "CommandLine"}, - ["Category.DisplayName", ["sys:String", "Command Line"]], - ], - ], - [ - "StringListProperty", - { - "Name": "Inputs", - "Category": "Command Line", - "IsRequired": "true", - "Switch": " ", - }, - [ - "StringListProperty.DataSource", - [ - "DataSource", - { - "Persistence": "ProjectFile", - "ItemType": rule.rule_name, - "SourceType": "Item", - }, - ], - ], - ], - [ - "StringProperty", - { - "Name": "CommandLineTemplate", - "DisplayName": "Command Line", - "Visible": "False", - "IncludeInCommandLine": "False", - }, - ], - [ - "DynamicEnumProperty", - { - "Name": rule.before_targets, - "Category": "General", - "EnumProvider": "Targets", - "IncludeInCommandLine": "False", - }, - [ - "DynamicEnumProperty.DisplayName", - ["sys:String", "Execute Before"], - ], - [ - "DynamicEnumProperty.Description", - [ - "sys:String", - "Specifies the targets for the build customization" - " to run before.", - ], - ], - [ - "DynamicEnumProperty.ProviderSettings", - [ - "NameValuePair", - { - "Name": "Exclude", - "Value": "^%s|^Compute" % rule.before_targets, - }, - ], - ], - [ - "DynamicEnumProperty.DataSource", - [ - "DataSource", - { - "Persistence": "ProjectFile", - "HasConfigurationCondition": "true", - }, - ], - ], - ], - [ - "DynamicEnumProperty", - { - "Name": rule.after_targets, - "Category": "General", - "EnumProvider": "Targets", - "IncludeInCommandLine": "False", - }, - [ - "DynamicEnumProperty.DisplayName", - ["sys:String", "Execute After"], - ], - [ - "DynamicEnumProperty.Description", - [ - "sys:String", - ( - "Specifies the targets for the build customization" - " to run after." - ), - ], - ], - [ - "DynamicEnumProperty.ProviderSettings", - [ - "NameValuePair", - { - "Name": "Exclude", - "Value": "^%s|^Compute" % rule.after_targets, - }, - ], - ], - [ - "DynamicEnumProperty.DataSource", - [ - "DataSource", - { - "Persistence": "ProjectFile", - "ItemType": "", - "HasConfigurationCondition": "true", - }, - ], - ], - ], - [ - "StringListProperty", - { - "Name": "Outputs", - "DisplayName": "Outputs", - "Visible": "False", - "IncludeInCommandLine": "False", - }, - ], - [ - "StringProperty", - { - "Name": "ExecutionDescription", - "DisplayName": "Execution Description", - "Visible": "False", - "IncludeInCommandLine": "False", - }, - ], - [ - "StringListProperty", - { - "Name": "AdditionalDependencies", - "DisplayName": "Additional Dependencies", - "IncludeInCommandLine": "False", - "Visible": "false", - }, - ], - [ - "StringProperty", - { - "Subtype": "AdditionalOptions", - "Name": "AdditionalOptions", - "Category": "Command Line", - }, - [ - "StringProperty.DisplayName", - ["sys:String", "Additional Options"], - ], - [ - "StringProperty.Description", - ["sys:String", "Additional Options"], - ], - ], - ], - [ - "ItemType", - {"Name": rule.rule_name, "DisplayName": rule.display_name}, - ], - [ - "FileExtension", - {"Name": "*" + rule.extension, "ContentType": rule.rule_name}, - ], - [ - "ContentType", - { - "Name": rule.rule_name, - "DisplayName": "", - "ItemType": rule.rule_name, - }, - ], - ] - ) - easy_xml.WriteXmlIfChanged(content, xml_path, pretty=True, win32=True) - - -def _GetConfigurationAndPlatform(name, settings, spec): - configuration = name.rsplit("_", 1)[0] - platform = settings.get("msvs_configuration_platform", "Win32") - if spec["toolset"] == "host" and platform == "arm64": - platform = "x64" # Host-only tools are always built for x64 - return (configuration, platform) - - -def _GetConfigurationCondition(name, settings, spec): - return r"'$(Configuration)|$(Platform)'=='%s|%s'" % _GetConfigurationAndPlatform( - name, settings, spec - ) - - -def _GetMSBuildProjectConfigurations(configurations, spec): - group = ["ItemGroup", {"Label": "ProjectConfigurations"}] - for name, settings in sorted(configurations.items()): - configuration, platform = _GetConfigurationAndPlatform(name, settings, spec) - designation = f"{configuration}|{platform}" - group.append( - [ - "ProjectConfiguration", - {"Include": designation}, - ["Configuration", configuration], - ["Platform", platform], - ] - ) - return [group] - - -def _GetMSBuildGlobalProperties(spec, version, guid, gyp_file_name): - namespace = os.path.splitext(gyp_file_name)[0] - properties = [ - [ - "PropertyGroup", - {"Label": "Globals"}, - ["ProjectGuid", guid], - ["Keyword", "Win32Proj"], - ["RootNamespace", namespace], - ["IgnoreWarnCompileDuplicatedFilename", "true"], - ] - ] - - if ( - os.environ.get("PROCESSOR_ARCHITECTURE") == "AMD64" - or os.environ.get("PROCESSOR_ARCHITEW6432") == "AMD64" - ): - properties[0].append(["PreferredToolArchitecture", "x64"]) - - if spec.get("msvs_target_platform_version"): - target_platform_version = spec.get("msvs_target_platform_version") - properties[0].append(["WindowsTargetPlatformVersion", target_platform_version]) - if spec.get("msvs_target_platform_minversion"): - target_platform_minversion = spec.get("msvs_target_platform_minversion") - properties[0].append( - ["WindowsTargetPlatformMinVersion", target_platform_minversion] - ) - else: - properties[0].append( - ["WindowsTargetPlatformMinVersion", target_platform_version] - ) - - if spec.get("msvs_enable_winrt"): - properties[0].append(["DefaultLanguage", "en-US"]) - properties[0].append(["AppContainerApplication", "true"]) - if spec.get("msvs_application_type_revision"): - app_type_revision = spec.get("msvs_application_type_revision") - properties[0].append(["ApplicationTypeRevision", app_type_revision]) - else: - properties[0].append(["ApplicationTypeRevision", "8.1"]) - if spec.get("msvs_enable_winphone"): - properties[0].append(["ApplicationType", "Windows Phone"]) - else: - properties[0].append(["ApplicationType", "Windows Store"]) - - platform_name = None - msvs_windows_sdk_version = None - for configuration in spec["configurations"].values(): - platform_name = platform_name or _ConfigPlatform(configuration) - msvs_windows_sdk_version = ( - msvs_windows_sdk_version - or _ConfigWindowsTargetPlatformVersion(configuration, version) - ) - if platform_name and msvs_windows_sdk_version: - break - if msvs_windows_sdk_version: - properties[0].append( - ["WindowsTargetPlatformVersion", str(msvs_windows_sdk_version)] - ) - elif version.compatible_sdks: - raise GypError( - "%s requires any SDK of %s version, but none were found" - % (version.description, version.compatible_sdks) - ) - - if platform_name == "ARM": - properties[0].append(["WindowsSDKDesktopARMSupport", "true"]) - - return properties - - -def _GetMSBuildConfigurationDetails(spec, build_file): - properties = {} - for name, settings in spec["configurations"].items(): - msbuild_attributes = _GetMSBuildAttributes(spec, settings, build_file) - condition = _GetConfigurationCondition(name, settings, spec) - character_set = msbuild_attributes.get("CharacterSet") - vctools_version = msbuild_attributes.get("VCToolsVersion") - config_type = msbuild_attributes.get("ConfigurationType") - _AddConditionalProperty(properties, condition, "ConfigurationType", config_type) - spectre_mitigation = msbuild_attributes.get("SpectreMitigation") - if spectre_mitigation: - _AddConditionalProperty( - properties, condition, "SpectreMitigation", spectre_mitigation - ) - if config_type == "Driver": - _AddConditionalProperty(properties, condition, "DriverType", "WDM") - _AddConditionalProperty( - properties, condition, "TargetVersion", _ConfigTargetVersion(settings) - ) - if character_set and "msvs_enable_winrt" not in spec: - _AddConditionalProperty( - properties, condition, "CharacterSet", character_set - ) - if vctools_version and "msvs_enable_winrt" not in spec: - _AddConditionalProperty( - properties, condition, "VCToolsVersion", vctools_version - ) - return _GetMSBuildPropertyGroup(spec, "Configuration", properties) - - -def _GetMSBuildLocalProperties(msbuild_toolset): - # Currently the only local property we support is PlatformToolset - properties = {} - if msbuild_toolset: - properties = [ - [ - "PropertyGroup", - {"Label": "Locals"}, - ["PlatformToolset", msbuild_toolset], - ] - ] - return properties - - -def _GetMSBuildPropertySheets(configurations, spec): - user_props = r"$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" - additional_props = {} - props_specified = False - for name, settings in sorted(configurations.items()): - configuration = _GetConfigurationCondition(name, settings, spec) - if "msbuild_props" in settings: - additional_props[configuration] = _FixPaths(settings["msbuild_props"]) - props_specified = True - else: - additional_props[configuration] = "" - - if not props_specified: - return [ - [ - "ImportGroup", - {"Label": "PropertySheets"}, - [ - "Import", - { - "Project": user_props, - "Condition": "exists('%s')" % user_props, - "Label": "LocalAppDataPlatform", - }, - ], - ] - ] - else: - sheets = [] - for condition, props in additional_props.items(): - import_group = [ - "ImportGroup", - {"Label": "PropertySheets", "Condition": condition}, - [ - "Import", - { - "Project": user_props, - "Condition": "exists('%s')" % user_props, - "Label": "LocalAppDataPlatform", - }, - ], - ] - for props_file in props: - import_group.append(["Import", {"Project": props_file}]) - sheets.append(import_group) - return sheets - - -def _ConvertMSVSBuildAttributes(spec, config, build_file): - config_type = _GetMSVSConfigurationType(spec, build_file) - msvs_attributes = _GetMSVSAttributes(spec, config, config_type) - msbuild_attributes = {} - for a in msvs_attributes: - if a in ["IntermediateDirectory", "OutputDirectory"]: - directory = MSVSSettings.ConvertVCMacrosToMSBuild(msvs_attributes[a]) - if not directory.endswith("\\"): - directory += "\\" - msbuild_attributes[a] = directory - elif a == "CharacterSet": - msbuild_attributes[a] = _ConvertMSVSCharacterSet(msvs_attributes[a]) - elif a == "ConfigurationType": - msbuild_attributes[a] = _ConvertMSVSConfigurationType(msvs_attributes[a]) - elif a == "SpectreMitigation" or a == "VCToolsVersion": - msbuild_attributes[a] = msvs_attributes[a] - else: - print("Warning: Do not know how to convert MSVS attribute " + a) - return msbuild_attributes - - -def _ConvertMSVSCharacterSet(char_set): - if char_set.isdigit(): - char_set = {"0": "MultiByte", "1": "Unicode", "2": "MultiByte"}[char_set] - return char_set - - -def _ConvertMSVSConfigurationType(config_type): - if config_type.isdigit(): - config_type = { - "1": "Application", - "2": "DynamicLibrary", - "4": "StaticLibrary", - "5": "Driver", - "10": "Utility", - }[config_type] - return config_type - - -def _GetMSBuildAttributes(spec, config, build_file): - if "msbuild_configuration_attributes" not in config: - msbuild_attributes = _ConvertMSVSBuildAttributes(spec, config, build_file) - - else: - config_type = _GetMSVSConfigurationType(spec, build_file) - config_type = _ConvertMSVSConfigurationType(config_type) - msbuild_attributes = config.get("msbuild_configuration_attributes", {}) - msbuild_attributes.setdefault("ConfigurationType", config_type) - output_dir = msbuild_attributes.get( - "OutputDirectory", "$(SolutionDir)$(Configuration)" - ) - msbuild_attributes["OutputDirectory"] = _FixPath(output_dir) + "\\" - if "IntermediateDirectory" not in msbuild_attributes: - intermediate = _FixPath("$(Configuration)") + "\\" - msbuild_attributes["IntermediateDirectory"] = intermediate - if "CharacterSet" in msbuild_attributes: - msbuild_attributes["CharacterSet"] = _ConvertMSVSCharacterSet( - msbuild_attributes["CharacterSet"] - ) - if "TargetName" not in msbuild_attributes: - prefix = spec.get("product_prefix", "") - product_name = spec.get("product_name", "$(ProjectName)") - target_name = prefix + product_name - msbuild_attributes["TargetName"] = target_name - if "TargetExt" not in msbuild_attributes and "product_extension" in spec: - ext = spec.get("product_extension") - msbuild_attributes["TargetExt"] = "." + ext - - if spec.get("msvs_external_builder"): - external_out_dir = spec.get("msvs_external_builder_out_dir", ".") - msbuild_attributes["OutputDirectory"] = _FixPath(external_out_dir) + "\\" - - # Make sure that 'TargetPath' matches 'Lib.OutputFile' or 'Link.OutputFile' - # (depending on the tool used) to avoid MSB8012 warning. - msbuild_tool_map = { - "executable": "Link", - "shared_library": "Link", - "loadable_module": "Link", - "windows_driver": "Link", - "static_library": "Lib", - } - if msbuild_tool := msbuild_tool_map.get(spec["type"]): - msbuild_settings = config["finalized_msbuild_settings"] - out_file = msbuild_settings[msbuild_tool].get("OutputFile") - if out_file: - msbuild_attributes["TargetPath"] = _FixPath(out_file) - target_ext = msbuild_settings[msbuild_tool].get("TargetExt") - if target_ext: - msbuild_attributes["TargetExt"] = target_ext - - return msbuild_attributes - - -def _GetMSBuildConfigurationGlobalProperties(spec, configurations, build_file): - # TODO(jeanluc) We could optimize out the following and do it only if - # there are actions. - # TODO(jeanluc) Handle the equivalent of setting 'CYGWIN=nontsec'. - new_paths = [] - if cygwin_dirs := spec.get("msvs_cygwin_dirs", ["."])[0]: - cyg_path = "$(MSBuildProjectDirectory)\\%s\\bin\\" % _FixPath(cygwin_dirs) - new_paths.append(cyg_path) - # TODO(jeanluc) Change the convention to have both a cygwin_dir and a - # python_dir. - python_path = cyg_path.replace("cygwin\\bin", "python_26") - new_paths.append(python_path) - if new_paths: - new_paths = "$(ExecutablePath);" + ";".join(new_paths) - - properties = {} - for name, configuration in sorted(configurations.items()): - condition = _GetConfigurationCondition(name, configuration, spec) - attributes = _GetMSBuildAttributes(spec, configuration, build_file) - msbuild_settings = configuration["finalized_msbuild_settings"] - _AddConditionalProperty( - properties, condition, "IntDir", attributes["IntermediateDirectory"] - ) - _AddConditionalProperty( - properties, condition, "OutDir", attributes["OutputDirectory"] - ) - _AddConditionalProperty( - properties, condition, "TargetName", attributes["TargetName"] - ) - if "TargetExt" in attributes: - _AddConditionalProperty( - properties, condition, "TargetExt", attributes["TargetExt"] - ) - - if attributes.get("TargetPath"): - _AddConditionalProperty( - properties, condition, "TargetPath", attributes["TargetPath"] - ) - if attributes.get("TargetExt"): - _AddConditionalProperty( - properties, condition, "TargetExt", attributes["TargetExt"] - ) - - if new_paths: - _AddConditionalProperty(properties, condition, "ExecutablePath", new_paths) - tool_settings = msbuild_settings.get("", {}) - for name, value in sorted(tool_settings.items()): - formatted_value = _GetValueFormattedForMSBuild("", name, value) - _AddConditionalProperty(properties, condition, name, formatted_value) - return _GetMSBuildPropertyGroup(spec, None, properties) - - -def _AddConditionalProperty(properties, condition, name, value): - """Adds a property / conditional value pair to a dictionary. - - Arguments: - properties: The dictionary to be modified. The key is the name of the - property. The value is itself a dictionary; its key is the value and - the value a list of condition for which this value is true. - condition: The condition under which the named property has the value. - name: The name of the property. - value: The value of the property. - """ - if name not in properties: - properties[name] = {} - values = properties[name] - if value not in values: - values[value] = [] - conditions = values[value] - conditions.append(condition) - - -# Regex for msvs variable references ( i.e. $(FOO) ). -MSVS_VARIABLE_REFERENCE = re.compile(r"\$\(([a-zA-Z_][a-zA-Z0-9_]*)\)") - - -def _GetMSBuildPropertyGroup(spec, label, properties): - """Returns a PropertyGroup definition for the specified properties. - - Arguments: - spec: The target project dict. - label: An optional label for the PropertyGroup. - properties: The dictionary to be converted. The key is the name of the - property. The value is itself a dictionary; its key is the value and - the value a list of condition for which this value is true. - """ - group = ["PropertyGroup"] - if label: - group.append({"Label": label}) - num_configurations = len(spec["configurations"]) - - def GetEdges(node): - # Use a definition of edges such that user_of_variable -> used_variable. - # This happens to be easier in this case, since a variable's - # definition contains all variables it references in a single string. - edges = set() - for value in sorted(properties[node].keys()): - # Add to edges all $(...) references to variables. - # - # Variable references that refer to names not in properties are excluded - # These can exist for instance to refer built in definitions like - # $(SolutionDir). - # - # Self references are ignored. Self reference is used in a few places to - # append to the default value. I.e. PATH=$(PATH);other_path - edges.update( - { - v - for v in MSVS_VARIABLE_REFERENCE.findall(value) - if v in properties and v != node - } - ) - return edges - - properties_ordered = gyp.common.TopologicallySorted(properties.keys(), GetEdges) - # Walk properties in the reverse of a topological sort on - # user_of_variable -> used_variable as this ensures variables are - # defined before they are used. - # NOTE: reverse(topsort(DAG)) = topsort(reverse_edges(DAG)) - for name in reversed(properties_ordered): - values = properties[name] - for value, conditions in sorted(values.items()): - if len(conditions) == num_configurations: - # If the value is the same all configurations, - # just add one unconditional entry. - group.append([name, value]) - else: - for condition in conditions: - group.append([name, {"Condition": condition}, value]) - return [group] - - -def _GetMSBuildToolSettingsSections(spec, configurations): - groups = [] - for name, configuration in sorted(configurations.items()): - msbuild_settings = configuration["finalized_msbuild_settings"] - group = [ - "ItemDefinitionGroup", - {"Condition": _GetConfigurationCondition(name, configuration, spec)}, - ] - for tool_name, tool_settings in sorted(msbuild_settings.items()): - # Skip the tool named '' which is a holder of global settings handled - # by _GetMSBuildConfigurationGlobalProperties. - if tool_name and tool_settings: - tool = [tool_name] - for name, value in sorted(tool_settings.items()): - formatted_value = _GetValueFormattedForMSBuild( - tool_name, name, value - ) - tool.append([name, formatted_value]) - group.append(tool) - groups.append(group) - return groups - - -def _FinalizeMSBuildSettings(spec, configuration): - if "msbuild_settings" in configuration: - converted = False - msbuild_settings = configuration["msbuild_settings"] - MSVSSettings.ValidateMSBuildSettings(msbuild_settings) - else: - converted = True - msvs_settings = configuration.get("msvs_settings", {}) - msbuild_settings = MSVSSettings.ConvertToMSBuildSettings(msvs_settings) - include_dirs, midl_include_dirs, resource_include_dirs = _GetIncludeDirs( - configuration - ) - libraries = _GetLibraries(spec) - library_dirs = _GetLibraryDirs(configuration) - out_file, _, msbuild_tool = _GetOutputFilePathAndTool(spec, msbuild=True) - target_ext = _GetOutputTargetExt(spec) - defines = _GetDefines(configuration) - if converted: - # Visual Studio 2010 has TR1 - defines = [d for d in defines if d != "_HAS_TR1=0"] - # Warn of ignored settings - ignored_settings = ["msvs_tool_files"] - for ignored_setting in ignored_settings: - value = configuration.get(ignored_setting) - if value: - print( - "Warning: The automatic conversion to MSBuild does not handle " - "%s. Ignoring setting of %s" % (ignored_setting, str(value)) - ) - - defines = [_EscapeCppDefineForMSBuild(d) for d in defines] - disabled_warnings = _GetDisabledWarnings(configuration) - prebuild = configuration.get("msvs_prebuild") - postbuild = configuration.get("msvs_postbuild") - def_file = _GetModuleDefinition(spec) - - # Add the information to the appropriate tool - # TODO(jeanluc) We could optimize and generate these settings only if - # the corresponding files are found, e.g. don't generate ResourceCompile - # if you don't have any resources. - _ToolAppend( - msbuild_settings, "ClCompile", "AdditionalIncludeDirectories", include_dirs - ) - _ToolAppend( - msbuild_settings, "Midl", "AdditionalIncludeDirectories", midl_include_dirs - ) - _ToolAppend( - msbuild_settings, - "ResourceCompile", - "AdditionalIncludeDirectories", - resource_include_dirs, - ) - # Add in libraries, note that even for empty libraries, we want this - # set, to prevent inheriting default libraries from the environment. - _ToolSetOrAppend(msbuild_settings, "Link", "AdditionalDependencies", libraries) - _ToolAppend(msbuild_settings, "Link", "AdditionalLibraryDirectories", library_dirs) - if out_file: - _ToolAppend( - msbuild_settings, msbuild_tool, "OutputFile", out_file, only_if_unset=True - ) - if target_ext: - _ToolAppend( - msbuild_settings, msbuild_tool, "TargetExt", target_ext, only_if_unset=True - ) - # Add defines. - _ToolAppend(msbuild_settings, "ClCompile", "PreprocessorDefinitions", defines) - _ToolAppend(msbuild_settings, "ResourceCompile", "PreprocessorDefinitions", defines) - # Add disabled warnings. - _ToolAppend( - msbuild_settings, "ClCompile", "DisableSpecificWarnings", disabled_warnings - ) - # Turn on precompiled headers if appropriate. - if precompiled_header := configuration.get("msvs_precompiled_header"): - # While MSVC works with just file name eg. "v8_pch.h", ClangCL requires - # the full path eg. "tools/msvs/pch/v8_pch.h" to find the file. - # P.S. Only ClangCL defines msbuild_toolset, for MSVC it is None. - if configuration.get("msbuild_toolset") != "ClangCL": - precompiled_header = os.path.split(precompiled_header)[1] - _ToolAppend(msbuild_settings, "ClCompile", "PrecompiledHeader", "Use") - _ToolAppend( - msbuild_settings, "ClCompile", "PrecompiledHeaderFile", precompiled_header - ) - _ToolAppend( - msbuild_settings, "ClCompile", "ForcedIncludeFiles", [precompiled_header] - ) - else: - _ToolAppend(msbuild_settings, "ClCompile", "PrecompiledHeader", "NotUsing") - # Turn off WinRT compilation - _ToolAppend(msbuild_settings, "ClCompile", "CompileAsWinRT", "false") - # Turn on import libraries if appropriate - if spec.get("msvs_requires_importlibrary"): - _ToolAppend(msbuild_settings, "", "IgnoreImportLibrary", "false") - # Loadable modules don't generate import libraries; - # tell dependent projects to not expect one. - if spec["type"] == "loadable_module": - _ToolAppend(msbuild_settings, "", "IgnoreImportLibrary", "true") - # Set the module definition file if any. - if def_file: - _ToolAppend(msbuild_settings, "Link", "ModuleDefinitionFile", def_file) - configuration["finalized_msbuild_settings"] = msbuild_settings - if prebuild: - _ToolAppend(msbuild_settings, "PreBuildEvent", "Command", prebuild) - if postbuild: - _ToolAppend(msbuild_settings, "PostBuildEvent", "Command", postbuild) - - -def _GetValueFormattedForMSBuild(tool_name, name, value): - if isinstance(value, list): - # For some settings, VS2010 does not automatically extends the settings - # TODO(jeanluc) Is this what we want? - if name in [ - "AdditionalIncludeDirectories", - "AdditionalLibraryDirectories", - "AdditionalOptions", - "DelayLoadDLLs", - "DisableSpecificWarnings", - "PreprocessorDefinitions", - ]: - value.append("%%(%s)" % name) - # For most tools, entries in a list should be separated with ';' but some - # settings use a space. Check for those first. - exceptions = { - "ClCompile": ["AdditionalOptions"], - "Link": ["AdditionalOptions"], - "Lib": ["AdditionalOptions"], - } - char = " " if name in exceptions.get(tool_name, []) else ";" - formatted_value = char.join( - [MSVSSettings.ConvertVCMacrosToMSBuild(i) for i in value] - ) - else: - formatted_value = MSVSSettings.ConvertVCMacrosToMSBuild(value) - return formatted_value - - -def _VerifySourcesExist(sources, root_dir): - """Verifies that all source files exist on disk. - - Checks that all regular source files, i.e. not created at run time, - exist on disk. Missing files cause needless recompilation but no otherwise - visible errors. - - Arguments: - sources: A recursive list of Filter/file names. - root_dir: The root directory for the relative path names. - Returns: - A list of source files that cannot be found on disk. - """ - missing_sources = [] - for source in sources: - if isinstance(source, MSVSProject.Filter): - missing_sources.extend(_VerifySourcesExist(source.contents, root_dir)) - elif "$" not in source: - full_path = os.path.join(root_dir, source) - if not os.path.exists(full_path): - missing_sources.append(full_path) - return missing_sources - - -def _GetMSBuildSources( - spec, - sources, - exclusions, - rule_dependencies, - extension_to_rule_name, - actions_spec, - sources_handled_by_action, - list_excluded, -): - groups = [ - "none", - "masm", - "midl", - "include", - "compile", - "resource", - "rule", - "rule_dependency", - ] - grouped_sources = {} - for g in groups: - grouped_sources[g] = [] - - _AddSources2( - spec, - sources, - exclusions, - grouped_sources, - rule_dependencies, - extension_to_rule_name, - sources_handled_by_action, - list_excluded, - ) - sources = [] - for g in groups: - if grouped_sources[g]: - sources.append(["ItemGroup"] + grouped_sources[g]) - if actions_spec: - sources.append(["ItemGroup"] + actions_spec) - return sources - - -def _AddSources2( - spec, - sources, - exclusions, - grouped_sources, - rule_dependencies, - extension_to_rule_name, - sources_handled_by_action, - list_excluded, -): - extensions_excluded_from_precompile = [] - for source in sources: - if isinstance(source, MSVSProject.Filter): - _AddSources2( - spec, - source.contents, - exclusions, - grouped_sources, - rule_dependencies, - extension_to_rule_name, - sources_handled_by_action, - list_excluded, - ) - elif source not in sources_handled_by_action: - detail = [] - excluded_configurations = exclusions.get(source, []) - if len(excluded_configurations) == len(spec["configurations"]): - detail.append(["ExcludedFromBuild", "true"]) - else: - for config_name, configuration in sorted(excluded_configurations): - condition = _GetConfigurationCondition(config_name, configuration) - detail.append( - ["ExcludedFromBuild", {"Condition": condition}, "true"] - ) - # Add precompile if needed - for config_name, configuration in spec["configurations"].items(): - precompiled_source = configuration.get("msvs_precompiled_source", "") - if precompiled_source != "": - precompiled_source = _FixPath(precompiled_source) - if not extensions_excluded_from_precompile: - # If the precompiled header is generated by a C source, - # we must not try to use it for C++ sources, - # and vice versa. - _basename, extension = os.path.splitext(precompiled_source) - if extension == ".c": - extensions_excluded_from_precompile = [ - ".cc", - ".cpp", - ".cxx", - ] - else: - extensions_excluded_from_precompile = [".c"] - - if precompiled_source == source: - condition = _GetConfigurationCondition( - config_name, configuration, spec - ) - detail.append( - ["PrecompiledHeader", {"Condition": condition}, "Create"] - ) - else: - # Turn off precompiled header usage for source files of a - # different type than the file that generated the - # precompiled header. - for extension in extensions_excluded_from_precompile: - if source.endswith(extension): - detail.append(["PrecompiledHeader", ""]) - detail.append(["ForcedIncludeFiles", ""]) - - group, element = _MapFileToMsBuildSourceType( - source, - rule_dependencies, - extension_to_rule_name, - _GetUniquePlatforms(spec), - spec["toolset"], - ) - if group == "compile" and not os.path.isabs(source): - # Add an value to support duplicate source - # file basenames, except for absolute paths to avoid paths - # with more than 260 characters. - file_name = os.path.splitext(source)[0] + ".obj" - if file_name.startswith("..\\"): - file_name = re.sub(r"^(\.\.\\)+", "", file_name) - elif file_name.startswith("$("): - file_name = re.sub(r"^\$\([^)]+\)\\", "", file_name) - detail.append(["ObjectFileName", "$(IntDir)\\" + file_name]) - grouped_sources[group].append([element, {"Include": source}] + detail) - - -def _GetMSBuildProjectReferences(project): - references = [] - if project.dependencies: - group = ["ItemGroup"] - added_dependency_set = set() - for dependency in project.dependencies: - dependency_spec = dependency.spec - should_skip_dep = False - if project.spec["toolset"] == "target": - if dependency_spec["toolset"] == "host": - if dependency_spec["type"] == "static_library": - should_skip_dep = True - if dependency.name.startswith("run_"): - should_skip_dep = False - if should_skip_dep: - continue - - canonical_name = dependency.name.replace("_host", "") - added_dependency_set.add(canonical_name) - guid = dependency.guid - project_dir = os.path.split(project.path)[0] - relative_path = gyp.common.RelativePath(dependency.path, project_dir) - project_ref = [ - "ProjectReference", - {"Include": relative_path}, - ["Project", guid], - ["ReferenceOutputAssembly", "false"], - ] - for config in dependency.spec.get("configurations", {}).values(): - if config.get("msvs_use_library_dependency_inputs", 0): - project_ref.append(["UseLibraryDependencyInputs", "true"]) - break - # If it's disabled in any config, turn it off in the reference. - if config.get("msvs_2010_disable_uldi_when_referenced", 0): - project_ref.append(["UseLibraryDependencyInputs", "false"]) - break - group.append(project_ref) - references.append(group) - return references - - -def _GenerateMSBuildProject(project, options, version, generator_flags, spec): - spec = project.spec - configurations = spec["configurations"] - toolset = spec["toolset"] - project_dir, project_file_name = os.path.split(project.path) - gyp.common.EnsureDirExists(project.path) - # Prepare list of sources and excluded sources. - - gyp_file = os.path.split(project.build_file)[1] - sources, excluded_sources = _PrepareListOfSources(spec, generator_flags, gyp_file) - # Add rules. - actions_to_add = {} - props_files_of_rules = set() - targets_files_of_rules = set() - rule_dependencies = set() - extension_to_rule_name = {} - list_excluded = generator_flags.get("msvs_list_excluded_files", True) - platforms = _GetUniquePlatforms(spec) - - # Don't generate rules if we are using an external builder like ninja. - if not spec.get("msvs_external_builder"): - _GenerateRulesForMSBuild( - project_dir, - options, - spec, - sources, - excluded_sources, - props_files_of_rules, - targets_files_of_rules, - actions_to_add, - rule_dependencies, - extension_to_rule_name, - ) - else: - rules = spec.get("rules", []) - _AdjustSourcesForRules(rules, sources, excluded_sources, True) - - sources, excluded_sources, excluded_idl = _AdjustSourcesAndConvertToFilterHierarchy( - spec, options, project_dir, sources, excluded_sources, list_excluded, version - ) - - # Don't add actions if we are using an external builder like ninja. - if not spec.get("msvs_external_builder"): - _AddActions(actions_to_add, spec, project.build_file) - _AddCopies(actions_to_add, spec) - - # NOTE: this stanza must appear after all actions have been decided. - # Don't excluded sources with actions attached, or they won't run. - excluded_sources = _FilterActionsFromExcluded(excluded_sources, actions_to_add) - - exclusions = _GetExcludedFilesFromBuild(spec, excluded_sources, excluded_idl) - actions_spec, sources_handled_by_action = _GenerateActionsForMSBuild( - spec, actions_to_add - ) - - _GenerateMSBuildFiltersFile( - project.path + ".filters", - sources, - rule_dependencies, - extension_to_rule_name, - platforms, - toolset, - ) - missing_sources = _VerifySourcesExist(sources, project_dir) - - for configuration in configurations.values(): - _FinalizeMSBuildSettings(spec, configuration) - - # Add attributes to root element - - import_default_section = [ - ["Import", {"Project": r"$(VCTargetsPath)\Microsoft.Cpp.Default.props"}] - ] - import_cpp_props_section = [ - ["Import", {"Project": r"$(VCTargetsPath)\Microsoft.Cpp.props"}] - ] - import_cpp_targets_section = [ - ["Import", {"Project": r"$(VCTargetsPath)\Microsoft.Cpp.targets"}] - ] - import_masm_props_section = [ - ["Import", {"Project": r"$(VCTargetsPath)\BuildCustomizations\masm.props"}] - ] - import_masm_targets_section = [ - ["Import", {"Project": r"$(VCTargetsPath)\BuildCustomizations\masm.targets"}] - ] - import_marmasm_props_section = [ - ["Import", {"Project": r"$(VCTargetsPath)\BuildCustomizations\marmasm.props"}] - ] - import_marmasm_targets_section = [ - ["Import", {"Project": r"$(VCTargetsPath)\BuildCustomizations\marmasm.targets"}] - ] - macro_section = [["PropertyGroup", {"Label": "UserMacros"}]] - - content = [ - "Project", - { - "xmlns": "http://schemas.microsoft.com/developer/msbuild/2003", - "ToolsVersion": version.ProjectVersion(), - "DefaultTargets": "Build", - }, - ] - - content += _GetMSBuildProjectConfigurations(configurations, spec) - content += _GetMSBuildGlobalProperties( - spec, version, project.guid, project_file_name - ) - content += import_default_section - content += _GetMSBuildConfigurationDetails(spec, project.build_file) - if spec.get("msvs_enable_winphone"): - content += _GetMSBuildLocalProperties("v120_wp81") - else: - content += _GetMSBuildLocalProperties(project.msbuild_toolset) - content += import_cpp_props_section - content += import_masm_props_section - if "arm64" in platforms and toolset == "target": - content += import_marmasm_props_section - content += _GetMSBuildExtensions(props_files_of_rules) - content += _GetMSBuildPropertySheets(configurations, spec) - content += macro_section - content += _GetMSBuildConfigurationGlobalProperties( - spec, configurations, project.build_file - ) - content += _GetMSBuildToolSettingsSections(spec, configurations) - content += _GetMSBuildSources( - spec, - sources, - exclusions, - rule_dependencies, - extension_to_rule_name, - actions_spec, - sources_handled_by_action, - list_excluded, - ) - content += _GetMSBuildProjectReferences(project) - content += import_cpp_targets_section - content += import_masm_targets_section - if "arm64" in platforms and toolset == "target": - content += import_marmasm_targets_section - content += _GetMSBuildExtensionTargets(targets_files_of_rules) - - if spec.get("msvs_external_builder"): - content += _GetMSBuildExternalBuilderTargets(spec) - - # TODO(jeanluc) File a bug to get rid of runas. We had in MSVS: - # has_run_as = _WriteMSVSUserFile(project.path, version, spec) - - easy_xml.WriteXmlIfChanged(content, project.path, pretty=True, win32=True) - - return missing_sources - - -def _GetMSBuildExternalBuilderTargets(spec): - """Return a list of MSBuild targets for external builders. - - The "Build" and "Clean" targets are always generated. If the spec contains - 'msvs_external_builder_clcompile_cmd', then the "ClCompile" target will also - be generated, to support building selected C/C++ files. - - Arguments: - spec: The gyp target spec. - Returns: - List of MSBuild 'Target' specs. - """ - build_cmd = _BuildCommandLineForRuleRaw( - spec, spec["msvs_external_builder_build_cmd"], False, False, False, False - ) - build_target = ["Target", {"Name": "Build"}] - build_target.append(["Exec", {"Command": build_cmd}]) - - clean_cmd = _BuildCommandLineForRuleRaw( - spec, spec["msvs_external_builder_clean_cmd"], False, False, False, False - ) - clean_target = ["Target", {"Name": "Clean"}] - clean_target.append(["Exec", {"Command": clean_cmd}]) - - targets = [build_target, clean_target] - - if spec.get("msvs_external_builder_clcompile_cmd"): - clcompile_cmd = _BuildCommandLineForRuleRaw( - spec, - spec["msvs_external_builder_clcompile_cmd"], - False, - False, - False, - False, - ) - clcompile_target = ["Target", {"Name": "ClCompile"}] - clcompile_target.append(["Exec", {"Command": clcompile_cmd}]) - targets.append(clcompile_target) - - return targets - - -def _GetMSBuildExtensions(props_files_of_rules): - extensions = ["ImportGroup", {"Label": "ExtensionSettings"}] - for props_file in props_files_of_rules: - extensions.append(["Import", {"Project": props_file}]) - return [extensions] - - -def _GetMSBuildExtensionTargets(targets_files_of_rules): - targets_node = ["ImportGroup", {"Label": "ExtensionTargets"}] - for targets_file in sorted(targets_files_of_rules): - targets_node.append(["Import", {"Project": targets_file}]) - return [targets_node] - - -def _GenerateActionsForMSBuild(spec, actions_to_add): - """Add actions accumulated into an actions_to_add, merging as needed. - - Arguments: - spec: the target project dict - actions_to_add: dictionary keyed on input name, which maps to a list of - dicts describing the actions attached to that input file. - - Returns: - A pair of (action specification, the sources handled by this action). - """ - sources_handled_by_action = OrderedSet() - actions_spec = [] - for primary_input, actions in actions_to_add.items(): - if generator_supports_multiple_toolsets: - primary_input = primary_input.replace(".exe", "_host.exe") - inputs = OrderedSet() - outputs = OrderedSet() - descriptions = [] - commands = [] - for action in actions: - - def fixup_host_exe(i): - if "$(OutDir)" in i: - i = i.replace(".exe", "_host.exe") - return i - - if generator_supports_multiple_toolsets: - action["inputs"] = [fixup_host_exe(i) for i in action["inputs"]] - inputs.update(OrderedSet(action["inputs"])) - outputs.update(OrderedSet(action["outputs"])) - descriptions.append(action["description"]) - cmd = action["command"] - if generator_supports_multiple_toolsets: - cmd = cmd.replace(".exe", "_host.exe") - # For most actions, add 'call' so that actions that invoke batch files - # return and continue executing. msbuild_use_call provides a way to - # disable this but I have not seen any adverse effect from doing that - # for everything. - if action.get("msbuild_use_call", True): - cmd = "call " + cmd - commands.append(cmd) - # Add the custom build action for one input file. - description = ", and also ".join(descriptions) - - # We can't join the commands simply with && because the command line will - # get too long. See also _AddActions: cygwin's setup_env mustn't be called - # for every invocation or the command that sets the PATH will grow too - # long. - command = "\r\n".join( - [c + "\r\nif %errorlevel% neq 0 exit /b %errorlevel%" for c in commands] - ) - _AddMSBuildAction( - spec, - primary_input, - inputs, - outputs, - command, - description, - sources_handled_by_action, - actions_spec, - ) - return actions_spec, sources_handled_by_action - - -def _AddMSBuildAction( - spec, - primary_input, - inputs, - outputs, - cmd, - description, - sources_handled_by_action, - actions_spec, -): - command = MSVSSettings.ConvertVCMacrosToMSBuild(cmd) - primary_input = _FixPath(primary_input) - inputs_array = _FixPaths(inputs) - outputs_array = _FixPaths(outputs) - additional_inputs = ";".join([i for i in inputs_array if i != primary_input]) - outputs = ";".join(outputs_array) - sources_handled_by_action.add(primary_input) - action_spec = ["CustomBuild", {"Include": primary_input}] - action_spec.extend( - # TODO(jeanluc) 'Document' for all or just if as_sources? - [ - ["FileType", "Document"], - ["Command", command], - ["Message", description], - ["Outputs", outputs], - ] - ) - if additional_inputs: - action_spec.append(["AdditionalInputs", additional_inputs]) - actions_spec.append(action_spec) diff --git a/tools/gyp/pylib/gyp/generator/msvs_test.py b/tools/gyp/pylib/gyp/generator/msvs_test.py deleted file mode 100755 index e3c4758696c..00000000000 --- a/tools/gyp/pylib/gyp/generator/msvs_test.py +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/env python3 -# Copyright (c) 2012 Google Inc. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Unit tests for the msvs.py file.""" - -import unittest -from io import StringIO - -from gyp.generator import msvs - - -class TestSequenceFunctions(unittest.TestCase): - def setUp(self): - self.stderr = StringIO() - - def test_GetLibraries(self): - self.assertEqual(msvs._GetLibraries({}), []) - self.assertEqual(msvs._GetLibraries({"libraries": []}), []) - self.assertEqual( - msvs._GetLibraries({"other": "foo", "libraries": ["a.lib"]}), ["a.lib"] - ) - self.assertEqual(msvs._GetLibraries({"libraries": ["-la"]}), ["a.lib"]) - self.assertEqual( - msvs._GetLibraries( - { - "libraries": [ - "a.lib", - "b.lib", - "c.lib", - "-lb.lib", - "-lb.lib", - "d.lib", - "a.lib", - ] - } - ), - ["c.lib", "b.lib", "d.lib", "a.lib"], - ) - - -if __name__ == "__main__": - unittest.main() diff --git a/tools/gyp/pylib/gyp/generator/ninja.py b/tools/gyp/pylib/gyp/generator/ninja.py deleted file mode 100644 index 3ceaf470cec..00000000000 --- a/tools/gyp/pylib/gyp/generator/ninja.py +++ /dev/null @@ -1,2957 +0,0 @@ -# Copyright (c) 2013 Google Inc. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - - -import collections -import copy -import ctypes -import hashlib -import json -import multiprocessing -import os.path -import re -import shutil -import signal -import subprocess -import sys -from io import StringIO - -import gyp -import gyp.common -import gyp.msvs_emulation -import gyp.xcode_emulation -from gyp import MSVSUtil, ninja_syntax -from gyp.common import GetEnvironFallback - -generator_default_variables = { - "EXECUTABLE_PREFIX": "", - "EXECUTABLE_SUFFIX": "", - "STATIC_LIB_PREFIX": "lib", - "STATIC_LIB_SUFFIX": ".a", - "SHARED_LIB_PREFIX": "lib", - # Gyp expects the following variables to be expandable by the build - # system to the appropriate locations. Ninja prefers paths to be - # known at gyp time. To resolve this, introduce special - # variables starting with $! and $| (which begin with a $ so gyp knows it - # should be treated specially, but is otherwise an invalid - # ninja/shell variable) that are passed to gyp here but expanded - # before writing out into the target .ninja files; see - # ExpandSpecial. - # $! is used for variables that represent a path and that can only appear at - # the start of a string, while $| is used for variables that can appear - # anywhere in a string. - "INTERMEDIATE_DIR": "$!INTERMEDIATE_DIR", - "SHARED_INTERMEDIATE_DIR": "$!PRODUCT_DIR/gen", - "PRODUCT_DIR": "$!PRODUCT_DIR", - "CONFIGURATION_NAME": "$|CONFIGURATION_NAME", - # Special variables that may be used by gyp 'rule' targets. - # We generate definitions for these variables on the fly when processing a - # rule. - "RULE_INPUT_ROOT": "${root}", - "RULE_INPUT_DIRNAME": "${dirname}", - "RULE_INPUT_PATH": "${source}", - "RULE_INPUT_EXT": "${ext}", - "RULE_INPUT_NAME": "${name}", -} - -# Placates pylint. -generator_additional_non_configuration_keys = [] -generator_additional_path_sections = [] -generator_extra_sources_for_rules = [] -generator_filelist_paths = None - -generator_supports_multiple_toolsets = gyp.common.CrossCompileRequested() - - -def StripPrefix(arg, prefix): - if arg.startswith(prefix): - return arg[len(prefix) :] - return arg - - -def QuoteShellArgument(arg, flavor): - """Quote a string such that it will be interpreted as a single argument - by the shell.""" - # Rather than attempting to enumerate the bad shell characters, just - # allow common OK ones and quote anything else. - if re.match(r"^[a-zA-Z0-9_=.\\/-]+$", arg): - return arg # No quoting necessary. - if flavor == "win": - return gyp.msvs_emulation.QuoteForRspFile(arg) - return "'" + arg.replace("'", "'" + '"\'"' + "'") + "'" - - -def Define(d, flavor): - """Takes a preprocessor define and returns a -D parameter that's ninja- and - shell-escaped.""" - if flavor == "win": - # cl.exe replaces literal # characters with = in preprocessor definitions for - # some reason. Octal-encode to work around that. - d = d.replace("#", "\\%03o" % ord("#")) - return QuoteShellArgument(ninja_syntax.escape("-D" + d), flavor) - - -def AddArch(output, arch): - """Adds an arch string to an output path.""" - output, extension = os.path.splitext(output) - return f"{output}.{arch}{extension}" - - -class Target: - """Target represents the paths used within a single gyp target. - - Conceptually, building a single target A is a series of steps: - - 1) actions/rules/copies generates source/resources/etc. - 2) compiles generates .o files - 3) link generates a binary (library/executable) - 4) bundle merges the above in a mac bundle - - (Any of these steps can be optional.) - - From a build ordering perspective, a dependent target B could just - depend on the last output of this series of steps. - - But some dependent commands sometimes need to reach inside the box. - For example, when linking B it needs to get the path to the static - library generated by A. - - This object stores those paths. To keep things simple, member - variables only store concrete paths to single files, while methods - compute derived values like "the last output of the target". - """ - - def __init__(self, type): - # Gyp type ("static_library", etc.) of this target. - self.type = type - # File representing whether any input dependencies necessary for - # dependent actions have completed. - self.preaction_stamp = None - # File representing whether any input dependencies necessary for - # dependent compiles have completed. - self.precompile_stamp = None - # File representing the completion of actions/rules/copies, if any. - self.actions_stamp = None - # Path to the output of the link step, if any. - self.binary = None - # Path to the file representing the completion of building the bundle, - # if any. - self.bundle = None - # On Windows, incremental linking requires linking against all the .objs - # that compose a .lib (rather than the .lib itself). That list is stored - # here. In this case, we also need to save the compile_deps for the target, - # so that the target that directly depends on the .objs can also depend - # on those. - self.component_objs = None - self.compile_deps = None - # Windows only. The import .lib is the output of a build step, but - # because dependents only link against the lib (not both the lib and the - # dll) we keep track of the import library here. - self.import_lib = None - # Track if this target contains any C++ files, to decide if gcc or g++ - # should be used for linking. - self.uses_cpp = False - - def Linkable(self): - """Return true if this is a target that can be linked against.""" - return self.type in ("static_library", "shared_library") - - def UsesToc(self, flavor): - """Return true if the target should produce a restat rule based on a TOC - file.""" - # For bundles, the .TOC should be produced for the binary, not for - # FinalOutput(). But the naive approach would put the TOC file into the - # bundle, so don't do this for bundles for now. - if flavor == "win" or self.bundle: - return False - return self.type in ("shared_library", "loadable_module") - - def PreActionInput(self, flavor): - """Return the path, if any, that should be used as a dependency of - any dependent action step.""" - if self.UsesToc(flavor): - return self.FinalOutput() + ".TOC" - return self.FinalOutput() or self.preaction_stamp - - def PreCompileInput(self): - """Return the path, if any, that should be used as a dependency of - any dependent compile step.""" - return self.actions_stamp or self.precompile_stamp - - def FinalOutput(self): - """Return the last output of the target, which depends on all prior - steps.""" - return self.bundle or self.binary or self.actions_stamp - - -# A small discourse on paths as used within the Ninja build: -# All files we produce (both at gyp and at build time) appear in the -# build directory (e.g. out/Debug). -# -# Paths within a given .gyp file are always relative to the directory -# containing the .gyp file. Call these "gyp paths". This includes -# sources as well as the starting directory a given gyp rule/action -# expects to be run from. We call the path from the source root to -# the gyp file the "base directory" within the per-.gyp-file -# NinjaWriter code. -# -# All paths as written into the .ninja files are relative to the build -# directory. Call these paths "ninja paths". -# -# We translate between these two notions of paths with two helper -# functions: -# -# - GypPathToNinja translates a gyp path (i.e. relative to the .gyp file) -# into the equivalent ninja path. -# -# - GypPathToUniqueOutput translates a gyp path into a ninja path to write -# an output file; the result can be namespaced such that it is unique -# to the input file name as well as the output target name. - - -class NinjaWriter: - def __init__( - self, - hash_for_rules, - target_outputs, - base_dir, - build_dir, - output_file, - toplevel_build, - output_file_name, - flavor, - toplevel_dir=None, - ): - """ - base_dir: path from source root to directory containing this gyp file, - by gyp semantics, all input paths are relative to this - build_dir: path from source root to build output - toplevel_dir: path to the toplevel directory - """ - - self.hash_for_rules = hash_for_rules - self.target_outputs = target_outputs - self.base_dir = base_dir - self.build_dir = build_dir - self.ninja = ninja_syntax.Writer(output_file) - self.toplevel_build = toplevel_build - self.output_file_name = output_file_name - - self.flavor = flavor - self.abs_build_dir = None - if toplevel_dir is not None: - self.abs_build_dir = os.path.abspath(os.path.join(toplevel_dir, build_dir)) - self.obj_ext = ".obj" if flavor == "win" else ".o" - if flavor == "win": - # See docstring of msvs_emulation.GenerateEnvironmentFiles(). - self.win_env = {} - for arch in ("x86", "x64", "arm64"): - self.win_env[arch] = "environment." + arch - - # Relative path from build output dir to base dir. - build_to_top = gyp.common.InvertRelativePath(build_dir, toplevel_dir) - self.build_to_base = os.path.join(build_to_top, base_dir) - # Relative path from base dir to build dir. - base_to_top = gyp.common.InvertRelativePath(base_dir, toplevel_dir) - self.base_to_build = os.path.join(base_to_top, build_dir) - - def ExpandSpecial(self, path, product_dir=None): - """Expand specials like $!PRODUCT_DIR in |path|. - - If |product_dir| is None, assumes the cwd is already the product - dir. Otherwise, |product_dir| is the relative path to the product - dir. - """ - - if (PRODUCT_DIR := "$!PRODUCT_DIR") in path: - if product_dir: - path = path.replace(PRODUCT_DIR, product_dir) - else: - path = path.replace(PRODUCT_DIR + "/", "") - path = path.replace(PRODUCT_DIR + "\\", "") - path = path.replace(PRODUCT_DIR, ".") - - if (INTERMEDIATE_DIR := "$!INTERMEDIATE_DIR") in path: - int_dir = self.GypPathToUniqueOutput("gen") - # GypPathToUniqueOutput generates a path relative to the product dir, - # so insert product_dir in front if it is provided. - path = path.replace( - INTERMEDIATE_DIR, os.path.join(product_dir or "", int_dir) - ) - - CONFIGURATION_NAME = "$|CONFIGURATION_NAME" - path = path.replace(CONFIGURATION_NAME, self.config_name) - - return path - - def ExpandRuleVariables(self, path, root, dirname, source, ext, name): - if self.flavor == "win": - path = self.msvs_settings.ConvertVSMacros(path, config=self.config_name) - path = path.replace(generator_default_variables["RULE_INPUT_ROOT"], root) - path = path.replace(generator_default_variables["RULE_INPUT_DIRNAME"], dirname) - path = path.replace(generator_default_variables["RULE_INPUT_PATH"], source) - path = path.replace(generator_default_variables["RULE_INPUT_EXT"], ext) - path = path.replace(generator_default_variables["RULE_INPUT_NAME"], name) - return path - - def GypPathToNinja(self, path, env=None): - """Translate a gyp path to a ninja path, optionally expanding environment - variable references in |path| with |env|. - - See the above discourse on path conversions.""" - if env: - if self.flavor == "mac": - path = gyp.xcode_emulation.ExpandEnvVars(path, env) - elif self.flavor == "win": - path = gyp.msvs_emulation.ExpandMacros(path, env) - if path.startswith("$!"): - expanded = self.ExpandSpecial(path) - if self.flavor == "win": - expanded = os.path.normpath(expanded) - return expanded - if "$|" in path: - path = self.ExpandSpecial(path) - assert "$" not in path, path - return os.path.normpath(os.path.join(self.build_to_base, path)) - - def GypPathToUniqueOutput(self, path, qualified=True): - """Translate a gyp path to a ninja path for writing output. - - If qualified is True, qualify the resulting filename with the name - of the target. This is necessary when e.g. compiling the same - path twice for two separate output targets. - - See the above discourse on path conversions.""" - - path = self.ExpandSpecial(path) - assert not path.startswith("$"), path - - # Translate the path following this scheme: - # Input: foo/bar.gyp, target targ, references baz/out.o - # Output: obj/foo/baz/targ.out.o (if qualified) - # obj/foo/baz/out.o (otherwise) - # (and obj.host instead of obj for cross-compiles) - # - # Why this scheme and not some other one? - # 1) for a given input, you can compute all derived outputs by matching - # its path, even if the input is brought via a gyp file with '..'. - # 2) simple files like libraries and stamps have a simple filename. - - obj = "obj" - if self.toolset != "target": - obj += "." + self.toolset - - path_dir, path_basename = os.path.split(path) - assert not os.path.isabs(path_dir), ( - "'%s' can not be absolute path (see crbug.com/462153)." % path_dir - ) - - if qualified: - path_basename = self.name + "." + path_basename - return os.path.normpath( - os.path.join(obj, self.base_dir, path_dir, path_basename) - ) - - def WriteCollapsedDependencies(self, name, targets, order_only=None): - """Given a list of targets, return a path for a single file - representing the result of building all the targets or None. - - Uses a stamp file if necessary.""" - - assert targets == [item for item in targets if item], targets - if len(targets) == 0: - assert not order_only - return None - if len(targets) > 1 or order_only: - stamp = self.GypPathToUniqueOutput(name + ".stamp") - targets = self.ninja.build(stamp, "stamp", targets, order_only=order_only) - self.ninja.newline() - return targets[0] - - def _SubninjaNameForArch(self, arch): - output_file_base = os.path.splitext(self.output_file_name)[0] - return f"{output_file_base}.{arch}.ninja" - - def WriteSpec(self, spec, config_name, generator_flags): - """The main entry point for NinjaWriter: write the build rules for a spec. - - Returns a Target object, which represents the output paths for this spec. - Returns None if there are no outputs (e.g. a settings-only 'none' type - target).""" - - self.config_name = config_name - self.name = spec["target_name"] - self.toolset = spec["toolset"] - config = spec["configurations"][config_name] - self.target = Target(spec["type"]) - self.is_standalone_static_library = bool( - spec.get("standalone_static_library", 0) - ) - - self.target_rpath = generator_flags.get("target_rpath", r"\$$ORIGIN/lib/") - - self.is_mac_bundle = gyp.xcode_emulation.IsMacBundle(self.flavor, spec) - self.xcode_settings = self.msvs_settings = None - if self.flavor == "mac": - self.xcode_settings = gyp.xcode_emulation.XcodeSettings(spec) - mac_toolchain_dir = generator_flags.get("mac_toolchain_dir", None) - if mac_toolchain_dir: - self.xcode_settings.mac_toolchain_dir = mac_toolchain_dir - - if self.flavor == "win": - self.msvs_settings = gyp.msvs_emulation.MsvsSettings(spec, generator_flags) - arch = self.msvs_settings.GetArch(config_name) - self.ninja.variable("arch", self.win_env[arch]) - self.ninja.variable("cc", "$cl_" + arch) - self.ninja.variable("cxx", "$cl_" + arch) - self.ninja.variable("cc_host", "$cl_" + arch) - self.ninja.variable("cxx_host", "$cl_" + arch) - self.ninja.variable("asm", "$ml_" + arch) - - if self.flavor == "mac": - self.archs = self.xcode_settings.GetActiveArchs(config_name) - if len(self.archs) > 1: - self.arch_subninjas = { - arch: ninja_syntax.Writer( - OpenOutput( - os.path.join( - self.toplevel_build, self._SubninjaNameForArch(arch) - ), - "w", - ) - ) - for arch in self.archs - } - - # Compute predepends for all rules. - # actions_depends is the dependencies this target depends on before running - # any of its action/rule/copy steps. - # compile_depends is the dependencies this target depends on before running - # any of its compile steps. - actions_depends = [] - compile_depends = [] - # TODO(evan): it is rather confusing which things are lists and which - # are strings. Fix these. - if "dependencies" in spec: - for dep in spec["dependencies"]: - if dep in self.target_outputs: - target = self.target_outputs[dep] - actions_depends.append(target.PreActionInput(self.flavor)) - compile_depends.append(target.PreCompileInput()) - if target.uses_cpp: - self.target.uses_cpp = True - actions_depends = [item for item in actions_depends if item] - compile_depends = [item for item in compile_depends if item] - actions_depends = self.WriteCollapsedDependencies( - "actions_depends", actions_depends - ) - compile_depends = self.WriteCollapsedDependencies( - "compile_depends", compile_depends - ) - self.target.preaction_stamp = actions_depends - self.target.precompile_stamp = compile_depends - - # Write out actions, rules, and copies. These must happen before we - # compile any sources, so compute a list of predependencies for sources - # while we do it. - extra_sources = [] - mac_bundle_depends = [] - self.target.actions_stamp = self.WriteActionsRulesCopies( - spec, extra_sources, actions_depends, mac_bundle_depends - ) - - # If we have actions/rules/copies, we depend directly on those, but - # otherwise we depend on dependent target's actions/rules/copies etc. - # We never need to explicitly depend on previous target's link steps, - # because no compile ever depends on them. - compile_depends_stamp = self.target.actions_stamp or compile_depends - - # Write out the compilation steps, if any. - link_deps = [] - try: - sources = extra_sources + spec.get("sources", []) - except TypeError: - print("extra_sources: ", str(extra_sources)) - print('spec.get("sources"): ', str(spec.get("sources"))) - raise - if sources: - if self.flavor == "mac" and len(self.archs) > 1: - # Write subninja file containing compile and link commands scoped to - # a single arch if a fat binary is being built. - for arch in self.archs: - self.ninja.subninja(self._SubninjaNameForArch(arch)) - - pch = None - if self.flavor == "win": - gyp.msvs_emulation.VerifyMissingSources( - sources, self.abs_build_dir, generator_flags, self.GypPathToNinja - ) - pch = gyp.msvs_emulation.PrecompiledHeader( - self.msvs_settings, - config_name, - self.GypPathToNinja, - self.GypPathToUniqueOutput, - self.obj_ext, - ) - else: - pch = gyp.xcode_emulation.MacPrefixHeader( - self.xcode_settings, - self.GypPathToNinja, - lambda path, lang: self.GypPathToUniqueOutput(path + "-" + lang), - ) - link_deps = self.WriteSources( - self.ninja, - config_name, - config, - sources, - compile_depends_stamp, - pch, - spec, - ) - # Some actions/rules output 'sources' that are already object files. - obj_outputs = [f for f in sources if f.endswith(self.obj_ext)] - if obj_outputs: - if self.flavor != "mac" or len(self.archs) == 1: - link_deps += [self.GypPathToNinja(o) for o in obj_outputs] - else: - print( - "Warning: Actions/rules writing object files don't work with " - "multiarch targets, dropping. (target %s)" % spec["target_name"] - ) - elif self.flavor == "mac" and len(self.archs) > 1: - link_deps = collections.defaultdict(list) - - compile_deps = self.target.actions_stamp or actions_depends - if self.flavor == "win" and self.target.type == "static_library": - self.target.component_objs = link_deps - self.target.compile_deps = compile_deps - - # Write out a link step, if needed. - output = None - is_empty_bundle = not link_deps and not mac_bundle_depends - if link_deps or self.target.actions_stamp or actions_depends: - output = self.WriteTarget( - spec, config_name, config, link_deps, compile_deps - ) - if self.is_mac_bundle: - mac_bundle_depends.append(output) - - # Bundle all of the above together, if needed. - if self.is_mac_bundle: - output = self.WriteMacBundle(spec, mac_bundle_depends, is_empty_bundle) - - if not output: - return None - - assert self.target.FinalOutput(), output - return self.target - - def _WinIdlRule(self, source, prebuild, outputs): - """Handle the implicit VS .idl rule for one source file. Fills |outputs| - with files that are generated.""" - outdir, output, vars, flags = self.msvs_settings.GetIdlBuildData( - source, self.config_name - ) - outdir = self.GypPathToNinja(outdir) - - def fix_path(path, rel=None): - path = os.path.join(outdir, path) - dirname, basename = os.path.split(source) - root, ext = os.path.splitext(basename) - path = self.ExpandRuleVariables(path, root, dirname, source, ext, basename) - if rel: - path = os.path.relpath(path, rel) - return path - - vars = [(name, fix_path(value, outdir)) for name, value in vars] - output = [fix_path(p) for p in output] - vars.append(("outdir", outdir)) - vars.append(("idlflags", flags)) - input = self.GypPathToNinja(source) - self.ninja.build(output, "idl", input, variables=vars, order_only=prebuild) - outputs.extend(output) - - def WriteWinIdlFiles(self, spec, prebuild): - """Writes rules to match MSVS's implicit idl handling.""" - assert self.flavor == "win" - if self.msvs_settings.HasExplicitIdlRulesOrActions(spec): - return [] - outputs = [] - for source in filter(lambda x: x.endswith(".idl"), spec["sources"]): - self._WinIdlRule(source, prebuild, outputs) - return outputs - - def WriteActionsRulesCopies( - self, spec, extra_sources, prebuild, mac_bundle_depends - ): - """Write out the Actions, Rules, and Copies steps. Return a path - representing the outputs of these steps.""" - outputs = [] - if self.is_mac_bundle: - mac_bundle_resources = spec.get("mac_bundle_resources", [])[:] - else: - mac_bundle_resources = [] - extra_mac_bundle_resources = [] - - if "actions" in spec: - outputs += self.WriteActions( - spec["actions"], extra_sources, prebuild, extra_mac_bundle_resources - ) - if "rules" in spec: - outputs += self.WriteRules( - spec["rules"], - extra_sources, - prebuild, - mac_bundle_resources, - extra_mac_bundle_resources, - ) - if "copies" in spec: - outputs += self.WriteCopies(spec["copies"], prebuild, mac_bundle_depends) - - if "sources" in spec and self.flavor == "win": - outputs += self.WriteWinIdlFiles(spec, prebuild) - - if self.xcode_settings and self.xcode_settings.IsIosFramework(): - self.WriteiOSFrameworkHeaders(spec, outputs, prebuild) - - stamp = self.WriteCollapsedDependencies("actions_rules_copies", outputs) - - if self.is_mac_bundle: - xcassets = self.WriteMacBundleResources( - extra_mac_bundle_resources + mac_bundle_resources, mac_bundle_depends - ) - partial_info_plist = self.WriteMacXCassets(xcassets, mac_bundle_depends) - self.WriteMacInfoPlist(partial_info_plist, mac_bundle_depends) - - return stamp - - def GenerateDescription(self, verb, message, fallback): - """Generate and return a description of a build step. - - |verb| is the short summary, e.g. ACTION or RULE. - |message| is a hand-written description, or None if not available. - |fallback| is the gyp-level name of the step, usable as a fallback. - """ - if self.toolset != "target": - verb += "(%s)" % self.toolset - if message: - return f"{verb} {self.ExpandSpecial(message)}" - else: - return f"{verb} {self.name}: {fallback}" - - def WriteActions( - self, actions, extra_sources, prebuild, extra_mac_bundle_resources - ): - # Actions cd into the base directory. - env = self.GetToolchainEnv() - all_outputs = [] - for action in actions: - # First write out a rule for the action. - name = "{}_{}".format(action["action_name"], self.hash_for_rules) - description = self.GenerateDescription( - "ACTION", action.get("message", None), name - ) - win_shell_flags = ( - self.msvs_settings.GetRuleShellFlags(action) - if self.flavor == "win" - else None - ) - args = action["action"] - depfile = action.get("depfile", None) - if depfile: - depfile = self.ExpandSpecial(depfile, self.base_to_build) - pool = "console" if int(action.get("ninja_use_console", 0)) else None - rule_name, _ = self.WriteNewNinjaRule( - name, args, description, win_shell_flags, env, pool, depfile=depfile - ) - - inputs = [self.GypPathToNinja(i, env) for i in action["inputs"]] - if int(action.get("process_outputs_as_sources", False)): - extra_sources += action["outputs"] - if int(action.get("process_outputs_as_mac_bundle_resources", False)): - extra_mac_bundle_resources += action["outputs"] - outputs = [self.GypPathToNinja(o, env) for o in action["outputs"]] - - # Then write out an edge using the rule. - self.ninja.build(outputs, rule_name, inputs, order_only=prebuild) - all_outputs += outputs - - self.ninja.newline() - - return all_outputs - - def WriteRules( - self, - rules, - extra_sources, - prebuild, - mac_bundle_resources, - extra_mac_bundle_resources, - ): - env = self.GetToolchainEnv() - all_outputs = [] - for rule in rules: - # Skip a rule with no action and no inputs. - if "action" not in rule and not rule.get("rule_sources", []): - continue - - # First write out a rule for the rule action. - name = "{}_{}".format(rule["rule_name"], self.hash_for_rules) - - args = rule["action"] - description = self.GenerateDescription( - "RULE", - rule.get("message", None), - ("%s " + generator_default_variables["RULE_INPUT_PATH"]) % name, - ) - win_shell_flags = ( - self.msvs_settings.GetRuleShellFlags(rule) - if self.flavor == "win" - else None - ) - pool = "console" if int(rule.get("ninja_use_console", 0)) else None - rule_name, args = self.WriteNewNinjaRule( - name, args, description, win_shell_flags, env, pool - ) - - # TODO: if the command references the outputs directly, we should - # simplify it to just use $out. - - # Rules can potentially make use of some special variables which - # must vary per source file. - # Compute the list of variables we'll need to provide. - special_locals = ("source", "root", "dirname", "ext", "name") - needed_variables = {"source"} - for argument in args: - for var in special_locals: - if "${%s}" % var in argument: - needed_variables.add(var) - needed_variables = sorted(needed_variables) - - def cygwin_munge(path): - # pylint: disable=cell-var-from-loop - if win_shell_flags and win_shell_flags.cygwin: - return path.replace("\\", "/") - return path - - inputs = [self.GypPathToNinja(i, env) for i in rule.get("inputs", [])] - - # If there are n source files matching the rule, and m additional rule - # inputs, then adding 'inputs' to each build edge written below will - # write m * n inputs. Collapsing reduces this to m + n. - sources = rule.get("rule_sources", []) - num_inputs = len(inputs) - if prebuild: - num_inputs += 1 - if num_inputs > 2 and len(sources) > 2: - inputs = [ - self.WriteCollapsedDependencies( - rule["rule_name"], inputs, order_only=prebuild - ) - ] - prebuild = [] - - # For each source file, write an edge that generates all the outputs. - for source in sources: - source = os.path.normpath(source) - dirname, basename = os.path.split(source) - root, ext = os.path.splitext(basename) - - # Gather the list of inputs and outputs, expanding $vars if possible. - outputs = [ - self.ExpandRuleVariables(o, root, dirname, source, ext, basename) - for o in rule["outputs"] - ] - - if int(rule.get("process_outputs_as_sources", False)): - extra_sources += outputs - - was_mac_bundle_resource = source in mac_bundle_resources - if was_mac_bundle_resource or int( - rule.get("process_outputs_as_mac_bundle_resources", False) - ): - extra_mac_bundle_resources += outputs - # Note: This is n_resources * n_outputs_in_rule. - # Put to-be-removed items in a set and - # remove them all in a single pass - # if this becomes a performance issue. - if was_mac_bundle_resource: - mac_bundle_resources.remove(source) - - extra_bindings = [] - for var in needed_variables: - if var == "root": - extra_bindings.append(("root", cygwin_munge(root))) - elif var == "dirname": - # '$dirname' is a parameter to the rule action, which means - # it shouldn't be converted to a Ninja path. But we don't - # want $!PRODUCT_DIR in there either. - dirname_expanded = self.ExpandSpecial( - dirname, self.base_to_build - ) - extra_bindings.append( - ("dirname", cygwin_munge(dirname_expanded)) - ) - elif var == "source": - # '$source' is a parameter to the rule action, which means - # it shouldn't be converted to a Ninja path. But we don't - # want $!PRODUCT_DIR in there either. - source_expanded = self.ExpandSpecial(source, self.base_to_build) - extra_bindings.append(("source", cygwin_munge(source_expanded))) - elif var == "ext": - extra_bindings.append(("ext", ext)) - elif var == "name": - extra_bindings.append(("name", cygwin_munge(basename))) - else: - assert var is None, repr(var) - - outputs = [self.GypPathToNinja(o, env) for o in outputs] - if self.flavor == "win": - # WriteNewNinjaRule uses unique_name to create a rsp file on win. - unique_name = hashlib.sha256(outputs[0].encode("utf-8")).hexdigest() - extra_bindings.append(("unique_name", unique_name)) - - self.ninja.build( - outputs, - rule_name, - self.GypPathToNinja(source), - implicit=inputs, - order_only=prebuild, - variables=extra_bindings, - ) - - all_outputs.extend(outputs) - - return all_outputs - - def WriteCopies(self, copies, prebuild, mac_bundle_depends): - outputs = [] - if self.xcode_settings: - extra_env = self.xcode_settings.GetPerTargetSettings() - env = self.GetToolchainEnv(additional_settings=extra_env) - else: - env = self.GetToolchainEnv() - for to_copy in copies: - for path in to_copy["files"]: - # Normalize the path so trailing slashes don't confuse us. - path = os.path.normpath(path) - basename = os.path.split(path)[1] - src = self.GypPathToNinja(path, env) - dst = self.GypPathToNinja( - os.path.join(to_copy["destination"], basename), env - ) - outputs += self.ninja.build(dst, "copy", src, order_only=prebuild) - if self.is_mac_bundle: - # gyp has mac_bundle_resources to copy things into a bundle's - # Resources folder, but there's no built-in way to copy files - # to other places in the bundle. - # Hence, some targets use copies for this. - # Check if this file is copied into the current bundle, - # and if so add it to the bundle depends so - # that dependent targets get rebuilt if the copy input changes. - if dst.startswith( - self.xcode_settings.GetBundleContentsFolderPath() - ): - mac_bundle_depends.append(dst) - - return outputs - - def WriteiOSFrameworkHeaders(self, spec, outputs, prebuild): - """Prebuild steps to generate hmap files and copy headers to destination.""" - framework = self.ComputeMacBundleOutput() - all_sources = spec["sources"] - copy_headers = spec["mac_framework_headers"] - output = self.GypPathToUniqueOutput("headers.hmap") - self.xcode_settings.header_map_path = output - all_headers = map( - self.GypPathToNinja, filter(lambda x: x.endswith(".h"), all_sources) - ) - variables = [ - ("framework", framework), - ("copy_headers", map(self.GypPathToNinja, copy_headers)), - ] - outputs.extend( - self.ninja.build( - output, - "compile_ios_framework_headers", - all_headers, - variables=variables, - order_only=prebuild, - ) - ) - - def WriteMacBundleResources(self, resources, bundle_depends): - """Writes ninja edges for 'mac_bundle_resources'.""" - xcassets = [] - - extra_env = self.xcode_settings.GetPerTargetSettings() - env = self.GetSortedXcodeEnv(additional_settings=extra_env) - env = self.ComputeExportEnvString(env) - isBinary = self.xcode_settings.IsBinaryOutputFormat(self.config_name) - - for output, res in gyp.xcode_emulation.GetMacBundleResources( - generator_default_variables["PRODUCT_DIR"], - self.xcode_settings, - map(self.GypPathToNinja, resources), - ): - output = self.ExpandSpecial(output) - if os.path.splitext(output)[-1] != ".xcassets": - self.ninja.build( - output, - "mac_tool", - res, - variables=[ - ("mactool_cmd", "copy-bundle-resource"), - ("env", env), - ("binary", isBinary), - ], - ) - bundle_depends.append(output) - else: - xcassets.append(res) - return xcassets - - def WriteMacXCassets(self, xcassets, bundle_depends): - """Writes ninja edges for 'mac_bundle_resources' .xcassets files. - - This add an invocation of 'actool' via the 'mac_tool.py' helper script. - It assumes that the assets catalogs define at least one imageset and - thus an Assets.car file will be generated in the application resources - directory. If this is not the case, then the build will probably be done - at each invocation of ninja.""" - if not xcassets: - return - - extra_arguments = {} - settings_to_arg = { - "XCASSETS_APP_ICON": "app-icon", - "XCASSETS_LAUNCH_IMAGE": "launch-image", - } - settings = self.xcode_settings.xcode_settings[self.config_name] - for settings_key, arg_name in settings_to_arg.items(): - value = settings.get(settings_key) - if value: - extra_arguments[arg_name] = value - - partial_info_plist = None - if extra_arguments: - partial_info_plist = self.GypPathToUniqueOutput( - "assetcatalog_generated_info.plist" - ) - extra_arguments["output-partial-info-plist"] = partial_info_plist - - outputs = [] - outputs.append( - os.path.join(self.xcode_settings.GetBundleResourceFolder(), "Assets.car") - ) - if partial_info_plist: - outputs.append(partial_info_plist) - - keys = QuoteShellArgument(json.dumps(extra_arguments), self.flavor) - extra_env = self.xcode_settings.GetPerTargetSettings() - env = self.GetSortedXcodeEnv(additional_settings=extra_env) - env = self.ComputeExportEnvString(env) - - bundle_depends.extend( - self.ninja.build( - outputs, - "compile_xcassets", - xcassets, - variables=[("env", env), ("keys", keys)], - ) - ) - return partial_info_plist - - def WriteMacInfoPlist(self, partial_info_plist, bundle_depends): - """Write build rules for bundle Info.plist files.""" - info_plist, out, defines, extra_env = gyp.xcode_emulation.GetMacInfoPlist( - generator_default_variables["PRODUCT_DIR"], - self.xcode_settings, - self.GypPathToNinja, - ) - if not info_plist: - return - out = self.ExpandSpecial(out) - if defines: - # Create an intermediate file to store preprocessed results. - intermediate_plist = self.GypPathToUniqueOutput( - os.path.basename(info_plist) - ) - defines = " ".join([Define(d, self.flavor) for d in defines]) - info_plist = self.ninja.build( - intermediate_plist, - "preprocess_infoplist", - info_plist, - variables=[("defines", defines)], - ) - - env = self.GetSortedXcodeEnv(additional_settings=extra_env) - env = self.ComputeExportEnvString(env) - - if partial_info_plist: - intermediate_plist = self.GypPathToUniqueOutput("merged_info.plist") - info_plist = self.ninja.build( - intermediate_plist, "merge_infoplist", [partial_info_plist, info_plist] - ) - - keys = self.xcode_settings.GetExtraPlistItems(self.config_name) - keys = QuoteShellArgument(json.dumps(keys), self.flavor) - isBinary = self.xcode_settings.IsBinaryOutputFormat(self.config_name) - self.ninja.build( - out, - "copy_infoplist", - info_plist, - variables=[("env", env), ("keys", keys), ("binary", isBinary)], - ) - bundle_depends.append(out) - - def WriteSources( - self, - ninja_file, - config_name, - config, - sources, - predepends, - precompiled_header, - spec, - ): - """Write build rules to compile all of |sources|.""" - if self.toolset == "host": - self.ninja.variable("ar", "$ar_host") - self.ninja.variable("cc", "$cc_host") - self.ninja.variable("cxx", "$cxx_host") - self.ninja.variable("ld", "$ld_host") - self.ninja.variable("ldxx", "$ldxx_host") - self.ninja.variable("nm", "$nm_host") - self.ninja.variable("readelf", "$readelf_host") - - if self.flavor != "mac" or len(self.archs) == 1: - return self.WriteSourcesForArch( - self.ninja, - config_name, - config, - sources, - predepends, - precompiled_header, - spec, - ) - else: - return { - arch: self.WriteSourcesForArch( - self.arch_subninjas[arch], - config_name, - config, - sources, - predepends, - precompiled_header, - spec, - arch=arch, - ) - for arch in self.archs - } - - def WriteSourcesForArch( - self, - ninja_file, - config_name, - config, - sources, - predepends, - precompiled_header, - spec, - arch=None, - ): - """Write build rules to compile all of |sources|.""" - - extra_defines = [] - if self.flavor == "mac": - cflags = self.xcode_settings.GetCflags(config_name, arch=arch) - cflags_c = self.xcode_settings.GetCflagsC(config_name) - cflags_cc = self.xcode_settings.GetCflagsCC(config_name) - cflags_objc = ["$cflags_c"] + self.xcode_settings.GetCflagsObjC(config_name) - cflags_objcc = ["$cflags_cc"] + self.xcode_settings.GetCflagsObjCC( - config_name - ) - elif self.flavor == "win": - asmflags = self.msvs_settings.GetAsmflags(config_name) - cflags = self.msvs_settings.GetCflags(config_name) - cflags_c = self.msvs_settings.GetCflagsC(config_name) - cflags_cc = self.msvs_settings.GetCflagsCC(config_name) - extra_defines = self.msvs_settings.GetComputedDefines(config_name) - # See comment at cc_command for why there's two .pdb files. - pdbpath_c = pdbpath_cc = self.msvs_settings.GetCompilerPdbName( - config_name, self.ExpandSpecial - ) - if not pdbpath_c: - obj = "obj" - if self.toolset != "target": - obj += "." + self.toolset - pdbpath = os.path.normpath(os.path.join(obj, self.base_dir, self.name)) - pdbpath_c = pdbpath + ".c.pdb" - pdbpath_cc = pdbpath + ".cc.pdb" - self.WriteVariableList(ninja_file, "pdbname_c", [pdbpath_c]) - self.WriteVariableList(ninja_file, "pdbname_cc", [pdbpath_cc]) - self.WriteVariableList(ninja_file, "pchprefix", [self.name]) - else: - cflags = config.get("cflags", []) - cflags_c = config.get("cflags_c", []) - cflags_cc = config.get("cflags_cc", []) - - # Respect environment variables related to build, but target-specific - # flags can still override them. - if self.toolset == "target": - cflags_c = ( - os.environ.get("CPPFLAGS", "").split() - + os.environ.get("CFLAGS", "").split() - + cflags_c - ) - cflags_cc = ( - os.environ.get("CPPFLAGS", "").split() - + os.environ.get("CXXFLAGS", "").split() - + cflags_cc - ) - elif self.toolset == "host": - cflags_c = ( - os.environ.get("CPPFLAGS_host", "").split() - + os.environ.get("CFLAGS_host", "").split() - + cflags_c - ) - cflags_cc = ( - os.environ.get("CPPFLAGS_host", "").split() - + os.environ.get("CXXFLAGS_host", "").split() - + cflags_cc - ) - - defines = config.get("defines", []) + extra_defines - self.WriteVariableList( - ninja_file, "defines", [Define(d, self.flavor) for d in defines] - ) - if self.flavor == "win": - self.WriteVariableList( - ninja_file, "asmflags", map(self.ExpandSpecial, asmflags) - ) - self.WriteVariableList( - ninja_file, - "rcflags", - [ - QuoteShellArgument(self.ExpandSpecial(f), self.flavor) - for f in self.msvs_settings.GetRcflags( - config_name, self.GypPathToNinja - ) - ], - ) - - include_dirs = config.get("include_dirs", []) - - env = self.GetToolchainEnv() - if self.flavor == "win": - include_dirs = self.msvs_settings.AdjustIncludeDirs( - include_dirs, config_name - ) - self.WriteVariableList( - ninja_file, - "includes", - [ - QuoteShellArgument("-I" + self.GypPathToNinja(i, env), self.flavor) - for i in include_dirs - ], - ) - - if self.flavor == "win": - midl_include_dirs = config.get("midl_include_dirs", []) - midl_include_dirs = self.msvs_settings.AdjustMidlIncludeDirs( - midl_include_dirs, config_name - ) - self.WriteVariableList( - ninja_file, - "midl_includes", - [ - QuoteShellArgument("-I" + self.GypPathToNinja(i, env), self.flavor) - for i in midl_include_dirs - ], - ) - - pch_commands = precompiled_header.GetPchBuildCommands(arch) - if self.flavor == "mac": - # Most targets use no precompiled headers, so only write these if needed. - for ext, var in [ - ("c", "cflags_pch_c"), - ("cc", "cflags_pch_cc"), - ("m", "cflags_pch_objc"), - ("mm", "cflags_pch_objcc"), - ]: - include = precompiled_header.GetInclude(ext, arch) - if include: - ninja_file.variable(var, include) - - arflags = config.get("arflags", []) - - self.WriteVariableList(ninja_file, "cflags", map(self.ExpandSpecial, cflags)) - self.WriteVariableList( - ninja_file, "cflags_c", map(self.ExpandSpecial, cflags_c) - ) - self.WriteVariableList( - ninja_file, "cflags_cc", map(self.ExpandSpecial, cflags_cc) - ) - if self.flavor == "mac": - self.WriteVariableList( - ninja_file, "cflags_objc", map(self.ExpandSpecial, cflags_objc) - ) - self.WriteVariableList( - ninja_file, "cflags_objcc", map(self.ExpandSpecial, cflags_objcc) - ) - self.WriteVariableList(ninja_file, "arflags", map(self.ExpandSpecial, arflags)) - ninja_file.newline() - outputs = [] - has_rc_source = False - for source in sources: - filename, ext = os.path.splitext(source) - ext = ext[1:] - obj_ext = self.obj_ext - if ext in ("cc", "cpp", "cxx"): - command = "cxx" - self.target.uses_cpp = True - elif ext == "c" or (ext == "S" and self.flavor != "win"): - command = "cc" - elif ext == "s" and self.flavor != "win": # Doesn't generate .o.d files. - command = "cc_s" - elif ( - self.flavor == "win" - and ext in ("asm", "S") - and not self.msvs_settings.HasExplicitAsmRules(spec) - ): - command = "asm" - # Add the _asm suffix as msvs is capable of handling .cc and - # .asm files of the same name without collision. - obj_ext = "_asm.obj" - elif self.flavor == "mac" and ext == "m": - command = "objc" - elif self.flavor == "mac" and ext == "mm": - command = "objcxx" - self.target.uses_cpp = True - elif self.flavor == "win" and ext == "rc": - command = "rc" - obj_ext = ".res" - has_rc_source = True - else: - # Ignore unhandled extensions. - continue - input = self.GypPathToNinja(source) - output = self.GypPathToUniqueOutput(filename + obj_ext) - if arch is not None: - output = AddArch(output, arch) - implicit = precompiled_header.GetObjDependencies([input], [output], arch) - variables = [] - if self.flavor == "win": - variables, output, implicit = precompiled_header.GetFlagsModifications( - input, - output, - implicit, - command, - cflags_c, - cflags_cc, - self.ExpandSpecial, - ) - ninja_file.build( - output, - command, - input, - implicit=[gch for _, _, gch in implicit], - order_only=predepends, - variables=variables, - ) - outputs.append(output) - - if has_rc_source: - resource_include_dirs = config.get("resource_include_dirs", include_dirs) - self.WriteVariableList( - ninja_file, - "resource_includes", - [ - QuoteShellArgument("-I" + self.GypPathToNinja(i, env), self.flavor) - for i in resource_include_dirs - ], - ) - - self.WritePchTargets(ninja_file, pch_commands) - - ninja_file.newline() - return outputs - - def WritePchTargets(self, ninja_file, pch_commands): - """Writes ninja rules to compile prefix headers.""" - if not pch_commands: - return - - for gch, lang_flag, lang, input in pch_commands: - var_name = { - "c": "cflags_pch_c", - "cc": "cflags_pch_cc", - "m": "cflags_pch_objc", - "mm": "cflags_pch_objcc", - }[lang] - - map = { - "c": "cc", - "cc": "cxx", - "m": "objc", - "mm": "objcxx", - } - cmd = map.get(lang) - ninja_file.build(gch, cmd, input, variables=[(var_name, lang_flag)]) - - def WriteLink(self, spec, config_name, config, link_deps, compile_deps): - """Write out a link step. Fills out target.binary.""" - if self.flavor != "mac" or len(self.archs) == 1: - return self.WriteLinkForArch( - self.ninja, spec, config_name, config, link_deps, compile_deps - ) - else: - output = self.ComputeOutput(spec) - inputs = [ - self.WriteLinkForArch( - self.arch_subninjas[arch], - spec, - config_name, - config, - link_deps[arch], - compile_deps, - arch=arch, - ) - for arch in self.archs - ] - extra_bindings = [] - build_output = output - if not self.is_mac_bundle: - self.AppendPostbuildVariable(extra_bindings, spec, output, output) - - # TODO(yyanagisawa): more work needed to fix: - # https://code.google.com/p/gyp/issues/detail?id=411 - if ( - spec["type"] in ("shared_library", "loadable_module") - and not self.is_mac_bundle - ): - extra_bindings.append(("lib", output)) - self.ninja.build( - [output, output + ".TOC"], - "solipo", - inputs, - variables=extra_bindings, - ) - else: - self.ninja.build(build_output, "lipo", inputs, variables=extra_bindings) - return output - - def WriteLinkForArch( - self, ninja_file, spec, config_name, config, link_deps, compile_deps, arch=None - ): - """Write out a link step. Fills out target.binary.""" - command = { - "executable": "link", - "loadable_module": "solink_module", - "shared_library": "solink", - }[spec["type"]] - command_suffix = "" - - implicit_deps = set() - solibs = set() - order_deps = set() - - if compile_deps: - # Normally, the compiles of the target already depend on compile_deps, - # but a shared_library target might have no sources and only link together - # a few static_library deps, so the link step also needs to depend - # on compile_deps to make sure actions in the shared_library target - # get run before the link. - order_deps.add(compile_deps) - - if "dependencies" in spec: - # Two kinds of dependencies: - # - Linkable dependencies (like a .a or a .so): add them to the link line. - # - Non-linkable dependencies (like a rule that generates a file - # and writes a stamp file): add them to implicit_deps - extra_link_deps = set() - for dep in spec["dependencies"]: - target = self.target_outputs.get(dep) - if not target: - continue - linkable = target.Linkable() - if linkable: - new_deps = [] - if ( - self.flavor == "win" - and target.component_objs - and self.msvs_settings.IsUseLibraryDependencyInputs(config_name) - ): - new_deps = target.component_objs - if target.compile_deps: - order_deps.add(target.compile_deps) - elif self.flavor == "win" and target.import_lib: - new_deps = [target.import_lib] - elif target.UsesToc(self.flavor): - solibs.add(target.binary) - implicit_deps.add(target.binary + ".TOC") - else: - new_deps = [target.binary] - for new_dep in new_deps: - if new_dep not in extra_link_deps: - extra_link_deps.add(new_dep) - link_deps.append(new_dep) - - final_output = target.FinalOutput() - if not linkable or final_output != target.binary: - implicit_deps.add(final_output) - - extra_bindings = [] - if self.target.uses_cpp and self.flavor != "win": - extra_bindings.append(("ld", "$ldxx")) - - output = self.ComputeOutput(spec, arch) - if arch is None and not self.is_mac_bundle: - self.AppendPostbuildVariable(extra_bindings, spec, output, output) - - is_executable = spec["type"] == "executable" - # The ldflags config key is not used on mac or win. On those platforms - # linker flags are set via xcode_settings and msvs_settings, respectively. - if self.toolset == "target": - env_ldflags = os.environ.get("LDFLAGS", "").split() - elif self.toolset == "host": - env_ldflags = os.environ.get("LDFLAGS_host", "").split() - - if self.flavor == "mac": - ldflags = self.xcode_settings.GetLdflags( - config_name, - self.ExpandSpecial(generator_default_variables["PRODUCT_DIR"]), - self.GypPathToNinja, - arch, - ) - ldflags = env_ldflags + ldflags - elif self.flavor == "win": - manifest_base_name = self.GypPathToUniqueOutput( - self.ComputeOutputFileName(spec) - ) - ( - ldflags, - intermediate_manifest, - manifest_files, - ) = self.msvs_settings.GetLdflags( - config_name, - self.GypPathToNinja, - self.ExpandSpecial, - manifest_base_name, - output, - is_executable, - self.toplevel_build, - ) - ldflags = env_ldflags + ldflags - self.WriteVariableList(ninja_file, "manifests", manifest_files) - implicit_deps = implicit_deps.union(manifest_files) - if intermediate_manifest: - self.WriteVariableList( - ninja_file, "intermediatemanifest", [intermediate_manifest] - ) - command_suffix = _GetWinLinkRuleNameSuffix( - self.msvs_settings.IsEmbedManifest(config_name) - ) - def_file = self.msvs_settings.GetDefFile(self.GypPathToNinja) - if def_file: - implicit_deps.add(def_file) - else: - # Respect environment variables related to build, but target-specific - # flags can still override them. - ldflags = env_ldflags + config.get("ldflags", []) - if is_executable and solibs: - rpath = "lib/" - if self.toolset != "target": - rpath += self.toolset - ldflags.append(r"-Wl,-rpath=\$$ORIGIN/%s" % rpath) - else: - ldflags.append("-Wl,-rpath=%s" % self.target_rpath) - ldflags.append("-Wl,-rpath-link=%s" % rpath) - self.WriteVariableList(ninja_file, "ldflags", map(self.ExpandSpecial, ldflags)) - - library_dirs = config.get("library_dirs", []) - if self.flavor == "win": - library_dirs = [ - self.msvs_settings.ConvertVSMacros(library_dir, config_name) - for library_dir in library_dirs - ] - library_dirs = [ - "/LIBPATH:" - + QuoteShellArgument(self.GypPathToNinja(library_dir), self.flavor) - for library_dir in library_dirs - ] - else: - library_dirs = [ - QuoteShellArgument("-L" + self.GypPathToNinja(library_dir), self.flavor) - for library_dir in library_dirs - ] - - libraries = gyp.common.uniquer( - map(self.ExpandSpecial, spec.get("libraries", [])) - ) - if self.flavor == "mac": - libraries = self.xcode_settings.AdjustLibraries(libraries, config_name) - elif self.flavor == "win": - libraries = self.msvs_settings.AdjustLibraries(libraries) - - self.WriteVariableList(ninja_file, "libs", library_dirs + libraries) - - linked_binary = output - - if command in ("solink", "solink_module"): - extra_bindings.append(("soname", os.path.split(output)[1])) - extra_bindings.append(("lib", gyp.common.EncodePOSIXShellArgument(output))) - if self.flavor != "win": - link_file_list = output - if self.is_mac_bundle: - # 'Dependency Framework.framework/Versions/A/Dependency Framework' - # -> 'Dependency Framework.framework.rsp' - link_file_list = self.xcode_settings.GetWrapperName() - if arch: - link_file_list += "." + arch - link_file_list += ".rsp" - # If an rspfile contains spaces, ninja surrounds the filename with - # quotes around it and then passes it to open(), creating a file with - # quotes in its name (and when looking for the rsp file, the name - # makes it through bash which strips the quotes) :-/ - link_file_list = link_file_list.replace(" ", "_") - extra_bindings.append( - ( - "link_file_list", - gyp.common.EncodePOSIXShellArgument(link_file_list), - ) - ) - if self.flavor == "win": - extra_bindings.append(("binary", output)) - if ( - "/NOENTRY" not in ldflags - and not self.msvs_settings.GetNoImportLibrary(config_name) - ): - self.target.import_lib = output + ".lib" - extra_bindings.append( - ("implibflag", "/IMPLIB:%s" % self.target.import_lib) - ) - pdbname = self.msvs_settings.GetPDBName( - config_name, self.ExpandSpecial, output + ".pdb" - ) - output = [output, self.target.import_lib] - if pdbname: - output.append(pdbname) - elif not self.is_mac_bundle: - output = [output, output + ".TOC"] - else: - command = command + "_notoc" - elif self.flavor == "win": - extra_bindings.append(("binary", output)) - pdbname = self.msvs_settings.GetPDBName( - config_name, self.ExpandSpecial, output + ".pdb" - ) - if pdbname: - output = [output, pdbname] - - if solibs: - extra_bindings.append( - ("solibs", gyp.common.EncodePOSIXShellList(sorted(solibs))) - ) - - ninja_file.build( - output, - command + command_suffix, - link_deps, - implicit=sorted(implicit_deps), - order_only=list(order_deps), - variables=extra_bindings, - ) - return linked_binary - - def WriteTarget(self, spec, config_name, config, link_deps, compile_deps): - extra_link_deps = any( - self.target_outputs.get(dep).Linkable() - for dep in spec.get("dependencies", []) - if dep in self.target_outputs - ) - if spec["type"] == "none" or (not link_deps and not extra_link_deps): - # TODO(evan): don't call this function for 'none' target types, as - # it doesn't do anything, and we fake out a 'binary' with a stamp file. - self.target.binary = compile_deps - self.target.type = "none" - elif spec["type"] == "static_library": - self.target.binary = self.ComputeOutput(spec) - if ( - self.flavor not in ("ios", "mac", "netbsd", "openbsd", "win") - and not self.is_standalone_static_library - ): - self.ninja.build( - self.target.binary, "alink_thin", link_deps, order_only=compile_deps - ) - else: - variables = [] - if self.xcode_settings: - libtool_flags = self.xcode_settings.GetLibtoolflags(config_name) - if libtool_flags: - variables.append(("libtool_flags", libtool_flags)) - if self.msvs_settings: - libflags = self.msvs_settings.GetLibFlags( - config_name, self.GypPathToNinja - ) - variables.append(("libflags", libflags)) - - if self.flavor != "mac" or len(self.archs) == 1: - self.AppendPostbuildVariable( - variables, spec, self.target.binary, self.target.binary - ) - self.ninja.build( - self.target.binary, - "alink", - link_deps, - order_only=compile_deps, - variables=variables, - ) - else: - inputs = [] - for arch in self.archs: - output = self.ComputeOutput(spec, arch) - self.arch_subninjas[arch].build( - output, - "alink", - link_deps[arch], - order_only=compile_deps, - variables=variables, - ) - inputs.append(output) - # TODO: It's not clear if - # libtool_flags should be passed to the alink - # call that combines single-arch .a files into a fat .a file. - self.AppendPostbuildVariable( - variables, spec, self.target.binary, self.target.binary - ) - self.ninja.build( - self.target.binary, - "alink", - inputs, - # FIXME: test proving order_only=compile_deps isn't - # needed. - variables=variables, - ) - else: - self.target.binary = self.WriteLink( - spec, config_name, config, link_deps, compile_deps - ) - return self.target.binary - - def WriteMacBundle(self, spec, mac_bundle_depends, is_empty): - assert self.is_mac_bundle - package_framework = spec["type"] in ("shared_library", "loadable_module") - output = self.ComputeMacBundleOutput() - if is_empty: - output += ".stamp" - variables = [] - self.AppendPostbuildVariable( - variables, - spec, - output, - self.target.binary, - is_command_start=not package_framework, - ) - if package_framework and not is_empty: - if spec["type"] == "shared_library" and self.xcode_settings.isIOS: - self.ninja.build( - output, - "package_ios_framework", - mac_bundle_depends, - variables=variables, - ) - else: - variables.append(("version", self.xcode_settings.GetFrameworkVersion())) - self.ninja.build( - output, "package_framework", mac_bundle_depends, variables=variables - ) - else: - self.ninja.build(output, "stamp", mac_bundle_depends, variables=variables) - self.target.bundle = output - return output - - def GetToolchainEnv(self, additional_settings=None): - """Returns the variables toolchain would set for build steps.""" - env = self.GetSortedXcodeEnv(additional_settings=additional_settings) - if self.flavor == "win": - env = self.GetMsvsToolchainEnv(additional_settings=additional_settings) - return env - - def GetMsvsToolchainEnv(self, additional_settings=None): - """Returns the variables Visual Studio would set for build steps.""" - return self.msvs_settings.GetVSMacroEnv( - "$!PRODUCT_DIR", config=self.config_name - ) - - def GetSortedXcodeEnv(self, additional_settings=None): - """Returns the variables Xcode would set for build steps.""" - assert self.abs_build_dir - abs_build_dir = self.abs_build_dir - return gyp.xcode_emulation.GetSortedXcodeEnv( - self.xcode_settings, - abs_build_dir, - os.path.join(abs_build_dir, self.build_to_base), - self.config_name, - additional_settings, - ) - - def GetSortedXcodePostbuildEnv(self): - """Returns the variables Xcode would set for postbuild steps.""" - postbuild_settings = {} - # CHROMIUM_STRIP_SAVE_FILE is a chromium-specific hack. - # TODO(thakis): It would be nice to have some general mechanism instead. - strip_save_file = self.xcode_settings.GetPerTargetSetting( - "CHROMIUM_STRIP_SAVE_FILE" - ) - if strip_save_file: - postbuild_settings["CHROMIUM_STRIP_SAVE_FILE"] = strip_save_file - return self.GetSortedXcodeEnv(additional_settings=postbuild_settings) - - def AppendPostbuildVariable( - self, variables, spec, output, binary, is_command_start=False - ): - """Adds a 'postbuild' variable if there is a postbuild for |output|.""" - postbuild = self.GetPostbuildCommand(spec, output, binary, is_command_start) - if postbuild: - variables.append(("postbuilds", postbuild)) - - def GetPostbuildCommand(self, spec, output, output_binary, is_command_start): - """Returns a shell command that runs all the postbuilds, and removes - |output| if any of them fails. If |is_command_start| is False, then the - returned string will start with ' && '.""" - if not self.xcode_settings or spec["type"] == "none" or not output: - return "" - output = QuoteShellArgument(output, self.flavor) - postbuilds = gyp.xcode_emulation.GetSpecPostbuildCommands(spec, quiet=True) - if output_binary is not None: - postbuilds = self.xcode_settings.AddImplicitPostbuilds( - self.config_name, - os.path.normpath(os.path.join(self.base_to_build, output)), - QuoteShellArgument( - os.path.normpath(os.path.join(self.base_to_build, output_binary)), - self.flavor, - ), - postbuilds, - quiet=True, - ) - - if not postbuilds: - return "" - # Postbuilds expect to be run in the gyp file's directory, so insert an - # implicit postbuild to cd to there. - postbuilds.insert( - 0, gyp.common.EncodePOSIXShellList(["cd", self.build_to_base]) - ) - env = self.ComputeExportEnvString(self.GetSortedXcodePostbuildEnv()) - # G will be non-null if any postbuild fails. Run all postbuilds in a - # subshell. - commands = ( - env - + " (" - + " && ".join([ninja_syntax.escape(command) for command in postbuilds]) - ) - command_string = ( - commands + "); G=$$?; " - # Remove the final output if any postbuild failed. - "((exit $$G) || rm -rf %s) " % output + "&& exit $$G)" - ) - if is_command_start: - return "(" + command_string + " && " - else: - return "$ && (" + command_string - - def ComputeExportEnvString(self, env): - """Given an environment, returns a string looking like - 'export FOO=foo; export BAR="${FOO} bar;' - that exports |env| to the shell.""" - export_str = [] - for k, v in env: - export_str.append( - "export %s=%s;" - % (k, ninja_syntax.escape(gyp.common.EncodePOSIXShellArgument(v))) - ) - return " ".join(export_str) - - def ComputeMacBundleOutput(self): - """Return the 'output' (full output path) to a bundle output directory.""" - assert self.is_mac_bundle - path = generator_default_variables["PRODUCT_DIR"] - return self.ExpandSpecial( - os.path.join(path, self.xcode_settings.GetWrapperName()) - ) - - def ComputeOutputFileName(self, spec, type=None): - """Compute the filename of the final output for the current target.""" - if not type: - type = spec["type"] - - default_variables = copy.copy(generator_default_variables) - CalculateVariables(default_variables, {"flavor": self.flavor}) - - # Compute filename prefix: the product prefix, or a default for - # the product type. - DEFAULT_PREFIX = { - "loadable_module": default_variables["SHARED_LIB_PREFIX"], - "shared_library": default_variables["SHARED_LIB_PREFIX"], - "static_library": default_variables["STATIC_LIB_PREFIX"], - "executable": default_variables["EXECUTABLE_PREFIX"], - } - prefix = spec.get("product_prefix", DEFAULT_PREFIX.get(type, "")) - - # Compute filename extension: the product extension, or a default - # for the product type. - DEFAULT_EXTENSION = { - "loadable_module": default_variables["SHARED_LIB_SUFFIX"], - "shared_library": default_variables["SHARED_LIB_SUFFIX"], - "static_library": default_variables["STATIC_LIB_SUFFIX"], - "executable": default_variables["EXECUTABLE_SUFFIX"], - } - extension = spec.get("product_extension") - extension = "." + extension if extension else DEFAULT_EXTENSION.get(type, "") - - if "product_name" in spec: - # If we were given an explicit name, use that. - target = spec["product_name"] - else: - # Otherwise, derive a name from the target name. - target = spec["target_name"] - if prefix == "lib": - # Snip out an extra 'lib' from libs if appropriate. - target = StripPrefix(target, "lib") - - if type in ( - "static_library", - "loadable_module", - "shared_library", - "executable", - ): - return f"{prefix}{target}{extension}" - elif type == "none": - return "%s.stamp" % target - else: - raise Exception("Unhandled output type %s" % type) - - def ComputeOutput(self, spec, arch=None): - """Compute the path for the final output of the spec.""" - type = spec["type"] - - if self.flavor == "win": - override = self.msvs_settings.GetOutputName( - self.config_name, self.ExpandSpecial - ) - if override: - return override - - if ( - arch is None - and self.flavor == "mac" - and type - in ("static_library", "executable", "shared_library", "loadable_module") - ): - filename = self.xcode_settings.GetExecutablePath() - else: - filename = self.ComputeOutputFileName(spec, type) - - if arch is None and "product_dir" in spec: - path = os.path.join(spec["product_dir"], filename) - return self.ExpandSpecial(path) - - # Some products go into the output root, libraries go into shared library - # dir, and everything else goes into the normal place. - type_in_output_root = ["executable", "loadable_module"] - if self.flavor == "mac" and self.toolset == "target": - type_in_output_root += ["shared_library", "static_library"] - elif self.flavor == "win" and self.toolset == "target": - type_in_output_root += ["shared_library"] - - if arch is not None: - # Make sure partial executables don't end up in a bundle or the regular - # output directory. - archdir = "arch" - if self.toolset != "target": - archdir = os.path.join("arch", "%s" % self.toolset) - return os.path.join(archdir, AddArch(filename, arch)) - elif type in type_in_output_root or self.is_standalone_static_library: - return filename - elif type == "shared_library": - libdir = "lib" - if self.toolset != "target": - libdir = os.path.join("lib", "%s" % self.toolset) - return os.path.join(libdir, filename) - else: - return self.GypPathToUniqueOutput(filename, qualified=False) - - def WriteVariableList(self, ninja_file, var, values): - assert not isinstance(values, str) - if values is None: - values = [] - ninja_file.variable(var, " ".join(values)) - - def WriteNewNinjaRule( - self, name, args, description, win_shell_flags, env, pool, depfile=None - ): - """Write out a new ninja "rule" statement for a given command. - - Returns the name of the new rule, and a copy of |args| with variables - expanded.""" - - if self.flavor == "win": - args = [ - self.msvs_settings.ConvertVSMacros( - arg, self.base_to_build, config=self.config_name - ) - for arg in args - ] - description = self.msvs_settings.ConvertVSMacros( - description, config=self.config_name - ) - elif self.flavor == "mac": - # |env| is an empty list on non-mac. - args = [gyp.xcode_emulation.ExpandEnvVars(arg, env) for arg in args] - description = gyp.xcode_emulation.ExpandEnvVars(description, env) - - # TODO: we shouldn't need to qualify names; we do it because - # currently the ninja rule namespace is global, but it really - # should be scoped to the subninja. - rule_name = self.name - if self.toolset == "target": - rule_name += "." + self.toolset - rule_name += "." + name - rule_name = re.sub("[^a-zA-Z0-9_]", "_", rule_name) - - # Remove variable references, but not if they refer to the magic rule - # variables. This is not quite right, as it also protects these for - # actions, not just for rules where they are valid. Good enough. - protect = ["${root}", "${dirname}", "${source}", "${ext}", "${name}"] - protect = "(?!" + "|".join(map(re.escape, protect)) + ")" - description = re.sub(protect + r"\$", "_", description) - - # gyp dictates that commands are run from the base directory. - # cd into the directory before running, and adjust paths in - # the arguments to point to the proper locations. - rspfile = None - rspfile_content = None - args = [self.ExpandSpecial(arg, self.base_to_build) for arg in args] - if self.flavor == "win": - rspfile = rule_name + ".$unique_name.rsp" - # The cygwin case handles this inside the bash sub-shell. - run_in = "" if win_shell_flags.cygwin else " " + self.build_to_base - if win_shell_flags.cygwin: - rspfile_content = self.msvs_settings.BuildCygwinBashCommandLine( - args, self.build_to_base - ) - else: - rspfile_content = gyp.msvs_emulation.EncodeRspFileList( - args, win_shell_flags.quote - ) - command = ( - "%s gyp-win-tool action-wrapper $arch " % sys.executable - + rspfile - + run_in - ) - else: - env = self.ComputeExportEnvString(env) - command = gyp.common.EncodePOSIXShellList(args) - command = "cd %s; " % self.build_to_base + env + command - - # GYP rules/actions express being no-ops by not touching their outputs. - # Avoid executing downstream dependencies in this case by specifying - # restat=1 to ninja. - self.ninja.rule( - rule_name, - command, - description, - depfile=depfile, - restat=True, - pool=pool, - rspfile=rspfile, - rspfile_content=rspfile_content, - ) - self.ninja.newline() - - return rule_name, args - - -def CalculateVariables(default_variables, params): - """Calculate additional variables for use in the build (called by gyp).""" - global generator_additional_non_configuration_keys - global generator_additional_path_sections - flavor = gyp.common.GetFlavor(params) - if flavor == "mac": - default_variables.setdefault("OS", "mac") - default_variables.setdefault("SHARED_LIB_SUFFIX", ".dylib") - default_variables.setdefault( - "SHARED_LIB_DIR", generator_default_variables["PRODUCT_DIR"] - ) - default_variables.setdefault( - "LIB_DIR", generator_default_variables["PRODUCT_DIR"] - ) - - # Copy additional generator configuration data from Xcode, which is shared - # by the Mac Ninja generator. - import gyp.generator.xcode as xcode_generator # noqa: PLC0415 - - generator_additional_non_configuration_keys = getattr( - xcode_generator, "generator_additional_non_configuration_keys", [] - ) - generator_additional_path_sections = getattr( - xcode_generator, "generator_additional_path_sections", [] - ) - global generator_extra_sources_for_rules - generator_extra_sources_for_rules = getattr( - xcode_generator, "generator_extra_sources_for_rules", [] - ) - elif flavor == "win": - exts = gyp.MSVSUtil.TARGET_TYPE_EXT - default_variables.setdefault("OS", "win") - default_variables["EXECUTABLE_SUFFIX"] = "." + exts["executable"] - default_variables["STATIC_LIB_PREFIX"] = "" - default_variables["STATIC_LIB_SUFFIX"] = "." + exts["static_library"] - default_variables["SHARED_LIB_PREFIX"] = "" - default_variables["SHARED_LIB_SUFFIX"] = "." + exts["shared_library"] - - # Copy additional generator configuration data from VS, which is shared - # by the Windows Ninja generator. - import gyp.generator.msvs as msvs_generator # noqa: PLC0415 - - generator_additional_non_configuration_keys = getattr( - msvs_generator, "generator_additional_non_configuration_keys", [] - ) - generator_additional_path_sections = getattr( - msvs_generator, "generator_additional_path_sections", [] - ) - - gyp.msvs_emulation.CalculateCommonVariables(default_variables, params) - else: - operating_system = flavor - if flavor == "android": - operating_system = "linux" # Keep this legacy behavior for now. - default_variables.setdefault("OS", operating_system) - default_variables.setdefault("SHARED_LIB_SUFFIX", ".so") - default_variables.setdefault( - "SHARED_LIB_DIR", os.path.join("$!PRODUCT_DIR", "lib") - ) - default_variables.setdefault("LIB_DIR", os.path.join("$!PRODUCT_DIR", "obj")) - - -def ComputeOutputDir(params): - """Returns the path from the toplevel_dir to the build output directory.""" - # generator_dir: relative path from pwd to where make puts build files. - # Makes migrating from make to ninja easier, ninja doesn't put anything here. - generator_dir = os.path.relpath(params["options"].generator_output or ".") - - # output_dir: relative path from generator_dir to the build directory. - output_dir = params.get("generator_flags", {}).get("output_dir", "out") - - # Relative path from source root to our output files. e.g. "out" - return os.path.normpath(os.path.join(generator_dir, output_dir)) - - -def CalculateGeneratorInputInfo(params): - """Called by __init__ to initialize generator values based on params.""" - # E.g. "out/gypfiles" - toplevel = params["options"].toplevel_dir - qualified_out_dir = os.path.normpath( - os.path.join(toplevel, ComputeOutputDir(params), "gypfiles") - ) - - global generator_filelist_paths - generator_filelist_paths = { - "toplevel": toplevel, - "qualified_out_dir": qualified_out_dir, - } - - -def OpenOutput(path, mode="w"): - """Open |path| for writing, creating directories if necessary.""" - gyp.common.EnsureDirExists(path) - return open(path, mode) - - -def CommandWithWrapper(cmd, wrappers, prog): - if wrapper := wrappers.get(cmd, ""): - return wrapper + " " + prog - return prog - - -def GetDefaultConcurrentLinks(): - """Returns a best-guess for a number of concurrent links.""" - if pool_size := int(os.environ.get("GYP_LINK_CONCURRENCY") or 0): - return pool_size - - if sys.platform in ("win32", "cygwin"): - - class MEMORYSTATUSEX(ctypes.Structure): - _fields_ = [ - ("dwLength", ctypes.c_ulong), - ("dwMemoryLoad", ctypes.c_ulong), - ("ullTotalPhys", ctypes.c_ulonglong), - ("ullAvailPhys", ctypes.c_ulonglong), - ("ullTotalPageFile", ctypes.c_ulonglong), - ("ullAvailPageFile", ctypes.c_ulonglong), - ("ullTotalVirtual", ctypes.c_ulonglong), - ("ullAvailVirtual", ctypes.c_ulonglong), - ("sullAvailExtendedVirtual", ctypes.c_ulonglong), - ] - - stat = MEMORYSTATUSEX() - stat.dwLength = ctypes.sizeof(stat) - ctypes.windll.kernel32.GlobalMemoryStatusEx(ctypes.byref(stat)) - - # VS 2015 uses 20% more working set than VS 2013 and can consume all RAM - # on a 64 GiB machine. - mem_limit = max(1, stat.ullTotalPhys // (5 * (2**30))) # total / 5GiB - hard_cap = max(1, int(os.environ.get("GYP_LINK_CONCURRENCY_MAX") or 2**32)) - return min(mem_limit, hard_cap) - elif sys.platform.startswith("linux"): - if os.path.exists("/proc/meminfo"): - with open("/proc/meminfo") as meminfo: - memtotal_re = re.compile(r"^MemTotal:\s*(\d*)\s*kB") - for line in meminfo: - match = memtotal_re.match(line) - if not match: - continue - # Allow 8Gb per link on Linux because Gold is quite memory hungry - return max(1, int(match.group(1)) // (8 * (2**20))) - return 1 - elif sys.platform == "darwin": - try: - avail_bytes = int(subprocess.check_output(["sysctl", "-n", "hw.memsize"])) - # A static library debug build of Chromium's unit_tests takes ~2.7GB, so - # 4GB per ld process allows for some more bloat. - return max(1, avail_bytes // (4 * (2**30))) # total / 4GB - except subprocess.CalledProcessError: - return 1 - else: - # TODO(scottmg): Implement this for other platforms. - return 1 - - -def _GetWinLinkRuleNameSuffix(embed_manifest): - """Returns the suffix used to select an appropriate linking rule depending on - whether the manifest embedding is enabled.""" - return "_embed" if embed_manifest else "" - - -def _AddWinLinkRules(master_ninja, embed_manifest): - """Adds link rules for Windows platform to |master_ninja|.""" - - def FullLinkCommand(ldcmd, out, binary_type): - resource_name = {"exe": "1", "dll": "2"}[binary_type] - return ( - "%(python)s gyp-win-tool link-with-manifests $arch %(embed)s " - '%(out)s "%(ldcmd)s" %(resname)s $mt $rc "$intermediatemanifest" ' - "$manifests" - % { - "python": sys.executable, - "out": out, - "ldcmd": ldcmd, - "resname": resource_name, - "embed": embed_manifest, - } - ) - - rule_name_suffix = _GetWinLinkRuleNameSuffix(embed_manifest) - use_separate_mspdbsrv = int(os.environ.get("GYP_USE_SEPARATE_MSPDBSRV", "0")) != 0 - dlldesc = "LINK%s(DLL) $binary" % rule_name_suffix.upper() - dllcmd = ( - "%s gyp-win-tool link-wrapper $arch %s " - "$ld /nologo $implibflag /DLL /OUT:$binary " - "@$binary.rsp" % (sys.executable, use_separate_mspdbsrv) - ) - dllcmd = FullLinkCommand(dllcmd, "$binary", "dll") - master_ninja.rule( - "solink" + rule_name_suffix, - description=dlldesc, - command=dllcmd, - rspfile="$binary.rsp", - rspfile_content="$libs $in_newline $ldflags", - restat=True, - pool="link_pool", - ) - master_ninja.rule( - "solink_module" + rule_name_suffix, - description=dlldesc, - command=dllcmd, - rspfile="$binary.rsp", - rspfile_content="$libs $in_newline $ldflags", - restat=True, - pool="link_pool", - ) - # Note that ldflags goes at the end so that it has the option of - # overriding default settings earlier in the command line. - exe_cmd = ( - "%s gyp-win-tool link-wrapper $arch %s " - "$ld /nologo /OUT:$binary @$binary.rsp" - % (sys.executable, use_separate_mspdbsrv) - ) - exe_cmd = FullLinkCommand(exe_cmd, "$binary", "exe") - master_ninja.rule( - "link" + rule_name_suffix, - description="LINK%s $binary" % rule_name_suffix.upper(), - command=exe_cmd, - rspfile="$binary.rsp", - rspfile_content="$in_newline $libs $ldflags", - pool="link_pool", - ) - - -def GenerateOutputForConfig(target_list, target_dicts, data, params, config_name): - options = params["options"] - flavor = gyp.common.GetFlavor(params) - generator_flags = params.get("generator_flags", {}) - generate_compile_commands = generator_flags.get("compile_commands", False) - - # build_dir: relative path from source root to our output files. - # e.g. "out/Debug" - build_dir = os.path.normpath(os.path.join(ComputeOutputDir(params), config_name)) - - toplevel_build = os.path.join(options.toplevel_dir, build_dir) - - master_ninja_file = OpenOutput(os.path.join(toplevel_build, "build.ninja")) - master_ninja = ninja_syntax.Writer(master_ninja_file, width=120) - - # Put build-time support tools in out/{config_name}. - gyp.common.CopyTool(flavor, toplevel_build, generator_flags) - - # Grab make settings for CC/CXX. - # The rules are - # - The priority from low to high is gcc/g++, the 'make_global_settings' in - # gyp, the environment variable. - # - If there is no 'make_global_settings' for CC.host/CXX.host or - # 'CC_host'/'CXX_host' environment variable, cc_host/cxx_host should be set - # to cc/cxx. - if flavor == "win": - ar = "lib.exe" - # cc and cxx must be set to the correct architecture by overriding with one - # of cl_x86 or cl_x64 below. - cc = "UNSET" - cxx = "UNSET" - ld = "link.exe" - ld_host = "$ld" - else: - ar = "ar" - cc = "cc" - cxx = "c++" - ld = "$cc" - ldxx = "$cxx" - ld_host = "$cc_host" - ldxx_host = "$cxx_host" - - ar_host = ar - cc_host = None - cxx_host = None - cc_host_global_setting = None - cxx_host_global_setting = None - clang_cl = None - nm = "nm" - nm_host = "nm" - readelf = "readelf" - readelf_host = "readelf" - - build_file, _, _ = gyp.common.ParseQualifiedTarget(target_list[0]) - make_global_settings = data[build_file].get("make_global_settings", []) - build_to_root = gyp.common.InvertRelativePath(build_dir, options.toplevel_dir) - wrappers = {} - for key, value in make_global_settings: - if key == "AR": - ar = os.path.join(build_to_root, value) - if key == "AR.host": - ar_host = os.path.join(build_to_root, value) - if key == "CC": - cc = os.path.join(build_to_root, value) - if cc.endswith("clang-cl"): - clang_cl = cc - if key == "CXX": - cxx = os.path.join(build_to_root, value) - if key == "CC.host": - cc_host = os.path.join(build_to_root, value) - cc_host_global_setting = value - if key == "CXX.host": - cxx_host = os.path.join(build_to_root, value) - cxx_host_global_setting = value - if key == "LD": - ld = os.path.join(build_to_root, value) - if key == "LD.host": - ld_host = os.path.join(build_to_root, value) - if key == "LDXX": - ldxx = os.path.join(build_to_root, value) - if key == "LDXX.host": - ldxx_host = os.path.join(build_to_root, value) - if key == "NM": - nm = os.path.join(build_to_root, value) - if key == "NM.host": - nm_host = os.path.join(build_to_root, value) - if key == "READELF": - readelf = os.path.join(build_to_root, value) - if key == "READELF.host": - readelf_host = os.path.join(build_to_root, value) - if key.endswith("_wrapper"): - wrappers[key[: -len("_wrapper")]] = os.path.join(build_to_root, value) - - # Support wrappers from environment variables too. - for key, value in os.environ.items(): - if key.lower().endswith("_wrapper"): - key_prefix = key[: -len("_wrapper")] - key_prefix = re.sub(r"\.HOST$", ".host", key_prefix) - wrappers[key_prefix] = os.path.join(build_to_root, value) - - if mac_toolchain_dir := generator_flags.get("mac_toolchain_dir", None): - wrappers["LINK"] = "export DEVELOPER_DIR='%s' &&" % mac_toolchain_dir - - if flavor == "win": - configs = [ - target_dicts[qualified_target]["configurations"][config_name] - for qualified_target in target_list - ] - shared_system_includes = None - if not generator_flags.get("ninja_use_custom_environment_files", 0): - shared_system_includes = gyp.msvs_emulation.ExtractSharedMSVSSystemIncludes( - configs, generator_flags - ) - cl_paths = gyp.msvs_emulation.GenerateEnvironmentFiles( - toplevel_build, generator_flags, shared_system_includes, OpenOutput - ) - for arch, path in sorted(cl_paths.items()): - if clang_cl: - # If we have selected clang-cl, use that instead. - path = clang_cl - command = CommandWithWrapper( - "CC", wrappers, QuoteShellArgument(path, "win") - ) - if clang_cl: - # Use clang-cl to cross-compile for x86 or x86_64. - command += " -m32" if arch == "x86" else " -m64" - master_ninja.variable("cl_" + arch, command) - - cc = GetEnvironFallback(["CC_target", "CC"], cc) - master_ninja.variable("cc", CommandWithWrapper("CC", wrappers, cc)) - cxx = GetEnvironFallback(["CXX_target", "CXX"], cxx) - master_ninja.variable("cxx", CommandWithWrapper("CXX", wrappers, cxx)) - - if flavor == "win": - master_ninja.variable("ld", ld) - master_ninja.variable("idl", "midl.exe") - master_ninja.variable("ar", ar) - master_ninja.variable("rc", "rc.exe") - master_ninja.variable("ml_x86", "ml.exe") - master_ninja.variable("ml_x64", "ml64.exe") - master_ninja.variable("ml_arm64", "armasm64.exe") - master_ninja.variable("mt", "mt.exe") - else: - master_ninja.variable("ld", CommandWithWrapper("LINK", wrappers, ld)) - master_ninja.variable("ldxx", CommandWithWrapper("LINK", wrappers, ldxx)) - master_ninja.variable("ar", GetEnvironFallback(["AR_target", "AR"], ar)) - if flavor != "mac": - # Mac does not use readelf/nm for .TOC generation, so avoiding polluting - # the master ninja with extra unused variables. - master_ninja.variable("nm", GetEnvironFallback(["NM_target", "NM"], nm)) - master_ninja.variable( - "readelf", GetEnvironFallback(["READELF_target", "READELF"], readelf) - ) - - if generator_supports_multiple_toolsets: - if not cc_host: - cc_host = cc - if not cxx_host: - cxx_host = cxx - - master_ninja.variable("ar_host", GetEnvironFallback(["AR_host"], ar_host)) - master_ninja.variable("nm_host", GetEnvironFallback(["NM_host"], nm_host)) - master_ninja.variable( - "readelf_host", GetEnvironFallback(["READELF_host"], readelf_host) - ) - cc_host = GetEnvironFallback(["CC_host"], cc_host) - cxx_host = GetEnvironFallback(["CXX_host"], cxx_host) - - # The environment variable could be used in 'make_global_settings', like - # ['CC.host', '$(CC)'] or ['CXX.host', '$(CXX)'], transform them here. - if "$(CC)" in cc_host and cc_host_global_setting: - cc_host = cc_host_global_setting.replace("$(CC)", cc) - if "$(CXX)" in cxx_host and cxx_host_global_setting: - cxx_host = cxx_host_global_setting.replace("$(CXX)", cxx) - master_ninja.variable( - "cc_host", CommandWithWrapper("CC.host", wrappers, cc_host) - ) - master_ninja.variable( - "cxx_host", CommandWithWrapper("CXX.host", wrappers, cxx_host) - ) - if flavor == "win": - master_ninja.variable("ld_host", ld_host) - else: - master_ninja.variable( - "ld_host", CommandWithWrapper("LINK", wrappers, ld_host) - ) - master_ninja.variable( - "ldxx_host", CommandWithWrapper("LINK", wrappers, ldxx_host) - ) - - master_ninja.newline() - - master_ninja.pool("link_pool", depth=GetDefaultConcurrentLinks()) - master_ninja.newline() - - deps = "msvc" if flavor == "win" else "gcc" - - if flavor != "win": - master_ninja.rule( - "cc", - description="CC $out", - command=( - "$cc -MMD -MF $out.d $defines $includes $cflags $cflags_c " - "$cflags_pch_c -c $in -o $out" - ), - depfile="$out.d", - deps=deps, - ) - master_ninja.rule( - "cc_s", - description="CC $out", - command=( - "$cc $defines $includes $cflags $cflags_c $cflags_pch_c -c $in -o $out" - ), - ) - master_ninja.rule( - "cxx", - description="CXX $out", - command=( - "$cxx -MMD -MF $out.d $defines $includes $cflags $cflags_cc " - "$cflags_pch_cc -c $in -o $out" - ), - depfile="$out.d", - deps=deps, - ) - else: - # TODO(scottmg) Separate pdb names is a test to see if it works around - # http://crbug.com/142362. It seems there's a race between the creation of - # the .pdb by the precompiled header step for .cc and the compilation of - # .c files. This should be handled by mspdbsrv, but rarely errors out with - # c1xx : fatal error C1033: cannot open program database - # By making the rules target separate pdb files this might be avoided. - cc_command = ( - "ninja -t msvc -e $arch " + "-- " - "$cc /nologo /showIncludes /FC " - "@$out.rsp /c $in /Fo$out /Fd$pdbname_c " - ) - cxx_command = ( - "ninja -t msvc -e $arch " + "-- " - "$cxx /nologo /showIncludes /FC " - "@$out.rsp /c $in /Fo$out /Fd$pdbname_cc " - ) - master_ninja.rule( - "cc", - description="CC $out", - command=cc_command, - rspfile="$out.rsp", - rspfile_content="$defines $includes $cflags $cflags_c", - deps=deps, - ) - master_ninja.rule( - "cxx", - description="CXX $out", - command=cxx_command, - rspfile="$out.rsp", - rspfile_content="$defines $includes $cflags $cflags_cc", - deps=deps, - ) - master_ninja.rule( - "idl", - description="IDL $in", - command=( - "%s gyp-win-tool midl-wrapper $arch $outdir " - "$tlb $h $dlldata $iid $proxy $in " - "$midl_includes $idlflags" % sys.executable - ), - ) - master_ninja.rule( - "rc", - description="RC $in", - # Note: $in must be last otherwise rc.exe complains. - command=( - "%s gyp-win-tool rc-wrapper " - "$arch $rc $defines $resource_includes $rcflags /fo$out $in" - % sys.executable - ), - ) - master_ninja.rule( - "asm", - description="ASM $out", - command=( - "%s gyp-win-tool asm-wrapper " - "$arch $asm $defines $includes $asmflags /c /Fo $out $in" - % sys.executable - ), - ) - - if flavor not in ("ios", "mac", "win"): - master_ninja.rule( - "alink", - description="AR $out", - command="rm -f $out && $ar rcs $arflags $out $in", - ) - master_ninja.rule( - "alink_thin", - description="AR $out", - command="rm -f $out && $ar rcsT $arflags $out $in", - ) - - # This allows targets that only need to depend on $lib's API to declare an - # order-only dependency on $lib.TOC and avoid relinking such downstream - # dependencies when $lib changes only in non-public ways. - # The resulting string leaves an uninterpolated %{suffix} which - # is used in the final substitution below. - mtime_preserving_solink_base = ( - "if [ ! -e $lib -o ! -e $lib.TOC ]; then " - "%(solink)s && %(extract_toc)s > $lib.TOC; else " - "%(solink)s && %(extract_toc)s > $lib.tmp && " - "if ! cmp -s $lib.tmp $lib.TOC; then mv $lib.tmp $lib.TOC ; " - "fi; fi" - % { - "solink": "$ld -shared $ldflags -o $lib -Wl,-soname=$soname %(suffix)s", - "extract_toc": ( - "{ $readelf -d $lib | grep SONAME ; " - "$nm -gD -f p $lib | cut -f1-2 -d' '; }" - ), - } - ) - - master_ninja.rule( - "solink", - description="SOLINK $lib", - restat=True, - command=mtime_preserving_solink_base % {"suffix": "@$link_file_list"}, - rspfile="$link_file_list", - rspfile_content=( - "-Wl,--whole-archive $in $solibs -Wl,--no-whole-archive $libs" - ), - pool="link_pool", - ) - master_ninja.rule( - "solink_module", - description="SOLINK(module) $lib", - restat=True, - command=mtime_preserving_solink_base % {"suffix": "@$link_file_list"}, - rspfile="$link_file_list", - rspfile_content="-Wl,--start-group $in $solibs $libs -Wl,--end-group", - pool="link_pool", - ) - master_ninja.rule( - "link", - description="LINK $out", - command=( - "$ld $ldflags -o $out " - "-Wl,--start-group $in $solibs $libs -Wl,--end-group" - ), - pool="link_pool", - ) - elif flavor == "win": - master_ninja.rule( - "alink", - description="LIB $out", - command=( - "%s gyp-win-tool link-wrapper $arch False " - "$ar /nologo /ignore:4221 /OUT:$out @$out.rsp" % sys.executable - ), - rspfile="$out.rsp", - rspfile_content="$in_newline $libflags", - ) - _AddWinLinkRules(master_ninja, embed_manifest=True) - _AddWinLinkRules(master_ninja, embed_manifest=False) - else: - master_ninja.rule( - "objc", - description="OBJC $out", - command=( - "$cc -MMD -MF $out.d $defines $includes $cflags $cflags_objc " - "$cflags_pch_objc -c $in -o $out" - ), - depfile="$out.d", - deps=deps, - ) - master_ninja.rule( - "objcxx", - description="OBJCXX $out", - command=( - "$cxx -MMD -MF $out.d $defines $includes $cflags $cflags_objcc " - "$cflags_pch_objcc -c $in -o $out" - ), - depfile="$out.d", - deps=deps, - ) - master_ninja.rule( - "alink", - description="LIBTOOL-STATIC $out, POSTBUILDS", - command="rm -f $out && " - "%s gyp-mac-tool filter-libtool libtool $libtool_flags " - "-static -o $out $in" - "$postbuilds" % sys.executable, - ) - master_ninja.rule( - "lipo", - description="LIPO $out, POSTBUILDS", - command="rm -f $out && lipo -create $in -output $out$postbuilds", - ) - master_ninja.rule( - "solipo", - description="SOLIPO $out, POSTBUILDS", - command=( - "rm -f $lib $lib.TOC && lipo -create $in -output $lib$postbuilds &&" - "%(extract_toc)s > $lib.TOC" - % { - "extract_toc": "{ otool -l $lib | grep LC_ID_DYLIB -A 5; " - "nm -gP $lib | cut -f1-2 -d' ' | grep -v U$$; true; }" - } - ), - ) - - # Record the public interface of $lib in $lib.TOC. See the corresponding - # comment in the posix section above for details. - solink_base = "$ld %(type)s $ldflags -o $lib %(suffix)s" - mtime_preserving_solink_base = ( - "if [ ! -e $lib -o ! -e $lib.TOC ] || " - # Always force dependent targets to relink if this library - # reexports something. Handling this correctly would require - # recursive TOC dumping but this is rare in practice, so punt. - "otool -l $lib | grep -q LC_REEXPORT_DYLIB ; then " - "%(solink)s && %(extract_toc)s > $lib.TOC; " - "else " - "%(solink)s && %(extract_toc)s > $lib.tmp && " - "if ! cmp -s $lib.tmp $lib.TOC; then " - "mv $lib.tmp $lib.TOC ; " - "fi; " - "fi" - % { - "solink": solink_base, - "extract_toc": "{ otool -l $lib | grep LC_ID_DYLIB -A 5; " - "nm -gP $lib | cut -f1-2 -d' ' | grep -v U$$; true; }", - } - ) - - solink_suffix = "@$link_file_list$postbuilds" - master_ninja.rule( - "solink", - description="SOLINK $lib, POSTBUILDS", - restat=True, - command=mtime_preserving_solink_base - % {"suffix": solink_suffix, "type": "-shared"}, - rspfile="$link_file_list", - rspfile_content="$in $solibs $libs", - pool="link_pool", - ) - master_ninja.rule( - "solink_notoc", - description="SOLINK $lib, POSTBUILDS", - restat=True, - command=solink_base % {"suffix": solink_suffix, "type": "-shared"}, - rspfile="$link_file_list", - rspfile_content="$in $solibs $libs", - pool="link_pool", - ) - - master_ninja.rule( - "solink_module", - description="SOLINK(module) $lib, POSTBUILDS", - restat=True, - command=mtime_preserving_solink_base - % {"suffix": solink_suffix, "type": "-bundle"}, - rspfile="$link_file_list", - rspfile_content="$in $solibs $libs", - pool="link_pool", - ) - master_ninja.rule( - "solink_module_notoc", - description="SOLINK(module) $lib, POSTBUILDS", - restat=True, - command=solink_base % {"suffix": solink_suffix, "type": "-bundle"}, - rspfile="$link_file_list", - rspfile_content="$in $solibs $libs", - pool="link_pool", - ) - - master_ninja.rule( - "link", - description="LINK $out, POSTBUILDS", - command=("$ld $ldflags -o $out $in $solibs $libs$postbuilds"), - pool="link_pool", - ) - master_ninja.rule( - "preprocess_infoplist", - description="PREPROCESS INFOPLIST $out", - command=( - "$cc -E -P -Wno-trigraphs -x c $defines $in -o $out && " - "plutil -convert xml1 $out $out" - ), - ) - master_ninja.rule( - "copy_infoplist", - description="COPY INFOPLIST $in", - command="$env %s gyp-mac-tool copy-info-plist $in $out $binary $keys" - % sys.executable, - ) - master_ninja.rule( - "merge_infoplist", - description="MERGE INFOPLISTS $in", - command="$env %s gyp-mac-tool merge-info-plist $out $in" % sys.executable, - ) - master_ninja.rule( - "compile_xcassets", - description="COMPILE XCASSETS $in", - command="$env %s gyp-mac-tool compile-xcassets $keys $in" % sys.executable, - ) - master_ninja.rule( - "compile_ios_framework_headers", - description="COMPILE HEADER MAPS AND COPY FRAMEWORK HEADERS $in", - command="$env %(python)s gyp-mac-tool compile-ios-framework-header-map " - "$out $framework $in && $env %(python)s gyp-mac-tool " - "copy-ios-framework-headers $framework $copy_headers" - % {"python": sys.executable}, - ) - master_ninja.rule( - "mac_tool", - description="MACTOOL $mactool_cmd $in", - command="$env %s gyp-mac-tool $mactool_cmd $in $out $binary" - % sys.executable, - ) - master_ninja.rule( - "package_framework", - description="PACKAGE FRAMEWORK $out, POSTBUILDS", - command="%s gyp-mac-tool package-framework $out $version$postbuilds " - "&& touch $out" % sys.executable, - ) - master_ninja.rule( - "package_ios_framework", - description="PACKAGE IOS FRAMEWORK $out, POSTBUILDS", - command="%s gyp-mac-tool package-ios-framework $out $postbuilds " - "&& touch $out" % sys.executable, - ) - if flavor == "win": - master_ninja.rule( - "stamp", - description="STAMP $out", - command="%s gyp-win-tool stamp $out" % sys.executable, - ) - else: - master_ninja.rule( - "stamp", description="STAMP $out", command="${postbuilds}touch $out" - ) - if flavor == "win": - master_ninja.rule( - "copy", - description="COPY $in $out", - command="%s gyp-win-tool recursive-mirror $in $out" % sys.executable, - ) - elif flavor == "zos": - master_ninja.rule( - "copy", - description="COPY $in $out", - command="rm -rf $out && cp -fRP $in $out", - ) - else: - master_ninja.rule( - "copy", - description="COPY $in $out", - command="ln -f $in $out 2>/dev/null || (rm -rf $out && cp -af $in $out)", - ) - master_ninja.newline() - - all_targets = set() - for build_file in params["build_files"]: - for target in gyp.common.AllTargets( - target_list, target_dicts, os.path.normpath(build_file) - ): - all_targets.add(target) - all_outputs = set() - - # target_outputs is a map from qualified target name to a Target object. - target_outputs = {} - # target_short_names is a map from target short name to a list of Target - # objects. - target_short_names = {} - - # short name of targets that were skipped because they didn't contain anything - # interesting. - # NOTE: there may be overlap between this an non_empty_target_names. - empty_target_names = set() - - # Set of non-empty short target names. - # NOTE: there may be overlap between this an empty_target_names. - non_empty_target_names = set() - - for qualified_target in target_list: - # qualified_target is like: third_party/icu/icu.gyp:icui18n#target - build_file, name, toolset = gyp.common.ParseQualifiedTarget(qualified_target) - - this_make_global_settings = data[build_file].get("make_global_settings", []) - assert make_global_settings == this_make_global_settings, ( - "make_global_settings needs to be the same for all targets. " - f"{this_make_global_settings} vs. {make_global_settings}" - ) - - spec = target_dicts[qualified_target] - if flavor == "mac": - gyp.xcode_emulation.MergeGlobalXcodeSettingsToSpec(data[build_file], spec) - - # If build_file is a symlink, we must not follow it because there's a chance - # it could point to a path above toplevel_dir, and we cannot correctly deal - # with that case at the moment. - build_file = gyp.common.RelativePath(build_file, options.toplevel_dir, False) - - qualified_target_for_hash = gyp.common.QualifiedTarget( - build_file, name, toolset - ) - qualified_target_for_hash = qualified_target_for_hash.encode("utf-8") - hash_for_rules = hashlib.sha256(qualified_target_for_hash).hexdigest() - - base_path = os.path.dirname(build_file) - obj = "obj" - if toolset != "target": - obj += "." + toolset - output_file = os.path.join(obj, base_path, name + ".ninja") - - ninja_output = StringIO() - writer = NinjaWriter( - hash_for_rules, - target_outputs, - base_path, - build_dir, - ninja_output, - toplevel_build, - output_file, - flavor, - toplevel_dir=options.toplevel_dir, - ) - - target = writer.WriteSpec(spec, config_name, generator_flags) - - if ninja_output.tell() > 0: - # Only create files for ninja files that actually have contents. - with OpenOutput(os.path.join(toplevel_build, output_file)) as ninja_file: - ninja_file.write(ninja_output.getvalue()) - ninja_output.close() - master_ninja.subninja(output_file) - - if target: - if name != target.FinalOutput() and spec["toolset"] == "target": - target_short_names.setdefault(name, []).append(target) - target_outputs[qualified_target] = target - if qualified_target in all_targets: - all_outputs.add(target.FinalOutput()) - non_empty_target_names.add(name) - else: - empty_target_names.add(name) - - if target_short_names: - # Write a short name to build this target. This benefits both the - # "build chrome" case as well as the gyp tests, which expect to be - # able to run actions and build libraries by their short name. - master_ninja.newline() - master_ninja.comment("Short names for targets.") - for short_name in sorted(target_short_names): - master_ninja.build( - short_name, - "phony", - [x.FinalOutput() for x in target_short_names[short_name]], - ) - - # Write phony targets for any empty targets that weren't written yet. As - # short names are not necessarily unique only do this for short names that - # haven't already been output for another target. - empty_target_names = empty_target_names - non_empty_target_names - if empty_target_names: - master_ninja.newline() - master_ninja.comment("Empty targets (output for completeness).") - for name in sorted(empty_target_names): - master_ninja.build(name, "phony") - - if all_outputs: - master_ninja.newline() - master_ninja.build("all", "phony", sorted(all_outputs)) - master_ninja.default(generator_flags.get("default_target", "all")) - - master_ninja_file.close() - - if generate_compile_commands: - compile_db = GenerateCompileDBWithNinja(toplevel_build) - compile_db_file = OpenOutput( - os.path.join(toplevel_build, "compile_commands.json") - ) - compile_db_file.write(json.dumps(compile_db, indent=2)) - compile_db_file.close() - - -def GenerateCompileDBWithNinja(path, targets=["all"]): - """Generates a compile database using ninja. - - Args: - path: The build directory to generate a compile database for. - targets: Additional targets to pass to ninja. - - Returns: - List of the contents of the compile database. - """ - ninja_path = shutil.which("ninja") - if ninja_path is None: - raise Exception("ninja not found in PATH") - json_compile_db = subprocess.check_output( - [ninja_path, "-C", path] - + targets - + ["-t", "compdb", "cc", "cxx", "objc", "objcxx"] - ) - return json.loads(json_compile_db) - - -def PerformBuild(data, configurations, params): - options = params["options"] - for config in configurations: - builddir = os.path.join(options.toplevel_dir, "out", config) - arguments = ["ninja", "-C", builddir] - print(f"Building [{config}]: {arguments}") - subprocess.check_call(arguments) - - -def CallGenerateOutputForConfig(arglist): - # Ignore the interrupt signal so that the parent process catches it and - # kills all multiprocessing children. - signal.signal(signal.SIGINT, signal.SIG_IGN) - - (target_list, target_dicts, data, params, config_name) = arglist - GenerateOutputForConfig(target_list, target_dicts, data, params, config_name) - - -def GenerateOutput(target_list, target_dicts, data, params): - # Update target_dicts for iOS device builds. - target_dicts = gyp.xcode_emulation.CloneConfigurationForDeviceAndEmulator( - target_dicts - ) - - user_config = params.get("generator_flags", {}).get("config", None) - if gyp.common.GetFlavor(params) == "win": - target_list, target_dicts = MSVSUtil.ShardTargets(target_list, target_dicts) - target_list, target_dicts = MSVSUtil.InsertLargePdbShims( - target_list, target_dicts, generator_default_variables - ) - - if user_config: - GenerateOutputForConfig(target_list, target_dicts, data, params, user_config) - else: - config_names = target_dicts[target_list[0]]["configurations"] - if params["parallel"]: - try: - pool = multiprocessing.Pool(len(config_names)) - arglists = [] - for config_name in config_names: - arglists.append( - (target_list, target_dicts, data, params, config_name) - ) - pool.map(CallGenerateOutputForConfig, arglists) - except KeyboardInterrupt as e: - pool.terminate() - raise e - else: - for config_name in config_names: - GenerateOutputForConfig( - target_list, target_dicts, data, params, config_name - ) diff --git a/tools/gyp/pylib/gyp/generator/ninja_test.py b/tools/gyp/pylib/gyp/generator/ninja_test.py deleted file mode 100644 index 8b590af8eb3..00000000000 --- a/tools/gyp/pylib/gyp/generator/ninja_test.py +++ /dev/null @@ -1,77 +0,0 @@ -#!/usr/bin/env python3 - -# Copyright (c) 2012 Google Inc. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Unit tests for the ninja.py file.""" - -import sys -import unittest -from pathlib import Path - -from gyp.generator import ninja -from gyp.MSVSVersion import SelectVisualStudioVersion - - -def _has_visual_studio(): - """Check if Visual Studio can be detected by gyp's registry-based detection.""" - if not sys.platform.startswith("win"): - return False - try: - SelectVisualStudioVersion("auto", allow_fallback=False) - return True - except ValueError: - return False - - -class TestPrefixesAndSuffixes(unittest.TestCase): - @unittest.skipUnless( - _has_visual_studio(), - "requires Windows with a Visual Studio installation detected via the registry", - ) - def test_BinaryNamesWindows(self): - writer = ninja.NinjaWriter( - "foo", "wee", ".", ".", "build.ninja", ".", "build.ninja", "win" - ) - spec = {"target_name": "wee"} - for key, ext in { - "executable": ".exe", - "shared_library": ".dll", - "static_library": ".lib", - }.items(): - self.assertTrue(writer.ComputeOutputFileName(spec, key).endswith(ext)) - - def test_BinaryNamesLinux(self): - writer = ninja.NinjaWriter( - "foo", "wee", ".", ".", "build.ninja", ".", "build.ninja", "linux" - ) - spec = {"target_name": "wee"} - self.assertTrue("." not in writer.ComputeOutputFileName(spec, "executable")) - self.assertTrue( - writer.ComputeOutputFileName(spec, "shared_library").startswith("lib") - ) - self.assertTrue( - writer.ComputeOutputFileName(spec, "static_library").startswith("lib") - ) - self.assertTrue( - writer.ComputeOutputFileName(spec, "shared_library").endswith(".so") - ) - self.assertTrue( - writer.ComputeOutputFileName(spec, "static_library").endswith(".a") - ) - - def test_GenerateCompileDBWithNinja(self): - build_dir = ( - Path(__file__).resolve().parent.parent.parent.parent / "data" / "ninja" - ) - compile_db = ninja.GenerateCompileDBWithNinja(build_dir) - assert len(compile_db) == 1 - assert compile_db[0]["directory"] == str(build_dir) - assert compile_db[0]["command"] == "cc my.in my.out" - assert compile_db[0]["file"] == "my.in" - assert compile_db[0]["output"] == "my.out" - - -if __name__ == "__main__": - unittest.main() diff --git a/tools/gyp/pylib/gyp/generator/xcode.py b/tools/gyp/pylib/gyp/generator/xcode.py deleted file mode 100644 index db4b45d1a04..00000000000 --- a/tools/gyp/pylib/gyp/generator/xcode.py +++ /dev/null @@ -1,1389 +0,0 @@ -# Copyright (c) 2012 Google Inc. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - - -import errno -import filecmp -import os -import posixpath -import re -import shutil -import subprocess -import sys -import tempfile - -import gyp.common -import gyp.xcode_ninja -import gyp.xcodeproj_file - -# Project files generated by this module will use _intermediate_var as a -# custom Xcode setting whose value is a DerivedSources-like directory that's -# project-specific and configuration-specific. The normal choice, -# DERIVED_FILE_DIR, is target-specific, which is thought to be too restrictive -# as it is likely that multiple targets within a single project file will want -# to access the same set of generated files. The other option, -# PROJECT_DERIVED_FILE_DIR, is unsuitable because while it is project-specific, -# it is not configuration-specific. INTERMEDIATE_DIR is defined as -# $(PROJECT_DERIVED_FILE_DIR)/$(CONFIGURATION). -_intermediate_var = "INTERMEDIATE_DIR" - -# SHARED_INTERMEDIATE_DIR is the same, except that it is shared among all -# targets that share the same BUILT_PRODUCTS_DIR. -_shared_intermediate_var = "SHARED_INTERMEDIATE_DIR" - -_library_search_paths_var = "LIBRARY_SEARCH_PATHS" - -generator_default_variables = { - "EXECUTABLE_PREFIX": "", - "EXECUTABLE_SUFFIX": "", - "STATIC_LIB_PREFIX": "lib", - "SHARED_LIB_PREFIX": "lib", - "STATIC_LIB_SUFFIX": ".a", - "SHARED_LIB_SUFFIX": ".dylib", - # INTERMEDIATE_DIR is a place for targets to build up intermediate products. - # It is specific to each build environment. It is only guaranteed to exist - # and be constant within the context of a project, corresponding to a single - # input file. Some build environments may allow their intermediate directory - # to be shared on a wider scale, but this is not guaranteed. - "INTERMEDIATE_DIR": "$(%s)" % _intermediate_var, - "OS": "mac", - "PRODUCT_DIR": "$(BUILT_PRODUCTS_DIR)", - "LIB_DIR": "$(BUILT_PRODUCTS_DIR)", - "RULE_INPUT_ROOT": "$(INPUT_FILE_BASE)", - "RULE_INPUT_EXT": "$(INPUT_FILE_SUFFIX)", - "RULE_INPUT_NAME": "$(INPUT_FILE_NAME)", - "RULE_INPUT_PATH": "$(INPUT_FILE_PATH)", - "RULE_INPUT_DIRNAME": "$(INPUT_FILE_DIRNAME)", - "SHARED_INTERMEDIATE_DIR": "$(%s)" % _shared_intermediate_var, - "CONFIGURATION_NAME": "$(CONFIGURATION)", -} - -# The Xcode-specific sections that hold paths. -generator_additional_path_sections = [ - "mac_bundle_resources", - "mac_framework_headers", - "mac_framework_private_headers", - # 'mac_framework_dirs', input already handles _dirs endings. -] - -# The Xcode-specific keys that exist on targets and aren't moved down to -# configurations. -generator_additional_non_configuration_keys = [ - "ios_app_extension", - "ios_watch_app", - "ios_watchkit_extension", - "mac_bundle", - "mac_bundle_resources", - "mac_framework_headers", - "mac_framework_private_headers", - "mac_xctest_bundle", - "mac_xcuitest_bundle", - "xcode_create_dependents_test_runner", -] - -# We want to let any rules apply to files that are resources also. -generator_extra_sources_for_rules = [ - "mac_bundle_resources", - "mac_framework_headers", - "mac_framework_private_headers", -] - -generator_filelist_paths = None - -# Xcode's standard set of library directories, which don't need to be duplicated -# in LIBRARY_SEARCH_PATHS. This list is not exhaustive, but that's okay. -xcode_standard_library_dirs = frozenset( - ["$(SDKROOT)/usr/lib", "$(SDKROOT)/usr/local/lib"] -) - - -def CreateXCConfigurationList(configuration_names): - xccl = gyp.xcodeproj_file.XCConfigurationList({"buildConfigurations": []}) - if len(configuration_names) == 0: - configuration_names = ["Default"] - for configuration_name in configuration_names: - xcbc = gyp.xcodeproj_file.XCBuildConfiguration({"name": configuration_name}) - xccl.AppendProperty("buildConfigurations", xcbc) - xccl.SetProperty("defaultConfigurationName", configuration_names[0]) - return xccl - - -class XcodeProject: - def __init__(self, gyp_path, path, build_file_dict): - self.gyp_path = gyp_path - self.path = path - self.project = gyp.xcodeproj_file.PBXProject(path=path) - projectDirPath = gyp.common.RelativePath( - os.path.dirname(os.path.abspath(self.gyp_path)), - os.path.dirname(path) or ".", - ) - self.project.SetProperty("projectDirPath", projectDirPath) - self.project_file = gyp.xcodeproj_file.XCProjectFile( - {"rootObject": self.project} - ) - self.build_file_dict = build_file_dict - - # TODO(mark): add destructor that cleans up self.path if created_dir is - # True and things didn't complete successfully. Or do something even - # better with "try"? - self.created_dir = False - try: - os.makedirs(self.path) - self.created_dir = True - except OSError as e: - if e.errno != errno.EEXIST: - raise - - def Finalize1(self, xcode_targets, serialize_all_tests): - # Collect a list of all of the build configuration names used by the - # various targets in the file. It is very heavily advised to keep each - # target in an entire project (even across multiple project files) using - # the same set of configuration names. - configurations = [] - for xct in self.project.GetProperty("targets"): - xccl = xct.GetProperty("buildConfigurationList") - xcbcs = xccl.GetProperty("buildConfigurations") - for xcbc in xcbcs: - name = xcbc.GetProperty("name") - if name not in configurations: - configurations.append(name) - - # Replace the XCConfigurationList attached to the PBXProject object with - # a new one specifying all of the configuration names used by the various - # targets. - try: - xccl = CreateXCConfigurationList(configurations) - self.project.SetProperty("buildConfigurationList", xccl) - except Exception: - sys.stderr.write("Problem with gyp file %s\n" % self.gyp_path) - raise - - # The need for this setting is explained above where _intermediate_var is - # defined. The comments below about wanting to avoid project-wide build - # settings apply here too, but this needs to be set on a project-wide basis - # so that files relative to the _intermediate_var setting can be displayed - # properly in the Xcode UI. - # - # Note that for configuration-relative files such as anything relative to - # _intermediate_var, for the purposes of UI tree view display, Xcode will - # only resolve the configuration name once, when the project file is - # opened. If the active build configuration is changed, the project file - # must be closed and reopened if it is desired for the tree view to update. - # This is filed as Apple radar 6588391. - xccl.SetBuildSetting( - _intermediate_var, "$(PROJECT_DERIVED_FILE_DIR)/$(CONFIGURATION)" - ) - xccl.SetBuildSetting( - _shared_intermediate_var, "$(SYMROOT)/DerivedSources/$(CONFIGURATION)" - ) - - # Set user-specified project-wide build settings and config files. This - # is intended to be used very sparingly. Really, almost everything should - # go into target-specific build settings sections. The project-wide - # settings are only intended to be used in cases where Xcode attempts to - # resolve variable references in a project context as opposed to a target - # context, such as when resolving sourceTree references while building up - # the tree tree view for UI display. - # Any values set globally are applied to all configurations, then any - # per-configuration values are applied. - for xck, xcv in self.build_file_dict.get("xcode_settings", {}).items(): - xccl.SetBuildSetting(xck, xcv) - if "xcode_config_file" in self.build_file_dict: - config_ref = self.project.AddOrGetFileInRootGroup( - self.build_file_dict["xcode_config_file"] - ) - xccl.SetBaseConfiguration(config_ref) - build_file_configurations = self.build_file_dict.get("configurations", {}) - if build_file_configurations: - for config_name in configurations: - build_file_configuration_named = build_file_configurations.get( - config_name, {} - ) - if build_file_configuration_named: - xcc = xccl.ConfigurationNamed(config_name) - for xck, xcv in build_file_configuration_named.get( - "xcode_settings", {} - ).items(): - xcc.SetBuildSetting(xck, xcv) - if "xcode_config_file" in build_file_configuration_named: - config_ref = self.project.AddOrGetFileInRootGroup( - build_file_configurations[config_name]["xcode_config_file"] - ) - xcc.SetBaseConfiguration(config_ref) - - # Sort the targets based on how they appeared in the input. - # TODO(mark): Like a lot of other things here, this assumes internal - # knowledge of PBXProject - in this case, of its "targets" property. - - # ordinary_targets are ordinary targets that are already in the project - # file. run_test_targets are the targets that run unittests and should be - # used for the Run All Tests target. support_targets are the action/rule - # targets used by GYP file targets, just kept for the assert check. - ordinary_targets = [] - run_test_targets = [] - support_targets = [] - - # targets is full list of targets in the project. - targets = [] - - # does the it define it's own "all"? - has_custom_all = False - - # targets_for_all is the list of ordinary_targets that should be listed - # in this project's "All" target. It includes each non_runtest_target - # that does not have suppress_wildcard set. - targets_for_all = [] - - for target in self.build_file_dict["targets"]: - target_name = target["target_name"] - toolset = target["toolset"] - qualified_target = gyp.common.QualifiedTarget( - self.gyp_path, target_name, toolset - ) - xcode_target = xcode_targets[qualified_target] - # Make sure that the target being added to the sorted list is already in - # the unsorted list. - assert xcode_target in self.project._properties["targets"] - targets.append(xcode_target) - ordinary_targets.append(xcode_target) - if xcode_target.support_target: - support_targets.append(xcode_target.support_target) - targets.append(xcode_target.support_target) - - if not int(target.get("suppress_wildcard", False)): - targets_for_all.append(xcode_target) - - if target_name.lower() == "all": - has_custom_all = True - - # If this target has a 'run_as' attribute, add its target to the - # targets, and add it to the test targets. - if target.get("run_as"): - # Make a target to run something. It should have one - # dependency, the parent xcode target. - xccl = CreateXCConfigurationList(configurations) - run_target = gyp.xcodeproj_file.PBXAggregateTarget( - { - "name": "Run " + target_name, - "productName": xcode_target.GetProperty("productName"), - "buildConfigurationList": xccl, - }, - parent=self.project, - ) - run_target.AddDependency(xcode_target) - - command = target["run_as"] - script = "" - if command.get("working_directory"): - script = ( - script - + 'cd "%s"\n' - % gyp.xcodeproj_file.ConvertVariablesToShellSyntax( - command.get("working_directory") - ) - ) - - if command.get("environment"): - script = ( - script - + "\n".join( - [ - 'export %s="%s"' - % ( - key, - gyp.xcodeproj_file.ConvertVariablesToShellSyntax( - val - ), - ) - for (key, val) in command.get("environment").items() - ] - ) - + "\n" - ) - - # Some test end up using sockets, files on disk, etc. and can get - # confused if more then one test runs at a time. The generator - # flag 'xcode_serialize_all_test_runs' controls the forcing of all - # tests serially. It defaults to True. To get serial runs this - # little bit of python does the same as the linux flock utility to - # make sure only one runs at a time. - command_prefix = "" - if serialize_all_tests: - command_prefix = """python -c "import fcntl, subprocess, sys -file = open('$TMPDIR/GYP_serialize_test_runs', 'a') -fcntl.flock(file.fileno(), fcntl.LOCK_EX) -sys.exit(subprocess.call(sys.argv[1:]))" """ - - # If we were unable to exec for some reason, we want to exit - # with an error, and fixup variable references to be shell - # syntax instead of xcode syntax. - script = ( - script - + "exec " - + command_prefix - + "%s\nexit 1\n" - % gyp.xcodeproj_file.ConvertVariablesToShellSyntax( - gyp.common.EncodePOSIXShellList(command.get("action")) - ) - ) - - ssbp = gyp.xcodeproj_file.PBXShellScriptBuildPhase( - {"shellScript": script, "showEnvVarsInLog": 0} - ) - run_target.AppendProperty("buildPhases", ssbp) - - # Add the run target to the project file. - targets.append(run_target) - run_test_targets.append(run_target) - xcode_target.test_runner = run_target - - # Make sure that the list of targets being replaced is the same length as - # the one replacing it, but allow for the added test runner targets. - assert len(self.project._properties["targets"]) == len(ordinary_targets) + len( - support_targets - ) - - self.project._properties["targets"] = targets - - # Get rid of unnecessary levels of depth in groups like the Source group. - self.project.RootGroupsTakeOverOnlyChildren(True) - - # Sort the groups nicely. Do this after sorting the targets, because the - # Products group is sorted based on the order of the targets. - self.project.SortGroups() - - # Create an "All" target if there's more than one target in this project - # file and the project didn't define its own "All" target. Put a generated - # "All" target first so that people opening up the project for the first - # time will build everything by default. - if len(targets_for_all) > 1 and not has_custom_all: - xccl = CreateXCConfigurationList(configurations) - all_target = gyp.xcodeproj_file.PBXAggregateTarget( - {"buildConfigurationList": xccl, "name": "All"}, parent=self.project - ) - - for target in targets_for_all: - all_target.AddDependency(target) - - # TODO(mark): This is evil because it relies on internal knowledge of - # PBXProject._properties. It's important to get the "All" target first, - # though. - self.project._properties["targets"].insert(0, all_target) - - # The same, but for run_test_targets. - if len(run_test_targets) > 1: - xccl = CreateXCConfigurationList(configurations) - run_all_tests_target = gyp.xcodeproj_file.PBXAggregateTarget( - {"buildConfigurationList": xccl, "name": "Run All Tests"}, - parent=self.project, - ) - for run_test_target in run_test_targets: - run_all_tests_target.AddDependency(run_test_target) - - # Insert after the "All" target, which must exist if there is more than - # one run_test_target. - self.project._properties["targets"].insert(1, run_all_tests_target) - - def Finalize2(self, xcode_targets, xcode_target_to_target_dict): - # Finalize2 needs to happen in a separate step because the process of - # updating references to other projects depends on the ordering of targets - # within remote project files. Finalize1 is responsible for sorting duty, - # and once all project files are sorted, Finalize2 can come in and update - # these references. - - # To support making a "test runner" target that will run all the tests - # that are direct dependents of any given target, we look for - # xcode_create_dependents_test_runner being set on an Aggregate target, - # and generate a second target that will run the tests runners found under - # the marked target. - for bf_tgt in self.build_file_dict["targets"]: - if int(bf_tgt.get("xcode_create_dependents_test_runner", 0)): - tgt_name = bf_tgt["target_name"] - toolset = bf_tgt["toolset"] - qualified_target = gyp.common.QualifiedTarget( - self.gyp_path, tgt_name, toolset - ) - xcode_target = xcode_targets[qualified_target] - if isinstance(xcode_target, gyp.xcodeproj_file.PBXAggregateTarget): - # Collect all the run test targets. - all_run_tests = [] - pbxtds = xcode_target.GetProperty("dependencies") - for pbxtd in pbxtds: - pbxcip = pbxtd.GetProperty("targetProxy") - dependency_xct = pbxcip.GetProperty("remoteGlobalIDString") - if hasattr(dependency_xct, "test_runner"): - all_run_tests.append(dependency_xct.test_runner) - - # Directly depend on all the runners as they depend on the target - # that builds them. - if len(all_run_tests) > 0: - run_all_target = gyp.xcodeproj_file.PBXAggregateTarget( - { - "name": "Run %s Tests" % tgt_name, - "productName": tgt_name, - }, - parent=self.project, - ) - for run_test_target in all_run_tests: - run_all_target.AddDependency(run_test_target) - - # Insert the test runner after the related target. - idx = self.project._properties["targets"].index(xcode_target) - self.project._properties["targets"].insert( - idx + 1, run_all_target - ) - - # Update all references to other projects, to make sure that the lists of - # remote products are complete. Otherwise, Xcode will fill them in when - # it opens the project file, which will result in unnecessary diffs. - # TODO(mark): This is evil because it relies on internal knowledge of - # PBXProject._other_pbxprojects. - for other_pbxproject in self.project._other_pbxprojects: - self.project.AddOrGetProjectReference(other_pbxproject) - - self.project.SortRemoteProductReferences() - - # Give everything an ID. - self.project_file.ComputeIDs() - - # Make sure that no two objects in the project file have the same ID. If - # multiple objects wind up with the same ID, upon loading the file, Xcode - # will only recognize one object (the last one in the file?) and the - # results are unpredictable. - self.project_file.EnsureNoIDCollisions() - - def Write(self): - # Write the project file to a temporary location first. Xcode watches for - # changes to the project file and presents a UI sheet offering to reload - # the project when it does change. However, in some cases, especially when - # multiple projects are open or when Xcode is busy, things don't work so - # seamlessly. Sometimes, Xcode is able to detect that a project file has - # changed but can't unload it because something else is referencing it. - # To mitigate this problem, and to avoid even having Xcode present the UI - # sheet when an open project is rewritten for inconsequential changes, the - # project file is written to a temporary file in the xcodeproj directory - # first. The new temporary file is then compared to the existing project - # file, if any. If they differ, the new file replaces the old; otherwise, - # the new project file is simply deleted. Xcode properly detects a file - # being renamed over an open project file as a change and so it remains - # able to present the "project file changed" sheet under this system. - # Writing to a temporary file first also avoids the possible problem of - # Xcode rereading an incomplete project file. - (output_fd, new_pbxproj_path) = tempfile.mkstemp( - suffix=".tmp", prefix="project.pbxproj.gyp.", dir=self.path - ) - - try: - output_file = os.fdopen(output_fd, "w") - - self.project_file.Print(output_file) - output_file.close() - - pbxproj_path = os.path.join(self.path, "project.pbxproj") - - same = False - try: - same = filecmp.cmp(pbxproj_path, new_pbxproj_path, False) - except OSError as e: - if e.errno != errno.ENOENT: - raise - - if same: - # The new file is identical to the old one, just get rid of the new - # one. - os.unlink(new_pbxproj_path) - else: - # The new file is different from the old one, or there is no old one. - # Rename the new file to the permanent name. - # - # tempfile.mkstemp uses an overly restrictive mode, resulting in a - # file that can only be read by the owner, regardless of the umask. - # There's no reason to not respect the umask here, which means that - # an extra hoop is required to fetch it and reset the new file's mode. - # - # No way to get the umask without setting a new one? Set a safe one - # and then set it back to the old value. - umask = os.umask(0o77) - os.umask(umask) - - os.chmod(new_pbxproj_path, 0o666 & ~umask) - os.rename(new_pbxproj_path, pbxproj_path) - - except Exception: - # Don't leave turds behind. In fact, if this code was responsible for - # creating the xcodeproj directory, get rid of that too. - os.unlink(new_pbxproj_path) - if self.created_dir: - shutil.rmtree(self.path, True) - raise - - -def AddSourceToTarget(source, type, pbxp, xct): - # TODO(mark): Perhaps source_extensions and library_extensions can be made a - # little bit fancier. - source_extensions = ["c", "cc", "cpp", "cxx", "m", "mm", "s", "swift"] - - # .o is conceptually more of a "source" than a "library," but Xcode thinks - # of "sources" as things to compile and "libraries" (or "frameworks") as - # things to link with. Adding an object file to an Xcode target's frameworks - # phase works properly. - library_extensions = ["a", "dylib", "framework", "o"] - - basename = posixpath.basename(source) - (_root, ext) = posixpath.splitext(basename) - if ext: - ext = ext[1:].lower() - - if ext in source_extensions and type != "none": - xct.SourcesPhase().AddFile(source) - elif ext in library_extensions and type != "none": - xct.FrameworksPhase().AddFile(source) - else: - # Files that aren't added to a sources or frameworks build phase can still - # go into the project file, just not as part of a build phase. - pbxp.AddOrGetFileInRootGroup(source) - - -def AddResourceToTarget(resource, pbxp, xct): - # TODO(mark): Combine with AddSourceToTarget above? Or just inline this call - # where it's used. - xct.ResourcesPhase().AddFile(resource) - - -def AddHeaderToTarget(header, pbxp, xct, is_public): - # TODO(mark): Combine with AddSourceToTarget above? Or just inline this call - # where it's used. - settings = "{ATTRIBUTES = (%s, ); }" % ("Private", "Public")[is_public] - xct.HeadersPhase().AddFile(header, settings) - - -_xcode_variable_re = re.compile(r"(\$\((.*?)\))") - - -def ExpandXcodeVariables(string, expansions): - """Expands Xcode-style $(VARIABLES) in string per the expansions dict. - - In some rare cases, it is appropriate to expand Xcode variables when a - project file is generated. For any substring $(VAR) in string, if VAR is a - key in the expansions dict, $(VAR) will be replaced with expansions[VAR]. - Any $(VAR) substring in string for which VAR is not a key in the expansions - dict will remain in the returned string. - """ - - matches = _xcode_variable_re.findall(string) - if matches is None: - return string - - matches.reverse() - for match in matches: - (to_replace, variable) = match - if variable not in expansions: - continue - - replacement = expansions[variable] - string = re.sub(re.escape(to_replace), replacement, string) - - return string - - -_xcode_define_re = re.compile(r"([\\\"\' ])") - - -def EscapeXcodeDefine(s): - """We must escape the defines that we give to XCode so that it knows not to - split on spaces and to respect backslash and quote literals. However, we - must not quote the define, or Xcode will incorrectly interpret variables - especially $(inherited).""" - return re.sub(_xcode_define_re, r"\\\1", s) - - -def PerformBuild(data, configurations, params): - options = params["options"] - - for build_file, build_file_dict in data.items(): - (build_file_root, build_file_ext) = os.path.splitext(build_file) - if build_file_ext != ".gyp": - continue - xcodeproj_path = build_file_root + options.suffix + ".xcodeproj" - if options.generator_output: - xcodeproj_path = os.path.join(options.generator_output, xcodeproj_path) - - for config in configurations: - arguments = ["xcodebuild", "-project", xcodeproj_path] - arguments += ["-configuration", config] - print(f"Building [{config}]: {arguments}") - subprocess.check_call(arguments) - - -def CalculateGeneratorInputInfo(params): - toplevel = params["options"].toplevel_dir - if params.get("flavor") == "ninja": - generator_dir = os.path.relpath(params["options"].generator_output or ".") - output_dir = params.get("generator_flags", {}).get("output_dir", "out") - output_dir = os.path.normpath(os.path.join(generator_dir, output_dir)) - qualified_out_dir = os.path.normpath( - os.path.join(toplevel, output_dir, "gypfiles-xcode-ninja") - ) - else: - output_dir = os.path.normpath(os.path.join(toplevel, "xcodebuild")) - qualified_out_dir = os.path.normpath( - os.path.join(toplevel, output_dir, "gypfiles") - ) - - global generator_filelist_paths - generator_filelist_paths = { - "toplevel": toplevel, - "qualified_out_dir": qualified_out_dir, - } - - -def GenerateOutput(target_list, target_dicts, data, params): - # Optionally configure each spec to use ninja as the external builder. - ninja_wrapper = params.get("flavor") == "ninja" - if ninja_wrapper: - (target_list, target_dicts, data) = gyp.xcode_ninja.CreateWrapper( - target_list, target_dicts, data, params - ) - - options = params["options"] - generator_flags = params.get("generator_flags", {}) - parallel_builds = generator_flags.get("xcode_parallel_builds", True) - serialize_all_tests = generator_flags.get("xcode_serialize_all_test_runs", True) - upgrade_check_project_version = generator_flags.get( - "xcode_upgrade_check_project_version", None - ) - - # Format upgrade_check_project_version with leading zeros as needed. - if upgrade_check_project_version: - upgrade_check_project_version = str(upgrade_check_project_version) - while len(upgrade_check_project_version) < 4: - upgrade_check_project_version = "0" + upgrade_check_project_version - - skip_excluded_files = not generator_flags.get("xcode_list_excluded_files", True) - xcode_projects = {} - for build_file, build_file_dict in data.items(): - (build_file_root, build_file_ext) = os.path.splitext(build_file) - if build_file_ext != ".gyp": - continue - xcodeproj_path = build_file_root + options.suffix + ".xcodeproj" - if options.generator_output: - xcodeproj_path = os.path.join(options.generator_output, xcodeproj_path) - xcp = XcodeProject(build_file, xcodeproj_path, build_file_dict) - xcode_projects[build_file] = xcp - pbxp = xcp.project - - # Set project-level attributes from multiple options - project_attributes = {} - if parallel_builds: - project_attributes["BuildIndependentTargetsInParallel"] = "YES" - if upgrade_check_project_version: - project_attributes["LastUpgradeCheck"] = upgrade_check_project_version - project_attributes["LastTestingUpgradeCheck"] = ( - upgrade_check_project_version - ) - project_attributes["LastSwiftUpdateCheck"] = upgrade_check_project_version - pbxp.SetProperty("attributes", project_attributes) - - # Add gyp/gypi files to project - if not generator_flags.get("standalone"): - main_group = pbxp.GetProperty("mainGroup") - build_group = gyp.xcodeproj_file.PBXGroup({"name": "Build"}) - main_group.AppendChild(build_group) - for included_file in build_file_dict["included_files"]: - build_group.AddOrGetFileByPath(included_file, False) - - xcode_targets = {} - xcode_target_to_target_dict = {} - for qualified_target in target_list: - [build_file, target_name, _toolset] = gyp.common.ParseQualifiedTarget( - qualified_target - ) - - spec = target_dicts[qualified_target] - if spec["toolset"] != "target": - raise Exception( - "Multiple toolsets not supported in xcode build (target %s)" - % qualified_target - ) - configuration_names = [spec["default_configuration"]] - for configuration_name in sorted(spec["configurations"].keys()): - if configuration_name not in configuration_names: - configuration_names.append(configuration_name) - xcp = xcode_projects[build_file] - pbxp = xcp.project - - # Set up the configurations for the target according to the list of names - # supplied. - xccl = CreateXCConfigurationList(configuration_names) - - # Create an XCTarget subclass object for the target. The type with - # "+bundle" appended will be used if the target has "mac_bundle" set. - # loadable_modules not in a mac_bundle are mapped to - # com.googlecode.gyp.xcode.bundle, a pseudo-type that xcode.py interprets - # to create a single-file mh_bundle. - _types = { - "executable": "com.apple.product-type.tool", - "loadable_module": "com.googlecode.gyp.xcode.bundle", - "shared_library": "com.apple.product-type.library.dynamic", - "static_library": "com.apple.product-type.library.static", - "mac_kernel_extension": "com.apple.product-type.kernel-extension", - "executable+bundle": "com.apple.product-type.application", - "loadable_module+bundle": "com.apple.product-type.bundle", - "loadable_module+xctest": "com.apple.product-type.bundle.unit-test", - "loadable_module+xcuitest": "com.apple.product-type.bundle.ui-testing", - "shared_library+bundle": "com.apple.product-type.framework", - "executable+extension+bundle": "com.apple.product-type.app-extension", - "executable+watch+extension+bundle": "com.apple.product-type.watchkit-extension", # noqa: E501 - "executable+watch+bundle": "com.apple.product-type.application.watchapp", - "mac_kernel_extension+bundle": "com.apple.product-type.kernel-extension", - } - - target_properties = { - "buildConfigurationList": xccl, - "name": target_name, - } - - type = spec["type"] - is_xctest = int(spec.get("mac_xctest_bundle", 0)) - is_xcuitest = int(spec.get("mac_xcuitest_bundle", 0)) - is_bundle = int(spec.get("mac_bundle", 0)) or is_xctest - is_app_extension = int(spec.get("ios_app_extension", 0)) - is_watchkit_extension = int(spec.get("ios_watchkit_extension", 0)) - is_watch_app = int(spec.get("ios_watch_app", 0)) - if type != "none": - type_bundle_key = type - if is_xcuitest: - type_bundle_key += "+xcuitest" - assert type == "loadable_module", ( - "mac_xcuitest_bundle targets must have type loadable_module " - "(target %s)" % target_name - ) - elif is_xctest: - type_bundle_key += "+xctest" - assert type == "loadable_module", ( - "mac_xctest_bundle targets must have type loadable_module " - "(target %s)" % target_name - ) - elif is_app_extension: - assert is_bundle, ( - "ios_app_extension flag requires mac_bundle " - "(target %s)" % target_name - ) - type_bundle_key += "+extension+bundle" - elif is_watchkit_extension: - assert is_bundle, ( - "ios_watchkit_extension flag requires mac_bundle " - "(target %s)" % target_name - ) - type_bundle_key += "+watch+extension+bundle" - elif is_watch_app: - assert is_bundle, ( - "ios_watch_app flag requires mac_bundle (target %s)" % target_name - ) - type_bundle_key += "+watch+bundle" - elif is_bundle: - type_bundle_key += "+bundle" - - xctarget_type = gyp.xcodeproj_file.PBXNativeTarget - try: - target_properties["productType"] = _types[type_bundle_key] - except KeyError as e: - gyp.common.ExceptionAppend( - e, - "-- unknown product type while writing target %s" % target_name, - ) - raise - else: - xctarget_type = gyp.xcodeproj_file.PBXAggregateTarget - assert not is_bundle, ( - 'mac_bundle targets cannot have type none (target "%s")' % target_name - ) - assert not is_xcuitest, ( - 'mac_xcuitest_bundle targets cannot have type none (target "%s")' - % target_name - ) - assert not is_xctest, ( - 'mac_xctest_bundle targets cannot have type none (target "%s")' - % target_name - ) - - target_product_name = spec.get("product_name") - if target_product_name is not None: - target_properties["productName"] = target_product_name - - xct = xctarget_type( - target_properties, - parent=pbxp, - force_outdir=spec.get("product_dir"), - force_prefix=spec.get("product_prefix"), - force_extension=spec.get("product_extension"), - ) - pbxp.AppendProperty("targets", xct) - xcode_targets[qualified_target] = xct - xcode_target_to_target_dict[xct] = spec - - spec_actions = spec.get("actions", []) - spec_rules = spec.get("rules", []) - - # Xcode has some "issues" with checking dependencies for the "Compile - # sources" step with any source files/headers generated by actions/rules. - # To work around this, if a target is building anything directly (not - # type "none"), then a second target is used to run the GYP actions/rules - # and is made a dependency of this target. This way the work is done - # before the dependency checks for what should be recompiled. - support_xct = None - # The Xcode "issues" don't affect xcode-ninja builds, since the dependency - # logic all happens in ninja. Don't bother creating the extra targets in - # that case. - if type != "none" and (spec_actions or spec_rules) and not ninja_wrapper: - support_xccl = CreateXCConfigurationList(configuration_names) - support_target_suffix = generator_flags.get( - "support_target_suffix", " Support" - ) - support_target_properties = { - "buildConfigurationList": support_xccl, - "name": target_name + support_target_suffix, - } - if target_product_name: - support_target_properties["productName"] = ( - target_product_name + " Support" - ) - support_xct = gyp.xcodeproj_file.PBXAggregateTarget( - support_target_properties, parent=pbxp - ) - pbxp.AppendProperty("targets", support_xct) - xct.AddDependency(support_xct) - # Hang the support target off the main target so it can be tested/found - # by the generator during Finalize. - xct.support_target = support_xct - - prebuild_index = 0 - - # Add custom shell script phases for "actions" sections. - for action in spec_actions: - # There's no need to write anything into the script to ensure that the - # output directories already exist, because Xcode will look at the - # declared outputs and automatically ensure that they exist for us. - - # Do we have a message to print when this action runs? - message = action.get("message") - if message: - message = "echo note: " + gyp.common.EncodePOSIXShellArgument(message) - else: - message = "" - - # Turn the list into a string that can be passed to a shell. - action_string = gyp.common.EncodePOSIXShellList(action["action"]) - - # Convert Xcode-type variable references to sh-compatible environment - # variable references. - message_sh = gyp.xcodeproj_file.ConvertVariablesToShellSyntax(message) - action_string_sh = gyp.xcodeproj_file.ConvertVariablesToShellSyntax( - action_string - ) - - script = "" - # Include the optional message - if message_sh: - script += message_sh + "\n" - # Be sure the script runs in exec, and that if exec fails, the script - # exits signalling an error. - script += "exec " + action_string_sh + "\nexit 1\n" - ssbp = gyp.xcodeproj_file.PBXShellScriptBuildPhase( - { - "inputPaths": action["inputs"], - "name": 'Action "' + action["action_name"] + '"', - "outputPaths": action["outputs"], - "shellScript": script, - "showEnvVarsInLog": 0, - } - ) - - if support_xct: - support_xct.AppendProperty("buildPhases", ssbp) - else: - # TODO(mark): this assumes too much knowledge of the internals of - # xcodeproj_file; some of these smarts should move into xcodeproj_file - # itself. - xct._properties["buildPhases"].insert(prebuild_index, ssbp) - prebuild_index = prebuild_index + 1 - - # TODO(mark): Should verify that at most one of these is specified. - if int(action.get("process_outputs_as_sources", False)): - for output in action["outputs"]: - AddSourceToTarget(output, type, pbxp, xct) - - if int(action.get("process_outputs_as_mac_bundle_resources", False)): - for output in action["outputs"]: - AddResourceToTarget(output, pbxp, xct) - - # tgt_mac_bundle_resources holds the list of bundle resources so - # the rule processing can check against it. - if is_bundle: - tgt_mac_bundle_resources = spec.get("mac_bundle_resources", []) - else: - tgt_mac_bundle_resources = [] - - # Add custom shell script phases driving "make" for "rules" sections. - # - # Xcode's built-in rule support is almost powerful enough to use directly, - # but there are a few significant deficiencies that render them unusable. - # There are workarounds for some of its inadequacies, but in aggregate, - # the workarounds added complexity to the generator, and some workarounds - # actually require input files to be crafted more carefully than I'd like. - # Consequently, until Xcode rules are made more capable, "rules" input - # sections will be handled in Xcode output by shell script build phases - # performed prior to the compilation phase. - # - # The following problems with Xcode rules were found. The numbers are - # Apple radar IDs. I hope that these shortcomings are addressed, I really - # liked having the rules handled directly in Xcode during the period that - # I was prototyping this. - # - # 6588600 Xcode compiles custom script rule outputs too soon, compilation - # fails. This occurs when rule outputs from distinct inputs are - # interdependent. The only workaround is to put rules and their - # inputs in a separate target from the one that compiles the rule - # outputs. This requires input file cooperation and it means that - # process_outputs_as_sources is unusable. - # 6584932 Need to declare that custom rule outputs should be excluded from - # compilation. A possible workaround is to lie to Xcode about a - # rule's output, giving it a dummy file it doesn't know how to - # compile. The rule action script would need to touch the dummy. - # 6584839 I need a way to declare additional inputs to a custom rule. - # A possible workaround is a shell script phase prior to - # compilation that touches a rule's primary input files if any - # would-be additional inputs are newer than the output. Modifying - # the source tree - even just modification times - feels dirty. - # 6564240 Xcode "custom script" build rules always dump all environment - # variables. This is a low-priority problem and is not a - # show-stopper. - rules_by_ext = {} - for rule in spec_rules: - rules_by_ext[rule["extension"]] = rule - - # First, some definitions: - # - # A "rule source" is a file that was listed in a target's "sources" - # list and will have a rule applied to it on the basis of matching the - # rule's "extensions" attribute. Rule sources are direct inputs to - # rules. - # - # Rule definitions may specify additional inputs in their "inputs" - # attribute. These additional inputs are used for dependency tracking - # purposes. - # - # A "concrete output" is a rule output with input-dependent variables - # resolved. For example, given a rule with: - # 'extension': 'ext', 'outputs': ['$(INPUT_FILE_BASE).cc'], - # if the target's "sources" list contained "one.ext" and "two.ext", - # the "concrete output" for rule input "two.ext" would be "two.cc". If - # a rule specifies multiple outputs, each input file that the rule is - # applied to will have the same number of concrete outputs. - # - # If any concrete outputs are outdated or missing relative to their - # corresponding rule_source or to any specified additional input, the - # rule action must be performed to generate the concrete outputs. - - # concrete_outputs_by_rule_source will have an item at the same index - # as the rule['rule_sources'] that it corresponds to. Each item is a - # list of all of the concrete outputs for the rule_source. - concrete_outputs_by_rule_source = [] - - # concrete_outputs_all is a flat list of all concrete outputs that this - # rule is able to produce, given the known set of input files - # (rule_sources) that apply to it. - concrete_outputs_all = [] - - # messages & actions are keyed by the same indices as rule['rule_sources'] - # and concrete_outputs_by_rule_source. They contain the message and - # action to perform after resolving input-dependent variables. The - # message is optional, in which case None is stored for each rule source. - messages = [] - actions = [] - - for rule_source in rule.get("rule_sources", []): - rule_source_dirname, rule_source_basename = posixpath.split(rule_source) - (rule_source_root, rule_source_ext) = posixpath.splitext( - rule_source_basename - ) - - # These are the same variable names that Xcode uses for its own native - # rule support. Because Xcode's rule engine is not being used, they - # need to be expanded as they are written to the makefile. - rule_input_dict = { - "INPUT_FILE_BASE": rule_source_root, - "INPUT_FILE_SUFFIX": rule_source_ext, - "INPUT_FILE_NAME": rule_source_basename, - "INPUT_FILE_PATH": rule_source, - "INPUT_FILE_DIRNAME": rule_source_dirname, - } - - concrete_outputs_for_this_rule_source = [] - for output in rule.get("outputs", []): - # Fortunately, Xcode and make both use $(VAR) format for their - # variables, so the expansion is the only transformation necessary. - # Any remaining $(VAR)-type variables in the string can be given - # directly to make, which will pick up the correct settings from - # what Xcode puts into the environment. - concrete_output = ExpandXcodeVariables(output, rule_input_dict) - concrete_outputs_for_this_rule_source.append(concrete_output) - - # Add all concrete outputs to the project. - pbxp.AddOrGetFileInRootGroup(concrete_output) - - concrete_outputs_by_rule_source.append( - concrete_outputs_for_this_rule_source - ) - concrete_outputs_all.extend(concrete_outputs_for_this_rule_source) - - # TODO(mark): Should verify that at most one of these is specified. - if int(rule.get("process_outputs_as_sources", False)): - for output in concrete_outputs_for_this_rule_source: - AddSourceToTarget(output, type, pbxp, xct) - - # If the file came from the mac_bundle_resources list or if the rule - # is marked to process outputs as bundle resource, do so. - was_mac_bundle_resource = rule_source in tgt_mac_bundle_resources - if was_mac_bundle_resource or int( - rule.get("process_outputs_as_mac_bundle_resources", False) - ): - for output in concrete_outputs_for_this_rule_source: - AddResourceToTarget(output, pbxp, xct) - - # Do we have a message to print when this rule runs? - message = rule.get("message") - if message: - message = gyp.common.EncodePOSIXShellArgument(message) - message = ExpandXcodeVariables(message, rule_input_dict) - messages.append(message) - - # Turn the list into a string that can be passed to a shell. - action_string = gyp.common.EncodePOSIXShellList(rule["action"]) - - action = ExpandXcodeVariables(action_string, rule_input_dict) - actions.append(action) - - if len(concrete_outputs_all) > 0: - # TODO(mark): There's a possibility for collision here. Consider - # target "t" rule "A_r" and target "t_A" rule "r". - makefile_name = "%s.make" % re.sub( - "[^a-zA-Z0-9_]", "_", "{}_{}".format(target_name, rule["rule_name"]) - ) - makefile_path = os.path.join( - xcode_projects[build_file].path, makefile_name - ) - # TODO(mark): try/close? Write to a temporary file and swap it only - # if it's got changes? - makefile = open(makefile_path, "w") - - # make will build the first target in the makefile by default. By - # convention, it's called "all". List all (or at least one) - # concrete output for each rule source as a prerequisite of the "all" - # target. - makefile.write("all: \\\n") - for concrete_output_index, concrete_output_by_rule_source in enumerate( - concrete_outputs_by_rule_source - ): - # Only list the first (index [0]) concrete output of each input - # in the "all" target. Otherwise, a parallel make (-j > 1) would - # attempt to process each input multiple times simultaneously. - # Otherwise, "all" could just contain the entire list of - # concrete_outputs_all. - concrete_output = concrete_output_by_rule_source[0] - if ( - concrete_output_index - == len(concrete_outputs_by_rule_source) - 1 - ): - eol = "" - else: - eol = " \\" - makefile.write(f" {concrete_output}{eol}\n") - - for rule_source, concrete_outputs, message, action in zip( - rule["rule_sources"], - concrete_outputs_by_rule_source, - messages, - actions, - ): - makefile.write("\n") - - # Add a rule that declares it can build each concrete output of a - # rule source. Collect the names of the directories that are - # required. - concrete_output_dirs = [] - for concrete_output_index, concrete_output in enumerate( - concrete_outputs - ): - bol = "" if concrete_output_index == 0 else " " - makefile.write(f"{bol}{concrete_output} \\\n") - - concrete_output_dir = posixpath.dirname(concrete_output) - if ( - concrete_output_dir - and concrete_output_dir not in concrete_output_dirs - ): - concrete_output_dirs.append(concrete_output_dir) - - makefile.write(" : \\\n") - - # The prerequisites for this rule are the rule source itself and - # the set of additional rule inputs, if any. - prerequisites = [rule_source] - prerequisites.extend(rule.get("inputs", [])) - for prerequisite_index, prerequisite in enumerate(prerequisites): - if prerequisite_index == len(prerequisites) - 1: - eol = "" - else: - eol = " \\" - makefile.write(f" {prerequisite}{eol}\n") - - # Make sure that output directories exist before executing the rule - # action. - if len(concrete_output_dirs) > 0: - makefile.write( - '\t@mkdir -p "%s"\n' % '" "'.join(concrete_output_dirs) - ) - - # The rule message and action have already had - # the necessary variable substitutions performed. - if message: - # Mark it with note: so Xcode picks it up in build output. - makefile.write("\t@echo note: %s\n" % message) - makefile.write("\t%s\n" % action) - - makefile.close() - - # It might be nice to ensure that needed output directories exist - # here rather than in each target in the Makefile, but that wouldn't - # work if there ever was a concrete output that had an input-dependent - # variable anywhere other than in the leaf position. - - # Don't declare any inputPaths or outputPaths. If they're present, - # Xcode will provide a slight optimization by only running the script - # phase if any output is missing or outdated relative to any input. - # Unfortunately, it will also assume that all outputs are touched by - # the script, and if the outputs serve as files in a compilation - # phase, they will be unconditionally rebuilt. Since make might not - # rebuild everything that could be declared here as an output, this - # extra compilation activity is unnecessary. With inputPaths and - # outputPaths not supplied, make will always be called, but it knows - # enough to not do anything when everything is up-to-date. - - # To help speed things up, pass -j COUNT to make so it does some work - # in parallel. Don't use ncpus because Xcode will build ncpus targets - # in parallel and if each target happens to have a rules step, there - # would be ncpus^2 things going. With a machine that has 2 quad-core - # Xeons, a build can quickly run out of processes based on - # scheduling/other tasks, and randomly failing builds are no good. - script = ( - """JOB_COUNT="$(/usr/sbin/sysctl -n hw.ncpu)" -if [ "${JOB_COUNT}" -gt 4 ]; then - JOB_COUNT=4 -fi -exec xcrun make -f "${PROJECT_FILE_PATH}/%s" -j "${JOB_COUNT}" -exit 1 -""" - % makefile_name - ) - ssbp = gyp.xcodeproj_file.PBXShellScriptBuildPhase( - { - "name": 'Rule "' + rule["rule_name"] + '"', - "shellScript": script, - "showEnvVarsInLog": 0, - } - ) - - if support_xct: - support_xct.AppendProperty("buildPhases", ssbp) - else: - # TODO(mark): this assumes too much knowledge of the internals of - # xcodeproj_file; some of these smarts should move - # into xcodeproj_file itself. - xct._properties["buildPhases"].insert(prebuild_index, ssbp) - prebuild_index = prebuild_index + 1 - - # Extra rule inputs also go into the project file. Concrete outputs were - # already added when they were computed. - groups = ["inputs", "inputs_excluded"] - if skip_excluded_files: - groups = [x for x in groups if not x.endswith("_excluded")] - for group in groups: - for item in rule.get(group, []): - pbxp.AddOrGetFileInRootGroup(item) - - # Add "sources". - for source in spec.get("sources", []): - (_source_root, source_extension) = posixpath.splitext(source) - if source_extension[1:] not in rules_by_ext: - # AddSourceToTarget will add the file to a root group if it's not - # already there. - AddSourceToTarget(source, type, pbxp, xct) - else: - pbxp.AddOrGetFileInRootGroup(source) - - # Add "mac_bundle_resources" and "mac_framework_private_headers" if - # it's a bundle of any type. - if is_bundle: - for resource in tgt_mac_bundle_resources: - (_resource_root, resource_extension) = posixpath.splitext(resource) - if resource_extension[1:] not in rules_by_ext: - AddResourceToTarget(resource, pbxp, xct) - else: - pbxp.AddOrGetFileInRootGroup(resource) - - for header in spec.get("mac_framework_private_headers", []): - AddHeaderToTarget(header, pbxp, xct, False) - - # Add "mac_framework_headers". These can be valid for both frameworks - # and static libraries. - if is_bundle or type == "static_library": - for header in spec.get("mac_framework_headers", []): - AddHeaderToTarget(header, pbxp, xct, True) - - # Add "copies". - pbxcp_dict = {} - for copy_group in spec.get("copies", []): - dest = copy_group["destination"] - if dest[0] not in ("/", "$"): - # Relative paths are relative to $(SRCROOT). - dest = "$(SRCROOT)/" + dest - - code_sign = int(copy_group.get("xcode_code_sign", 0)) - settings = (None, "{ATTRIBUTES = (CodeSignOnCopy, ); }")[code_sign] - - # Coalesce multiple "copies" sections in the same target with the same - # "destination" property into the same PBXCopyFilesBuildPhase, otherwise - # they'll wind up with ID collisions. - pbxcp = pbxcp_dict.get(dest, None) - if pbxcp is None: - pbxcp = gyp.xcodeproj_file.PBXCopyFilesBuildPhase( - {"name": "Copy to " + copy_group["destination"]}, parent=xct - ) - pbxcp.SetDestination(dest) - - # TODO(mark): The usual comment about this knowing too much about - # gyp.xcodeproj_file internals applies. - xct._properties["buildPhases"].insert(prebuild_index, pbxcp) - - pbxcp_dict[dest] = pbxcp - - for file in copy_group["files"]: - pbxcp.AddFile(file, settings) - - # Excluded files can also go into the project file. - if not skip_excluded_files: - for key in [ - "sources", - "mac_bundle_resources", - "mac_framework_headers", - "mac_framework_private_headers", - ]: - excluded_key = key + "_excluded" - for item in spec.get(excluded_key, []): - pbxp.AddOrGetFileInRootGroup(item) - - # So can "inputs" and "outputs" sections of "actions" groups. - groups = ["inputs", "inputs_excluded", "outputs", "outputs_excluded"] - if skip_excluded_files: - groups = [x for x in groups if not x.endswith("_excluded")] - for action in spec.get("actions", []): - for group in groups: - for item in action.get(group, []): - # Exclude anything in BUILT_PRODUCTS_DIR. They're products, not - # sources. - if not item.startswith("$(BUILT_PRODUCTS_DIR)/"): - pbxp.AddOrGetFileInRootGroup(item) - - for postbuild in spec.get("postbuilds", []): - action_string_sh = gyp.common.EncodePOSIXShellList(postbuild["action"]) - script = "exec " + action_string_sh + "\nexit 1\n" - - # Make the postbuild step depend on the output of ld or ar from this - # target. Apparently putting the script step after the link step isn't - # sufficient to ensure proper ordering in all cases. With an input - # declared but no outputs, the script step should run every time, as - # desired. - ssbp = gyp.xcodeproj_file.PBXShellScriptBuildPhase( - { - "inputPaths": ["$(BUILT_PRODUCTS_DIR)/$(EXECUTABLE_PATH)"], - "name": 'Postbuild "' + postbuild["postbuild_name"] + '"', - "shellScript": script, - "showEnvVarsInLog": 0, - } - ) - xct.AppendProperty("buildPhases", ssbp) - - # Add dependencies before libraries, because adding a dependency may imply - # adding a library. It's preferable to keep dependencies listed first - # during a link phase so that they can override symbols that would - # otherwise be provided by libraries, which will usually include system - # libraries. On some systems, ld is finicky and even requires the - # libraries to be ordered in such a way that unresolved symbols in - # earlier-listed libraries may only be resolved by later-listed libraries. - # The Mac linker doesn't work that way, but other platforms do, and so - # their linker invocations need to be constructed in this way. There's - # no compelling reason for Xcode's linker invocations to differ. - - if "dependencies" in spec: - for dependency in spec["dependencies"]: - xct.AddDependency(xcode_targets[dependency]) - # The support project also gets the dependencies (in case they are - # needed for the actions/rules to work). - if support_xct: - support_xct.AddDependency(xcode_targets[dependency]) - - if "libraries" in spec: - for library in spec["libraries"]: - xct.FrameworksPhase().AddFile(library) - # Add the library's directory to LIBRARY_SEARCH_PATHS if necessary. - # I wish Xcode handled this automatically. - library_dir = posixpath.dirname(library) - if library_dir not in xcode_standard_library_dirs and ( - not xct.HasBuildSetting(_library_search_paths_var) - or library_dir not in xct.GetBuildSetting(_library_search_paths_var) - ): - xct.AppendBuildSetting(_library_search_paths_var, library_dir) - - for configuration_name in configuration_names: - configuration = spec["configurations"][configuration_name] - xcbc = xct.ConfigurationNamed(configuration_name) - for include_dir in configuration.get("mac_framework_dirs", []): - xcbc.AppendBuildSetting("FRAMEWORK_SEARCH_PATHS", include_dir) - for include_dir in configuration.get("include_dirs", []): - xcbc.AppendBuildSetting("HEADER_SEARCH_PATHS", include_dir) - for library_dir in configuration.get("library_dirs", []): - if library_dir not in xcode_standard_library_dirs and ( - not xcbc.HasBuildSetting(_library_search_paths_var) - or library_dir - not in xcbc.GetBuildSetting(_library_search_paths_var) - ): - xcbc.AppendBuildSetting(_library_search_paths_var, library_dir) - - if "defines" in configuration: - for define in configuration["defines"]: - set_define = EscapeXcodeDefine(define) - xcbc.AppendBuildSetting("GCC_PREPROCESSOR_DEFINITIONS", set_define) - if "xcode_settings" in configuration: - for xck, xcv in configuration["xcode_settings"].items(): - xcbc.SetBuildSetting(xck, xcv) - if "xcode_config_file" in configuration: - config_ref = pbxp.AddOrGetFileInRootGroup( - configuration["xcode_config_file"] - ) - xcbc.SetBaseConfiguration(config_ref) - - build_files = [] - for build_file, build_file_dict in data.items(): - if build_file.endswith(".gyp"): - build_files.append(build_file) - - for build_file in build_files: - xcode_projects[build_file].Finalize1(xcode_targets, serialize_all_tests) - - for build_file in build_files: - xcode_projects[build_file].Finalize2(xcode_targets, xcode_target_to_target_dict) - - for build_file in build_files: - xcode_projects[build_file].Write() diff --git a/tools/gyp/pylib/gyp/generator/xcode_test.py b/tools/gyp/pylib/gyp/generator/xcode_test.py deleted file mode 100644 index bfd8c587a31..00000000000 --- a/tools/gyp/pylib/gyp/generator/xcode_test.py +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env python3 - -# Copyright (c) 2013 Google Inc. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Unit tests for the xcode.py file.""" - -import sys -import unittest - -from gyp.generator import xcode - - -class TestEscapeXcodeDefine(unittest.TestCase): - if sys.platform == "darwin": - - def test_InheritedRemainsUnescaped(self): - self.assertEqual(xcode.EscapeXcodeDefine("$(inherited)"), "$(inherited)") - - def test_Escaping(self): - self.assertEqual(xcode.EscapeXcodeDefine('a b"c\\'), 'a\\ b\\"c\\\\') - - -if __name__ == "__main__": - unittest.main() diff --git a/tools/gyp/pylib/gyp/input.py b/tools/gyp/pylib/gyp/input.py deleted file mode 100644 index f3a5e168f20..00000000000 --- a/tools/gyp/pylib/gyp/input.py +++ /dev/null @@ -1,3097 +0,0 @@ -# Copyright (c) 2012 Google Inc. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - - -import ast -import multiprocessing -import os.path -import re -import shlex -import signal -import subprocess -import sys -import threading -import traceback - -from packaging.version import Version - -import gyp.common -import gyp.simple_copy -from gyp.common import GypError, OrderedSet - -# A list of types that are treated as linkable. -linkable_types = [ - "executable", - "shared_library", - "loadable_module", - "mac_kernel_extension", - "windows_driver", -] - -# A list of sections that contain links to other targets. -dependency_sections = ["dependencies", "export_dependent_settings"] - -# base_path_sections is a list of sections defined by GYP that contain -# pathnames. The generators can provide more keys, the two lists are merged -# into path_sections, but you should call IsPathSection instead of using either -# list directly. -base_path_sections = [ - "destination", - "files", - "include_dirs", - "inputs", - "libraries", - "outputs", - "sources", -] -path_sections = set() - -# These per-process dictionaries are used to cache build file data when loading -# in parallel mode. -per_process_data = {} -per_process_aux_data = {} - - -def IsPathSection(section): - # If section ends in one of the '=+?!' characters, it's applied to a section - # without the trailing characters. '/' is notably absent from this list, - # because there's no way for a regular expression to be treated as a path. - while section and section[-1:] in "=+?!": - section = section[:-1] - - if section in path_sections: - return True - - # Sections matching the regexp '_(dir|file|path)s?$' are also - # considered PathSections. Using manual string matching since that - # is much faster than the regexp and this can be called hundreds of - # thousands of times so micro performance matters. - if "_" in section: - tail = section[-6:] - if tail[-1] == "s": - tail = tail[:-1] - if tail[-5:] in ("_file", "_path"): - return True - return tail[-4:] == "_dir" - - return False - - -# base_non_configuration_keys is a list of key names that belong in the target -# itself and should not be propagated into its configurations. It is merged -# with a list that can come from the generator to -# create non_configuration_keys. -base_non_configuration_keys = [ - # Sections that must exist inside targets and not configurations. - "actions", - "configurations", - "copies", - "default_configuration", - "dependencies", - "dependencies_original", - "libraries", - "postbuilds", - "product_dir", - "product_extension", - "product_name", - "product_prefix", - "rules", - "run_as", - "sources", - "standalone_static_library", - "suppress_wildcard", - "target_name", - "toolset", - "toolsets", - "type", - # Sections that can be found inside targets or configurations, but that - # should not be propagated from targets into their configurations. - "variables", -] -non_configuration_keys = [] - -# Keys that do not belong inside a configuration dictionary. -invalid_configuration_keys = [ - "actions", - "all_dependent_settings", - "configurations", - "dependencies", - "direct_dependent_settings", - "libraries", - "link_settings", - "sources", - "standalone_static_library", - "target_name", - "type", -] - -# Controls whether or not the generator supports multiple toolsets. -multiple_toolsets = False - -# Paths for converting filelist paths to output paths: { -# toplevel, -# qualified_output_dir, -# } -generator_filelist_paths = None - - -def GetIncludedBuildFiles(build_file_path, aux_data, included=None): - """Return a list of all build files included into build_file_path. - - The returned list will contain build_file_path as well as all other files - that it included, either directly or indirectly. Note that the list may - contain files that were included into a conditional section that evaluated - to false and was not merged into build_file_path's dict. - - aux_data is a dict containing a key for each build file or included build - file. Those keys provide access to dicts whose "included" keys contain - lists of all other files included by the build file. - - included should be left at its default None value by external callers. It - is used for recursion. - - The returned list will not contain any duplicate entries. Each build file - in the list will be relative to the current directory. - """ - - if included is None: - included = [] - - if build_file_path in included: - return included - - included.append(build_file_path) - - for included_build_file in aux_data[build_file_path].get("included", []): - GetIncludedBuildFiles(included_build_file, aux_data, included) - - return included - - -def CheckedEval(file_contents): - """Return the eval of a gyp file. - The gyp file is restricted to dictionaries and lists only, and - repeated keys are not allowed. - Note that this is slower than eval() is. - """ - - syntax_tree = ast.parse(file_contents) - assert isinstance(syntax_tree, ast.Module) - c1 = syntax_tree.body - assert len(c1) == 1 - c2 = c1[0] - assert isinstance(c2, ast.Expr) - return CheckNode(c2.value, []) - - -def CheckNode(node, keypath): - if isinstance(node, ast.Dict): - dict = {} - for key, value in zip(node.keys, node.values): - assert isinstance(key, ast.Str) - key = key.s - if key in dict: - raise GypError( - "Key '" - + key - + "' repeated at level " - + repr(len(keypath) + 1) - + " with key path '" - + ".".join(keypath) - + "'" - ) - kp = list(keypath) # Make a copy of the list for descending this node. - kp.append(key) - dict[key] = CheckNode(value, kp) - return dict - elif isinstance(node, ast.List): - children = [] - for index, child in enumerate(node.elts): - kp = list(keypath) # Copy list. - kp.append(repr(index)) - children.append(CheckNode(child, kp)) - return children - elif isinstance(node, ast.Str): - return node.s - else: - raise TypeError( - "Unknown AST node at key path '" + ".".join(keypath) + "': " + repr(node) - ) - - -def LoadOneBuildFile(build_file_path, data, aux_data, includes, is_target, check): - if build_file_path in data: - return data[build_file_path] - - if os.path.exists(build_file_path): - build_file_contents = open(build_file_path, encoding="utf-8").read() - else: - raise GypError(f"{build_file_path} not found (cwd: {os.getcwd()})") - - build_file_data = None - try: - if check: - build_file_data = CheckedEval(build_file_contents) - else: - build_file_data = eval(build_file_contents, {"__builtins__": {}}, None) - except SyntaxError as e: - e.filename = build_file_path - raise - except Exception as e: - gyp.common.ExceptionAppend(e, "while reading " + build_file_path) - raise - - if not isinstance(build_file_data, dict): - raise GypError("%s does not evaluate to a dictionary." % build_file_path) - - data[build_file_path] = build_file_data - aux_data[build_file_path] = {} - - # Scan for includes and merge them in. - if "skip_includes" not in build_file_data or not build_file_data["skip_includes"]: - try: - if is_target: - LoadBuildFileIncludesIntoDict( - build_file_data, build_file_path, data, aux_data, includes, check - ) - else: - LoadBuildFileIncludesIntoDict( - build_file_data, build_file_path, data, aux_data, None, check - ) - except Exception as e: - gyp.common.ExceptionAppend( - e, "while reading includes of " + build_file_path - ) - raise - - return build_file_data - - -def LoadBuildFileIncludesIntoDict( - subdict, subdict_path, data, aux_data, includes, check -): - includes_list = [] - if includes is not None: - includes_list.extend(includes) - if "includes" in subdict: - for include in subdict["includes"]: - # "include" is specified relative to subdict_path, so compute the real - # path to include by appending the provided "include" to the directory - # in which subdict_path resides. - relative_include = os.path.normpath( - os.path.join(os.path.dirname(subdict_path), include) - ) - includes_list.append(relative_include) - # Unhook the includes list, it's no longer needed. - del subdict["includes"] - - # Merge in the included files. - for include in includes_list: - if "included" not in aux_data[subdict_path]: - aux_data[subdict_path]["included"] = [] - aux_data[subdict_path]["included"].append(include) - - gyp.DebugOutput(gyp.DEBUG_INCLUDES, "Loading Included File: '%s'", include) - - MergeDicts( - subdict, - LoadOneBuildFile(include, data, aux_data, None, False, check), - subdict_path, - include, - ) - - # Recurse into subdictionaries. - for k, v in subdict.items(): - if isinstance(v, dict): - LoadBuildFileIncludesIntoDict(v, subdict_path, data, aux_data, None, check) - elif isinstance(v, list): - LoadBuildFileIncludesIntoList(v, subdict_path, data, aux_data, check) - - -# This recurses into lists so that it can look for dicts. -def LoadBuildFileIncludesIntoList(sublist, sublist_path, data, aux_data, check): - for item in sublist: - if isinstance(item, dict): - LoadBuildFileIncludesIntoDict( - item, sublist_path, data, aux_data, None, check - ) - elif isinstance(item, list): - LoadBuildFileIncludesIntoList(item, sublist_path, data, aux_data, check) - - -# Processes toolsets in all the targets. This recurses into condition entries -# since they can contain toolsets as well. -def ProcessToolsetsInDict(data): - if "targets" in data: - target_list = data["targets"] - new_target_list = [] - for target in target_list: - # If this target already has an explicit 'toolset', and no 'toolsets' - # list, don't modify it further. - if "toolset" in target and "toolsets" not in target: - new_target_list.append(target) - continue - if multiple_toolsets: - toolsets = target.get("toolsets", ["target"]) - else: - toolsets = ["target"] - # Make sure this 'toolsets' definition is only processed once. - if "toolsets" in target: - del target["toolsets"] - if len(toolsets) > 0: - # Optimization: only do copies if more than one toolset is specified. - for build in toolsets[1:]: - new_target = gyp.simple_copy.deepcopy(target) - new_target["toolset"] = build - new_target_list.append(new_target) - target["toolset"] = toolsets[0] - new_target_list.append(target) - data["targets"] = new_target_list - if "conditions" in data: - for condition in data["conditions"]: - if isinstance(condition, list): - for condition_dict in condition[1:]: - if isinstance(condition_dict, dict): - ProcessToolsetsInDict(condition_dict) - - -# TODO(mark): I don't love this name. It just means that it's going to load -# a build file that contains targets and is expected to provide a targets dict -# that contains the targets... -def LoadTargetBuildFile( - build_file_path, - data, - aux_data, - variables, - includes, - depth, - check, - load_dependencies, -): - # If depth is set, predefine the DEPTH variable to be a relative path from - # this build file's directory to the directory identified by depth. - if depth: - # TODO(dglazkov) The backslash/forward-slash replacement at the end is a - # temporary measure. This should really be addressed by keeping all paths - # in POSIX until actual project generation. - d = gyp.common.RelativePath(depth, os.path.dirname(build_file_path)) - if d == "": - variables["DEPTH"] = "." - else: - variables["DEPTH"] = d.replace("\\", "/") - - # The 'target_build_files' key is only set when loading target build files in - # the non-parallel code path, where LoadTargetBuildFile is called - # recursively. In the parallel code path, we don't need to check whether the - # |build_file_path| has already been loaded, because the 'scheduled' set in - # ParallelState guarantees that we never load the same |build_file_path| - # twice. - if "target_build_files" in data: - if build_file_path in data["target_build_files"]: - # Already loaded. - return False - data["target_build_files"].add(build_file_path) - - gyp.DebugOutput( - gyp.DEBUG_INCLUDES, "Loading Target Build File '%s'", build_file_path - ) - - build_file_data = LoadOneBuildFile( - build_file_path, data, aux_data, includes, True, check - ) - - # Store DEPTH for later use in generators. - build_file_data["_DEPTH"] = depth - - # Set up the included_files key indicating which .gyp files contributed to - # this target dict. - if "included_files" in build_file_data: - raise GypError(build_file_path + " must not contain included_files key") - - included = GetIncludedBuildFiles(build_file_path, aux_data) - build_file_data["included_files"] = [] - for included_file in included: - # included_file is relative to the current directory, but it needs to - # be made relative to build_file_path's directory. - included_relative = gyp.common.RelativePath( - included_file, os.path.dirname(build_file_path) - ) - build_file_data["included_files"].append(included_relative) - - # Do a first round of toolsets expansion so that conditions can be defined - # per toolset. - ProcessToolsetsInDict(build_file_data) - - # Apply "pre"/"early" variable expansions and condition evaluations. - ProcessVariablesAndConditionsInDict( - build_file_data, PHASE_EARLY, variables, build_file_path - ) - - # Since some toolsets might have been defined conditionally, perform - # a second round of toolsets expansion now. - ProcessToolsetsInDict(build_file_data) - - # Look at each project's target_defaults dict, and merge settings into - # targets. - if "target_defaults" in build_file_data: - if "targets" not in build_file_data: - raise GypError("Unable to find targets in build file %s" % build_file_path) - - index = 0 - while index < len(build_file_data["targets"]): - # This procedure needs to give the impression that target_defaults is - # used as defaults, and the individual targets inherit from that. - # The individual targets need to be merged into the defaults. Make - # a deep copy of the defaults for each target, merge the target dict - # as found in the input file into that copy, and then hook up the - # copy with the target-specific data merged into it as the replacement - # target dict. - old_target_dict = build_file_data["targets"][index] - new_target_dict = gyp.simple_copy.deepcopy( - build_file_data["target_defaults"] - ) - MergeDicts( - new_target_dict, old_target_dict, build_file_path, build_file_path - ) - build_file_data["targets"][index] = new_target_dict - index += 1 - - # No longer needed. - del build_file_data["target_defaults"] - - # Look for dependencies. This means that dependency resolution occurs - # after "pre" conditionals and variable expansion, but before "post" - - # in other words, you can't put a "dependencies" section inside a "post" - # conditional within a target. - - dependencies = [] - if "targets" in build_file_data: - for target_dict in build_file_data["targets"]: - if "dependencies" not in target_dict: - continue - for dependency in target_dict["dependencies"]: - dependencies.append( - gyp.common.ResolveTarget(build_file_path, dependency, None)[0] - ) - - if load_dependencies: - for dependency in dependencies: - try: - LoadTargetBuildFile( - dependency, - data, - aux_data, - variables, - includes, - depth, - check, - load_dependencies, - ) - except Exception as e: - gyp.common.ExceptionAppend( - e, "while loading dependencies of %s" % build_file_path - ) - raise - else: - return (build_file_path, dependencies) - - -def CallLoadTargetBuildFile( - global_flags, - build_file_path, - variables, - includes, - depth, - check, - generator_input_info, -): - """Wrapper around LoadTargetBuildFile for parallel processing. - - This wrapper is used when LoadTargetBuildFile is executed in - a worker process. - """ - - try: - signal.signal(signal.SIGINT, signal.SIG_IGN) - - # Apply globals so that the worker process behaves the same. - for key, value in global_flags.items(): - globals()[key] = value - - SetGeneratorGlobals(generator_input_info) - result = LoadTargetBuildFile( - build_file_path, - per_process_data, - per_process_aux_data, - variables, - includes, - depth, - check, - False, - ) - if not result: - return result - - (build_file_path, dependencies) = result - - # We can safely pop the build_file_data from per_process_data because it - # will never be referenced by this process again, so we don't need to keep - # it in the cache. - build_file_data = per_process_data.pop(build_file_path) - - # This gets serialized and sent back to the main process via a pipe. - # It's handled in LoadTargetBuildFileCallback. - return (build_file_path, build_file_data, dependencies) - except GypError as e: - sys.stderr.write("gyp: %s\n" % e) - return None - except Exception as e: - print("Exception:", e, file=sys.stderr) - print(traceback.format_exc(), file=sys.stderr) - return None - - -class ParallelProcessingError(Exception): - pass - - -class ParallelState: - """Class to keep track of state when processing input files in parallel. - - If build files are loaded in parallel, use this to keep track of - state during farming out and processing parallel jobs. It's stored - in a global so that the callback function can have access to it. - """ - - def __init__(self): - # The multiprocessing pool. - self.pool = None - # The condition variable used to protect this object and notify - # the main loop when there might be more data to process. - self.condition = None - # The "data" dict that was passed to LoadTargetBuildFileParallel - self.data = None - # The number of parallel calls outstanding; decremented when a response - # was received. - self.pending = 0 - # The set of all build files that have been scheduled, so we don't - # schedule the same one twice. - self.scheduled = set() - # A list of dependency build file paths that haven't been scheduled yet. - self.dependencies = [] - # Flag to indicate if there was an error in a child process. - self.error = False - - def LoadTargetBuildFileCallback(self, result): - """Handle the results of running LoadTargetBuildFile in another process.""" - self.condition.acquire() - if not result: - self.error = True - self.condition.notify() - self.condition.release() - return - (build_file_path0, build_file_data0, dependencies0) = result - self.data[build_file_path0] = build_file_data0 - self.data["target_build_files"].add(build_file_path0) - for new_dependency in dependencies0: - if new_dependency not in self.scheduled: - self.scheduled.add(new_dependency) - self.dependencies.append(new_dependency) - self.pending -= 1 - self.condition.notify() - self.condition.release() - - -def LoadTargetBuildFilesParallel( - build_files, data, variables, includes, depth, check, generator_input_info -): - parallel_state = ParallelState() - parallel_state.condition = threading.Condition() - # Make copies of the build_files argument that we can modify while working. - parallel_state.dependencies = list(build_files) - parallel_state.scheduled = set(build_files) - parallel_state.pending = 0 - parallel_state.data = data - - try: - parallel_state.condition.acquire() - while parallel_state.dependencies or parallel_state.pending: - if parallel_state.error: - break - if not parallel_state.dependencies: - parallel_state.condition.wait() - continue - - dependency = parallel_state.dependencies.pop() - - parallel_state.pending += 1 - global_flags = { - "path_sections": globals()["path_sections"], - "non_configuration_keys": globals()["non_configuration_keys"], - "multiple_toolsets": globals()["multiple_toolsets"], - } - - if not parallel_state.pool: - parallel_state.pool = multiprocessing.Pool(multiprocessing.cpu_count()) - parallel_state.pool.apply_async( - CallLoadTargetBuildFile, - args=( - global_flags, - dependency, - variables, - includes, - depth, - check, - generator_input_info, - ), - callback=parallel_state.LoadTargetBuildFileCallback, - ) - except KeyboardInterrupt as e: - parallel_state.pool.terminate() - raise e - - parallel_state.condition.release() - - parallel_state.pool.close() - parallel_state.pool.join() - parallel_state.pool = None - - if parallel_state.error: - sys.exit(1) - - -# Look for the bracket that matches the first bracket seen in a -# string, and return the start and end as a tuple. For example, if -# the input is something like "<(foo <(bar)) blah", then it would -# return (1, 13), indicating the entire string except for the leading -# "<" and trailing " blah". -LBRACKETS = set("{[(") -BRACKETS = {"}": "{", "]": "[", ")": "("} - - -def FindEnclosingBracketGroup(input_str): - stack = [] - start = -1 - for index, char in enumerate(input_str): - if char in LBRACKETS: - stack.append(char) - if start == -1: - start = index - elif char in BRACKETS: - if not stack: - return (-1, -1) - if stack.pop() != BRACKETS[char]: - return (-1, -1) - if not stack: - return (start, index + 1) - return (-1, -1) - - -def IsStrCanonicalInt(string): - """Returns True if |string| is in its canonical integer form. - - The canonical form is such that str(int(string)) == string. - """ - if isinstance(string, str): - # This function is called a lot so for maximum performance, avoid - # involving regexps which would otherwise make the code much - # shorter. Regexps would need twice the time of this function. - if string: - if string == "0": - return True - if string[0] == "-": - string = string[1:] - if not string: - return False - if "1" <= string[0] <= "9": - return string.isdigit() - - return False - - -# This matches things like "<(asdf)", "(?P<(?:(?:!?@?)|\|)?)" - r"(?P[-a-zA-Z0-9_.]+)?" - r"\((?P\s*\[?)" - r"(?P.*?)(\]?)\))" -) - -# This matches the same as early_variable_re, but with '>' instead of '<'. -late_variable_re = re.compile( - r"(?P(?P>(?:(?:!?@?)|\|)?)" - r"(?P[-a-zA-Z0-9_.]+)?" - r"\((?P\s*\[?)" - r"(?P.*?)(\]?)\))" -) - -# This matches the same as early_variable_re, but with '^' instead of '<'. -latelate_variable_re = re.compile( - r"(?P(?P[\^](?:(?:!?@?)|\|)?)" - r"(?P[-a-zA-Z0-9_.]+)?" - r"\((?P\s*\[?)" - r"(?P.*?)(\]?)\))" -) - -# Global cache of results from running commands so they don't have to be run -# more then once. -cached_command_results = {} - - -def FixupPlatformCommand(cmd): - if sys.platform == "win32": - if isinstance(cmd, list): - cmd = [re.sub("^cat ", "type ", cmd[0])] + cmd[1:] - else: - cmd = re.sub("^cat ", "type ", cmd) - return cmd - - -PHASE_EARLY = 0 -PHASE_LATE = 1 -PHASE_LATELATE = 2 - - -def ExpandVariables(input, phase, variables, build_file): - # Look for the pattern that gets expanded into variables - if phase == PHASE_EARLY: - variable_re = early_variable_re - expansion_symbol = "<" - elif phase == PHASE_LATE: - variable_re = late_variable_re - expansion_symbol = ">" - elif phase == PHASE_LATELATE: - variable_re = latelate_variable_re - expansion_symbol = "^" - else: - assert False - - input_str = str(input) - if IsStrCanonicalInt(input_str): - return int(input_str) - - # Do a quick scan to determine if an expensive regex search is warranted. - if expansion_symbol not in input_str: - return input_str - - # Get the entire list of matches as a list of MatchObject instances. - # (using findall here would return strings instead of MatchObjects). - matches = list(variable_re.finditer(input_str)) - if not matches: - return input_str - - output = input_str - # Reverse the list of matches so that replacements are done right-to-left. - # That ensures that earlier replacements won't mess up the string in a - # way that causes later calls to find the earlier substituted text instead - # of what's intended for replacement. - matches.reverse() - for match_group in matches: - match = match_group.groupdict() - gyp.DebugOutput(gyp.DEBUG_VARIABLES, "Matches: %r", match) - # match['replace'] is the substring to look for, match['type'] - # is the character code for the replacement type (< > ! <| >| <@ - # >@ !@), match['is_array'] contains a '[' for command - # arrays, and match['content'] is the name of the variable (< >) - # or command to run (!). match['command_string'] is an optional - # command string. Currently, only 'pymod_do_main' is supported. - - # run_command is true if a ! variant is used. - run_command = "!" in match["type"] - command_string = match["command_string"] - - # file_list is true if a | variant is used. - file_list = "|" in match["type"] - - # Capture these now so we can adjust them later. - replace_start = match_group.start("replace") - replace_end = match_group.end("replace") - - # Find the ending paren, and re-evaluate the contained string. - (c_start, c_end) = FindEnclosingBracketGroup(input_str[replace_start:]) - - # Adjust the replacement range to match the entire command - # found by FindEnclosingBracketGroup (since the variable_re - # probably doesn't match the entire command if it contained - # nested variables). - replace_end = replace_start + c_end - - # Find the "real" replacement, matching the appropriate closing - # paren, and adjust the replacement start and end. - replacement = input_str[replace_start:replace_end] - - # Figure out what the contents of the variable parens are. - contents_start = replace_start + c_start + 1 - contents_end = replace_end - 1 - contents = input_str[contents_start:contents_end] - - # Do filter substitution now for <|(). - # Admittedly, this is different than the evaluation order in other - # contexts. However, since filtration has no chance to run on <|(), - # this seems like the only obvious way to give them access to filters. - if file_list: - processed_variables = gyp.simple_copy.deepcopy(variables) - ProcessListFiltersInDict(contents, processed_variables) - # Recurse to expand variables in the contents - contents = ExpandVariables(contents, phase, processed_variables, build_file) - else: - # Recurse to expand variables in the contents - contents = ExpandVariables(contents, phase, variables, build_file) - - # Strip off leading/trailing whitespace so that variable matches are - # simpler below (and because they are rarely needed). - contents = contents.strip() - - # expand_to_list is true if an @ variant is used. In that case, - # the expansion should result in a list. Note that the caller - # is to be expecting a list in return, and not all callers do - # because not all are working in list context. Also, for list - # expansions, there can be no other text besides the variable - # expansion in the input string. - expand_to_list = "@" in match["type"] and input_str == replacement - - if run_command or file_list: - # Find the build file's directory, so commands can be run or file lists - # generated relative to it. - build_file_dir = os.path.dirname(build_file) - if build_file_dir == "" and not file_list: - # If build_file is just a leaf filename indicating a file in the - # current directory, build_file_dir might be an empty string. Set - # it to None to signal to subprocess.Popen that it should run the - # command in the current directory. - build_file_dir = None - - # Support <|(listfile.txt ...) which generates a file - # containing items from a gyp list, generated at gyp time. - # This works around actions/rules which have more inputs than will - # fit on the command line. - if file_list: - contents_list = ( - contents if isinstance(contents, list) else contents.split(" ") - ) - replacement = contents_list[0] - if os.path.isabs(replacement): - raise GypError('| cannot handle absolute paths, got "%s"' % replacement) - - if not generator_filelist_paths: - path = os.path.join(build_file_dir, replacement) - else: - if os.path.isabs(build_file_dir): - toplevel = generator_filelist_paths["toplevel"] - rel_build_file_dir = gyp.common.RelativePath( - build_file_dir, toplevel - ) - else: - rel_build_file_dir = build_file_dir - qualified_out_dir = generator_filelist_paths["qualified_out_dir"] - path = os.path.join(qualified_out_dir, rel_build_file_dir, replacement) - gyp.common.EnsureDirExists(path) - - replacement = gyp.common.RelativePath(path, build_file_dir) - f = gyp.common.WriteOnDiff(path) - for i in contents_list[1:]: - f.write("%s\n" % i) - f.close() - - elif run_command: - use_shell = True - if match["is_array"]: - contents = eval(contents) - use_shell = False - - # Check for a cached value to avoid executing commands, or generating - # file lists more than once. The cache key contains the command to be - # run as well as the directory to run it from, to account for commands - # that depend on their current directory. - # TODO(http://code.google.com/p/gyp/issues/detail?id=111): In theory, - # someone could author a set of GYP files where each time the command - # is invoked it produces different output by design. When the need - # arises, the syntax should be extended to support no caching off a - # command's output so it is run every time. - cache_key = (str(contents), build_file_dir) - cached_value = cached_command_results.get(cache_key, None) - if cached_value is None: - gyp.DebugOutput( - gyp.DEBUG_VARIABLES, - "Executing command '%s' in directory '%s'", - contents, - build_file_dir, - ) - - replacement = "" - - if command_string == "pymod_do_main": - # 0: - raise GypError( - "Call to '%s' returned exit status %d while in %s." - % (contents, result.returncode, build_file) - ) - replacement = result.stdout.decode("utf-8").rstrip() - - cached_command_results[cache_key] = replacement - else: - gyp.DebugOutput( - gyp.DEBUG_VARIABLES, - "Had cache value for command '%s' in directory '%s'", - contents, - build_file_dir, - ) - replacement = cached_value - - elif contents not in variables: - if contents[-1] in ["!", "/"]: - # In order to allow cross-compiles (nacl) to happen more naturally, - # we will allow references to >(sources/) etc. to resolve to - # and empty list if undefined. This allows actions to: - # 'action!': [ - # '>@(_sources!)', - # ], - # 'action/': [ - # '>@(_sources/)', - # ], - replacement = [] - else: - raise GypError("Undefined variable " + contents + " in " + build_file) - else: - replacement = variables[contents] - - if isinstance(replacement, bytes) and not isinstance(replacement, str): - replacement = replacement.decode("utf-8") # done on Python 3 only - if isinstance(replacement, list): - for item in replacement: - if isinstance(item, bytes) and not isinstance(item, str): - item = item.decode("utf-8") # done on Python 3 only - if not contents[-1] == "/" and type(item) not in (str, int): - raise GypError( - "Variable " - + contents - + " must expand to a string or list of strings; " - + "list contains a " - + item.__class__.__name__ - ) - # Run through the list and handle variable expansions in it. Since - # the list is guaranteed not to contain dicts, this won't do anything - # with conditions sections. - ProcessVariablesAndConditionsInList( - replacement, phase, variables, build_file - ) - elif type(replacement) not in (str, int): - raise GypError( - "Variable " - + contents - + " must expand to a string or list of strings; " - + "found a " - + replacement.__class__.__name__ - ) - - if expand_to_list: - # Expanding in list context. It's guaranteed that there's only one - # replacement to do in |input_str| and that it's this replacement. See - # above. - if isinstance(replacement, list): - # If it's already a list, make a copy. - output = replacement[:] - else: - # Split it the same way sh would split arguments. - output = shlex.split(str(replacement)) - else: - # Expanding in string context. - encoded_replacement = "" - if isinstance(replacement, list): - # When expanding a list into string context, turn the list items - # into a string in a way that will work with a subprocess call. - # - # TODO(mark): This isn't completely correct. This should - # call a generator-provided function that observes the - # proper list-to-argument quoting rules on a specific - # platform instead of just calling the POSIX encoding - # routine. - encoded_replacement = gyp.common.EncodePOSIXShellList(replacement) - else: - encoded_replacement = replacement - - output = ( - output[:replace_start] + str(encoded_replacement) + output[replace_end:] - ) - # Prepare for the next match iteration. - input_str = output - - if output == input: - gyp.DebugOutput( - gyp.DEBUG_VARIABLES, - "Found only identity matches on %r, avoiding infinite recursion.", - output, - ) - else: - # Look for more matches now that we've replaced some, to deal with - # expanding local variables (variables defined in the same - # variables block as this one). - gyp.DebugOutput(gyp.DEBUG_VARIABLES, "Found output %r, recursing.", output) - if isinstance(output, list): - if output and isinstance(output[0], list): - # Leave output alone if it's a list of lists. - # We don't want such lists to be stringified. - pass - else: - new_output = [] - for item in output: - new_output.append( - ExpandVariables(item, phase, variables, build_file) - ) - output = new_output - else: - output = ExpandVariables(output, phase, variables, build_file) - - # Convert all strings that are canonically-represented integers into integers. - if isinstance(output, list): - for index, outstr in enumerate(output): - if IsStrCanonicalInt(outstr): - output[index] = int(outstr) - elif IsStrCanonicalInt(output): - output = int(output) - - return output - - -# The same condition is often evaluated over and over again so it -# makes sense to cache as much as possible between evaluations. -cached_conditions_asts = {} - - -def EvalCondition(condition, conditions_key, phase, variables, build_file): - """Returns the dict that should be used or None if the result was - that nothing should be used.""" - if not isinstance(condition, list): - raise GypError(conditions_key + " must be a list") - if len(condition) < 2: - # It's possible that condition[0] won't work in which case this - # attempt will raise its own IndexError. That's probably fine. - raise GypError( - conditions_key - + " " - + condition[0] - + " must be at least length 2, not " - + str(len(condition)) - ) - - i = 0 - result = None - while i < len(condition): - cond_expr = condition[i] - true_dict = condition[i + 1] - if not isinstance(true_dict, dict): - raise GypError( - f"{conditions_key} {cond_expr} must be followed by a dictionary, " - f"not {type(true_dict)}" - ) - if len(condition) > i + 2 and isinstance(condition[i + 2], dict): - false_dict = condition[i + 2] - i = i + 3 - if i != len(condition): - raise GypError( - f"{conditions_key} {cond_expr} has " - f"{len(condition) - i} unexpected trailing items" - ) - else: - false_dict = None - i = i + 2 - if result is None: - result = EvalSingleCondition( - cond_expr, true_dict, false_dict, phase, variables, build_file - ) - - return result - - -def EvalSingleCondition(cond_expr, true_dict, false_dict, phase, variables, build_file): - """Returns true_dict if cond_expr evaluates to true, and false_dict - otherwise.""" - # Do expansions on the condition itself. Since the condition can naturally - # contain variable references without needing to resort to GYP expansion - # syntax, this is of dubious value for variables, but someone might want to - # use a command expansion directly inside a condition. - cond_expr_expanded = ExpandVariables(cond_expr, phase, variables, build_file) - if type(cond_expr_expanded) not in (str, int): - raise ValueError( - "Variable expansion in this context permits str and int " - + "only, found " - + cond_expr_expanded.__class__.__name__ - ) - - try: - if cond_expr_expanded in cached_conditions_asts: - ast_code = cached_conditions_asts[cond_expr_expanded] - else: - ast_code = compile(cond_expr_expanded, "", "eval") - cached_conditions_asts[cond_expr_expanded] = ast_code - env = {"__builtins__": {}, "v": Version} - if eval(ast_code, env, variables): - return true_dict - return false_dict - except SyntaxError as e: - syntax_error = SyntaxError( - "%s while evaluating condition '%s' in %s " - "at character %d." % (str(e.args[0]), e.text, build_file, e.offset), - e.filename, - e.lineno, - e.offset, - e.text, - ) - raise syntax_error - except NameError as e: - gyp.common.ExceptionAppend( - e, - f"while evaluating condition '{cond_expr_expanded}' in {build_file}", - ) - raise GypError(e) - - -def ProcessConditionsInDict(the_dict, phase, variables, build_file): - # Process a 'conditions' or 'target_conditions' section in the_dict, - # depending on phase. - # early -> conditions - # late -> target_conditions - # latelate -> no conditions - # - # Each item in a conditions list consists of cond_expr, a string expression - # evaluated as the condition, and true_dict, a dict that will be merged into - # the_dict if cond_expr evaluates to true. Optionally, a third item, - # false_dict, may be present. false_dict is merged into the_dict if - # cond_expr evaluates to false. - # - # Any dict merged into the_dict will be recursively processed for nested - # conditionals and other expansions, also according to phase, immediately - # prior to being merged. - - if phase == PHASE_EARLY: - conditions_key = "conditions" - elif phase == PHASE_LATE: - conditions_key = "target_conditions" - elif phase == PHASE_LATELATE: - return - else: - assert False - - if conditions_key not in the_dict: - return - - conditions_list = the_dict[conditions_key] - # Unhook the conditions list, it's no longer needed. - del the_dict[conditions_key] - - for condition in conditions_list: - merge_dict = EvalCondition( - condition, conditions_key, phase, variables, build_file - ) - - if merge_dict is not None: - # Expand variables and nested conditionals in the merge_dict before - # merging it. - ProcessVariablesAndConditionsInDict( - merge_dict, phase, variables, build_file - ) - - MergeDicts(the_dict, merge_dict, build_file, build_file) - - -def LoadAutomaticVariablesFromDict(variables, the_dict): - # Any keys with plain string values in the_dict become automatic variables. - # The variable name is the key name with a "_" character prepended. - for key, value in the_dict.items(): - if type(value) in (str, int, list): - variables["_" + key] = value - - -def LoadVariablesFromVariablesDict(variables, the_dict, the_dict_key): - # Any keys in the_dict's "variables" dict, if it has one, becomes a - # variable. The variable name is the key name in the "variables" dict. - # Variables that end with the % character are set only if they are unset in - # the variables dict. the_dict_key is the name of the key that accesses - # the_dict in the_dict's parent dict. If the_dict's parent is not a dict - # (it could be a list or it could be parentless because it is a root dict), - # the_dict_key will be None. - for key, value in the_dict.get("variables", {}).items(): - if type(value) not in (str, int, list): - continue - - if key.endswith("%"): - variable_name = key[:-1] - if variable_name in variables: - # If the variable is already set, don't set it. - continue - if the_dict_key == "variables" and variable_name in the_dict: - # If the variable is set without a % in the_dict, and the_dict is a - # variables dict (making |variables| a variables sub-dict of a - # variables dict), use the_dict's definition. - value = the_dict[variable_name] - else: - variable_name = key - - variables[variable_name] = value - - -def ProcessVariablesAndConditionsInDict( - the_dict, phase, variables_in, build_file, the_dict_key=None -): - """Handle all variable and command expansion and conditional evaluation. - - This function is the public entry point for all variable expansions and - conditional evaluations. The variables_in dictionary will not be modified - by this function. - """ - - # Make a copy of the variables_in dict that can be modified during the - # loading of automatics and the loading of the variables dict. - variables = variables_in.copy() - LoadAutomaticVariablesFromDict(variables, the_dict) - - if "variables" in the_dict: - # Make sure all the local variables are added to the variables - # list before we process them so that you can reference one - # variable from another. They will be fully expanded by recursion - # in ExpandVariables. - for key, value in the_dict["variables"].items(): - variables[key] = value - - # Handle the associated variables dict first, so that any variable - # references within can be resolved prior to using them as variables. - # Pass a copy of the variables dict to avoid having it be tainted. - # Otherwise, it would have extra automatics added for everything that - # should just be an ordinary variable in this scope. - ProcessVariablesAndConditionsInDict( - the_dict["variables"], phase, variables, build_file, "variables" - ) - - LoadVariablesFromVariablesDict(variables, the_dict, the_dict_key) - - for key, value in the_dict.items(): - # Skip "variables", which was already processed if present. - if key != "variables" and isinstance(value, str): - expanded = ExpandVariables(value, phase, variables, build_file) - if type(expanded) not in (str, int): - raise ValueError( - "Variable expansion in this context permits str and int " - + "only, found " - + expanded.__class__.__name__ - + " for " - + key - ) - the_dict[key] = expanded - - # Variable expansion may have resulted in changes to automatics. Reload. - # TODO(mark): Optimization: only reload if no changes were made. - variables = variables_in.copy() - LoadAutomaticVariablesFromDict(variables, the_dict) - LoadVariablesFromVariablesDict(variables, the_dict, the_dict_key) - - # Process conditions in this dict. This is done after variable expansion - # so that conditions may take advantage of expanded variables. For example, - # if the_dict contains: - # {'type': '<(library_type)', - # 'conditions': [['_type=="static_library"', { ... }]]}, - # _type, as used in the condition, will only be set to the value of - # library_type if variable expansion is performed before condition - # processing. However, condition processing should occur prior to recursion - # so that variables (both automatic and "variables" dict type) may be - # adjusted by conditions sections, merged into the_dict, and have the - # intended impact on contained dicts. - # - # This arrangement means that a "conditions" section containing a "variables" - # section will only have those variables effective in subdicts, not in - # the_dict. The workaround is to put a "conditions" section within a - # "variables" section. For example: - # {'conditions': [['os=="mac"', {'variables': {'define': 'IS_MAC'}}]], - # 'defines': ['<(define)'], - # 'my_subdict': {'defines': ['<(define)']}}, - # will not result in "IS_MAC" being appended to the "defines" list in the - # current scope but would result in it being appended to the "defines" list - # within "my_subdict". By comparison: - # {'variables': {'conditions': [['os=="mac"', {'define': 'IS_MAC'}]]}, - # 'defines': ['<(define)'], - # 'my_subdict': {'defines': ['<(define)']}}, - # will append "IS_MAC" to both "defines" lists. - - # Evaluate conditions sections, allowing variable expansions within them - # as well as nested conditionals. This will process a 'conditions' or - # 'target_conditions' section, perform appropriate merging and recursive - # conditional and variable processing, and then remove the conditions section - # from the_dict if it is present. - ProcessConditionsInDict(the_dict, phase, variables, build_file) - - # Conditional processing may have resulted in changes to automatics or the - # variables dict. Reload. - variables = variables_in.copy() - LoadAutomaticVariablesFromDict(variables, the_dict) - LoadVariablesFromVariablesDict(variables, the_dict, the_dict_key) - - # Recurse into child dicts, or process child lists which may result in - # further recursion into descendant dicts. - for key, value in the_dict.items(): - # Skip "variables" and string values, which were already processed if - # present. - if key == "variables" or isinstance(value, str): - continue - if isinstance(value, dict): - # Pass a copy of the variables dict so that subdicts can't influence - # parents. - ProcessVariablesAndConditionsInDict( - value, phase, variables, build_file, key - ) - elif isinstance(value, list): - # The list itself can't influence the variables dict, and - # ProcessVariablesAndConditionsInList will make copies of the variables - # dict if it needs to pass it to something that can influence it. No - # copy is necessary here. - ProcessVariablesAndConditionsInList(value, phase, variables, build_file) - elif not isinstance(value, int): - raise TypeError("Unknown type " + value.__class__.__name__ + " for " + key) - - -def ProcessVariablesAndConditionsInList(the_list, phase, variables, build_file): - # Iterate using an index so that new values can be assigned into the_list. - index = 0 - while index < len(the_list): - item = the_list[index] - if isinstance(item, dict): - # Make a copy of the variables dict so that it won't influence anything - # outside of its own scope. - ProcessVariablesAndConditionsInDict(item, phase, variables, build_file) - elif isinstance(item, list): - ProcessVariablesAndConditionsInList(item, phase, variables, build_file) - elif isinstance(item, str): - expanded = ExpandVariables(item, phase, variables, build_file) - if type(expanded) in (str, int): - the_list[index] = expanded - elif isinstance(expanded, list): - the_list[index : index + 1] = expanded - index += len(expanded) - - # index now identifies the next item to examine. Continue right now - # without falling into the index increment below. - continue - else: - raise ValueError( - "Variable expansion in this context permits strings and " - + "lists only, found " - + expanded.__class__.__name__ - + " at " - + index - ) - elif not isinstance(item, int): - raise TypeError( - "Unknown type " + item.__class__.__name__ + " at index " + index - ) - index = index + 1 - - -def BuildTargetsDict(data): - """Builds a dict mapping fully-qualified target names to their target dicts. - - |data| is a dict mapping loaded build files by pathname relative to the - current directory. Values in |data| are build file contents. For each - |data| value with a "targets" key, the value of the "targets" key is taken - as a list containing target dicts. Each target's fully-qualified name is - constructed from the pathname of the build file (|data| key) and its - "target_name" property. These fully-qualified names are used as the keys - in the returned dict. These keys provide access to the target dicts, - the dicts in the "targets" lists. - """ - - targets = {} - for build_file in data["target_build_files"]: - for target in data[build_file].get("targets", []): - target_name = gyp.common.QualifiedTarget( - build_file, target["target_name"], target["toolset"] - ) - if target_name in targets: - raise GypError("Duplicate target definitions for " + target_name) - targets[target_name] = target - - return targets - - -def QualifyDependencies(targets): - """Make dependency links fully-qualified relative to the current directory. - - |targets| is a dict mapping fully-qualified target names to their target - dicts. For each target in this dict, keys known to contain dependency - links are examined, and any dependencies referenced will be rewritten - so that they are fully-qualified and relative to the current directory. - All rewritten dependencies are suitable for use as keys to |targets| or a - similar dict. - """ - - all_dependency_sections = [ - dep + op for dep in dependency_sections for op in ("", "!", "/") - ] - - for target, target_dict in targets.items(): - target_build_file = gyp.common.BuildFile(target) - toolset = target_dict["toolset"] - for dependency_key in all_dependency_sections: - dependencies = target_dict.get(dependency_key, []) - for index, dep in enumerate(dependencies): - dep_file, dep_target, dep_toolset = gyp.common.ResolveTarget( - target_build_file, dep, toolset - ) - if not multiple_toolsets: - # Ignore toolset specification in the dependency if it is specified. - dep_toolset = toolset - dependency = gyp.common.QualifiedTarget( - dep_file, dep_target, dep_toolset - ) - dependencies[index] = dependency - - # Make sure anything appearing in a list other than "dependencies" also - # appears in the "dependencies" list. - if ( - dependency_key != "dependencies" - and dependency not in target_dict["dependencies"] - ): - raise GypError( - "Found " - + dependency - + " in " - + dependency_key - + " of " - + target - + ", but not in dependencies" - ) - - -def ExpandWildcardDependencies(targets, data): - """Expands dependencies specified as build_file:*. - - For each target in |targets|, examines sections containing links to other - targets. If any such section contains a link of the form build_file:*, it - is taken as a wildcard link, and is expanded to list each target in - build_file. The |data| dict provides access to build file dicts. - - Any target that does not wish to be included by wildcard can provide an - optional "suppress_wildcard" key in its target dict. When present and - true, a wildcard dependency link will not include such targets. - - All dependency names, including the keys to |targets| and the values in each - dependency list, must be qualified when this function is called. - """ - - for target, target_dict in targets.items(): - target_build_file = gyp.common.BuildFile(target) - for dependency_key in dependency_sections: - dependencies = target_dict.get(dependency_key, []) - - # Loop this way instead of "for dependency in" or "for index in range" - # because the dependencies list will be modified within the loop body. - index = 0 - while index < len(dependencies): - ( - dependency_build_file, - dependency_target, - dependency_toolset, - ) = gyp.common.ParseQualifiedTarget(dependencies[index]) - if dependency_target != "*" and dependency_toolset != "*": - # Not a wildcard. Keep it moving. - index = index + 1 - continue - - if dependency_build_file == target_build_file: - # It's an error for a target to depend on all other targets in - # the same file, because a target cannot depend on itself. - raise GypError( - "Found wildcard in " - + dependency_key - + " of " - + target - + " referring to same build file" - ) - - # Take the wildcard out and adjust the index so that the next - # dependency in the list will be processed the next time through the - # loop. - del dependencies[index] - index = index - 1 - - # Loop through the targets in the other build file, adding them to - # this target's list of dependencies in place of the removed - # wildcard. - dependency_target_dicts = data[dependency_build_file]["targets"] - for dependency_target_dict in dependency_target_dicts: - if int(dependency_target_dict.get("suppress_wildcard", False)): - continue - dependency_target_name = dependency_target_dict["target_name"] - if dependency_target not in {"*", dependency_target_name}: - continue - dependency_target_toolset = dependency_target_dict["toolset"] - if dependency_toolset not in {"*", dependency_target_toolset}: - continue - dependency = gyp.common.QualifiedTarget( - dependency_build_file, - dependency_target_name, - dependency_target_toolset, - ) - index = index + 1 - dependencies.insert(index, dependency) - - index = index + 1 - - -def Unify(items): - """Removes duplicate elements from items, keeping the first element.""" - seen = {} - return [seen.setdefault(e, e) for e in items if e not in seen] - - -def RemoveDuplicateDependencies(targets): - """Makes sure every dependency appears only once in all targets's dependency - lists.""" - for target_name, target_dict in targets.items(): - for dependency_key in dependency_sections: - dependencies = target_dict.get(dependency_key, []) - if dependencies: - target_dict[dependency_key] = Unify(dependencies) - - -def Filter(items, item): - """Removes item from items.""" - res = {} - return [res.setdefault(e, e) for e in items if e != item] - - -def RemoveSelfDependencies(targets): - """Remove self dependencies from targets that have the prune_self_dependency - variable set.""" - for target_name, target_dict in targets.items(): - for dependency_key in dependency_sections: - dependencies = target_dict.get(dependency_key, []) - if dependencies: - for t in dependencies: - if t == target_name and ( - targets[t].get("variables", {}).get("prune_self_dependency", 0) - ): - target_dict[dependency_key] = Filter(dependencies, target_name) - - -def RemoveLinkDependenciesFromNoneTargets(targets): - """Remove dependencies having the 'link_dependency' attribute from the 'none' - targets.""" - for target_name, target_dict in targets.items(): - for dependency_key in dependency_sections: - dependencies = target_dict.get(dependency_key, []) - if dependencies: - for t in dependencies: - if target_dict.get("type", None) == "none": - if targets[t].get("variables", {}).get("link_dependency", 0): - target_dict[dependency_key] = Filter( - target_dict[dependency_key], t - ) - - -class DependencyGraphNode: - """ - - Attributes: - ref: A reference to an object that this DependencyGraphNode represents. - dependencies: List of DependencyGraphNodes on which this one depends. - dependents: List of DependencyGraphNodes that depend on this one. - """ - - class CircularException(GypError): - pass - - def __init__(self, ref): - self.ref = ref - self.dependencies = [] - self.dependents = [] - - def __repr__(self): - return "" % self.ref - - def FlattenToList(self): - # flat_list is the sorted list of dependencies - actually, the list items - # are the "ref" attributes of DependencyGraphNodes. Every target will - # appear in flat_list after all of its dependencies, and before all of its - # dependents. - flat_list = OrderedSet() - - def ExtractNodeRef(node): - """Extracts the object that the node represents from the given node.""" - return node.ref - - # in_degree_zeros is the list of DependencyGraphNodes that have no - # dependencies not in flat_list. Initially, it is a copy of the children - # of this node, because when the graph was built, nodes with no - # dependencies were made implicit dependents of the root node. - in_degree_zeros = sorted(self.dependents[:], key=ExtractNodeRef) - - while in_degree_zeros: - # Nodes in in_degree_zeros have no dependencies not in flat_list, so they - # can be appended to flat_list. Take these nodes out of in_degree_zeros - # as work progresses, so that the next node to process from the list can - # always be accessed at a consistent position. - node = in_degree_zeros.pop() - flat_list.add(node.ref) - - # Look at dependents of the node just added to flat_list. Some of them - # may now belong in in_degree_zeros. - for node_dependent in sorted(node.dependents, key=ExtractNodeRef): - is_in_degree_zero = True - # TODO: We want to check through the - # node_dependent.dependencies list but if it's long and we - # always start at the beginning, then we get O(n^2) behaviour. - for node_dependent_dependency in sorted( - node_dependent.dependencies, key=ExtractNodeRef - ): - if node_dependent_dependency.ref not in flat_list: - # The dependent one or more dependencies not in flat_list. - # There will be more chances to add it to flat_list - # when examining it again as a dependent of those other - # dependencies, provided that there are no cycles. - is_in_degree_zero = False - break - - if is_in_degree_zero: - # All of the dependent's dependencies are already in flat_list. Add - # it to in_degree_zeros where it will be processed in a future - # iteration of the outer loop. - in_degree_zeros += [node_dependent] - - return list(flat_list) - - def FindCycles(self): - """ - Returns a list of cycles in the graph, where each cycle is its own list. - """ - results = [] - visited = set() - - def Visit(node, path): - for child in node.dependents: - if child in path: - results.append([child] + path[: path.index(child) + 1]) - elif child not in visited: - visited.add(child) - Visit(child, [child] + path) - - visited.add(self) - Visit(self, [self]) - - return results - - def DirectDependencies(self, dependencies=None): - """Returns a list of just direct dependencies.""" - if dependencies is None: - dependencies = [] - - for dependency in self.dependencies: - # Check for None, corresponding to the root node. - if dependency.ref and dependency.ref not in dependencies: - dependencies.append(dependency.ref) - - return dependencies - - def _AddImportedDependencies(self, targets, dependencies=None): - """Given a list of direct dependencies, adds indirect dependencies that - other dependencies have declared to export their settings. - - This method does not operate on self. Rather, it operates on the list - of dependencies in the |dependencies| argument. For each dependency in - that list, if any declares that it exports the settings of one of its - own dependencies, those dependencies whose settings are "passed through" - are added to the list. As new items are added to the list, they too will - be processed, so it is possible to import settings through multiple levels - of dependencies. - - This method is not terribly useful on its own, it depends on being - "primed" with a list of direct dependencies such as one provided by - DirectDependencies. DirectAndImportedDependencies is intended to be the - public entry point. - """ - - if dependencies is None: - dependencies = [] - - index = 0 - while index < len(dependencies): - dependency = dependencies[index] - dependency_dict = targets[dependency] - # Add any dependencies whose settings should be imported to the list - # if not already present. Newly-added items will be checked for - # their own imports when the list iteration reaches them. - # Rather than simply appending new items, insert them after the - # dependency that exported them. This is done to more closely match - # the depth-first method used by DeepDependencies. - add_index = 1 - for imported_dependency in dependency_dict.get( - "export_dependent_settings", [] - ): - if imported_dependency not in dependencies: - dependencies.insert(index + add_index, imported_dependency) - add_index = add_index + 1 - index = index + 1 - - return dependencies - - def DirectAndImportedDependencies(self, targets, dependencies=None): - """Returns a list of a target's direct dependencies and all indirect - dependencies that a dependency has advertised settings should be exported - through the dependency for. - """ - - dependencies = self.DirectDependencies(dependencies) - return self._AddImportedDependencies(targets, dependencies) - - def DeepDependencies(self, dependencies=None): - """Returns an OrderedSet of all of a target's dependencies, recursively.""" - if dependencies is None: - # Using a list to get ordered output and a set to do fast "is it - # already added" checks. - dependencies = OrderedSet() - - for dependency in self.dependencies: - # Check for None, corresponding to the root node. - if dependency.ref is None: - continue - if dependency.ref not in dependencies: - dependency.DeepDependencies(dependencies) - dependencies.add(dependency.ref) - - return dependencies - - def _LinkDependenciesInternal( - self, targets, include_shared_libraries, dependencies=None, initial=True - ): - """Returns an OrderedSet of dependency targets that are linked - into this target. - - This function has a split personality, depending on the setting of - |initial|. Outside callers should always leave |initial| at its default - setting. - - When adding a target to the list of dependencies, this function will - recurse into itself with |initial| set to False, to collect dependencies - that are linked into the linkable target for which the list is being built. - - If |include_shared_libraries| is False, the resulting dependencies will not - include shared_library targets that are linked into this target. - """ - if dependencies is None: - # Using a list to get ordered output and a set to do fast "is it - # already added" checks. - dependencies = OrderedSet() - - # Check for None, corresponding to the root node. - if self.ref is None: - return dependencies - - # It's kind of sucky that |targets| has to be passed into this function, - # but that's presently the easiest way to access the target dicts so that - # this function can find target types. - - if "target_name" not in targets[self.ref]: - raise GypError("Missing 'target_name' field in target.") - - if "type" not in targets[self.ref]: - raise GypError( - "Missing 'type' field in target %s" % targets[self.ref]["target_name"] - ) - - target_type = targets[self.ref]["type"] - - is_linkable = target_type in linkable_types - - if initial and not is_linkable: - # If this is the first target being examined and it's not linkable, - # return an empty list of link dependencies, because the link - # dependencies are intended to apply to the target itself (initial is - # True) and this target won't be linked. - return dependencies - - # Don't traverse 'none' targets if explicitly excluded. - if target_type == "none" and not targets[self.ref].get( - "dependencies_traverse", True - ): - dependencies.add(self.ref) - return dependencies - - # Executables, mac kernel extensions, windows drivers and loadable modules - # are already fully and finally linked. Nothing else can be a link - # dependency of them, there can only be dependencies in the sense that a - # dependent target might run an executable or load the loadable_module. - if not initial and target_type in ( - "executable", - "loadable_module", - "mac_kernel_extension", - "windows_driver", - ): - return dependencies - - # Shared libraries are already fully linked. They should only be included - # in |dependencies| when adjusting static library dependencies (in order to - # link against the shared_library's import lib), but should not be included - # in |dependencies| when propagating link_settings. - # The |include_shared_libraries| flag controls which of these two cases we - # are handling. - if ( - not initial - and target_type == "shared_library" - and not include_shared_libraries - ): - return dependencies - - # The target is linkable, add it to the list of link dependencies. - if self.ref not in dependencies: - dependencies.add(self.ref) - if initial or not is_linkable: - # If this is a subsequent target and it's linkable, don't look any - # further for linkable dependencies, as they'll already be linked into - # this target linkable. Always look at dependencies of the initial - # target, and always look at dependencies of non-linkables. - for dependency in self.dependencies: - dependency._LinkDependenciesInternal( - targets, include_shared_libraries, dependencies, False - ) - - return dependencies - - def DependenciesForLinkSettings(self, targets): - """ - Returns a list of dependency targets whose link_settings should be merged - into this target. - """ - - # TODO(sbaig) Currently, chrome depends on the bug that shared libraries' - # link_settings are propagated. So for now, we will allow it, unless the - # 'allow_sharedlib_linksettings_propagation' flag is explicitly set to - # False. Once chrome is fixed, we can remove this flag. - include_shared_libraries = targets[self.ref].get( - "allow_sharedlib_linksettings_propagation", True - ) - return self._LinkDependenciesInternal(targets, include_shared_libraries) - - def DependenciesToLinkAgainst(self, targets): - """ - Returns a list of dependency targets that are linked into this target. - """ - return self._LinkDependenciesInternal(targets, True) - - -def BuildDependencyList(targets): - # Create a DependencyGraphNode for each target. Put it into a dict for easy - # access. - dependency_nodes = {} - for target, spec in targets.items(): - if target not in dependency_nodes: - dependency_nodes[target] = DependencyGraphNode(target) - - # Set up the dependency links. Targets that have no dependencies are treated - # as dependent on root_node. - root_node = DependencyGraphNode(None) - for target, spec in targets.items(): - target_node = dependency_nodes[target] - dependencies = spec.get("dependencies") - if not dependencies: - target_node.dependencies = [root_node] - root_node.dependents.append(target_node) - else: - for dependency in dependencies: - dependency_node = dependency_nodes.get(dependency) - if not dependency_node: - raise GypError( - "Dependency '%s' not found while " - "trying to load target %s" % (dependency, target) - ) - target_node.dependencies.append(dependency_node) - dependency_node.dependents.append(target_node) - - flat_list = root_node.FlattenToList() - - # If there's anything left unvisited, there must be a circular dependency - # (cycle). - if len(flat_list) != len(targets): - if not root_node.dependents: - # If all targets have dependencies, add the first target as a dependent - # of root_node so that the cycle can be discovered from root_node. - target = next(iter(targets)) - target_node = dependency_nodes[target] - target_node.dependencies.append(root_node) - root_node.dependents.append(target_node) - - cycles = [] - for cycle in root_node.FindCycles(): - paths = [node.ref for node in cycle] - cycles.append("Cycle: %s" % " -> ".join(paths)) - raise DependencyGraphNode.CircularException( - "Cycles in dependency graph detected:\n" + "\n".join(cycles) - ) - - return [dependency_nodes, flat_list] - - -def VerifyNoGYPFileCircularDependencies(targets): - # Create a DependencyGraphNode for each gyp file containing a target. Put - # it into a dict for easy access. - dependency_nodes = {} - for target in targets: - build_file = gyp.common.BuildFile(target) - if build_file not in dependency_nodes: - dependency_nodes[build_file] = DependencyGraphNode(build_file) - - # Set up the dependency links. - for target, spec in targets.items(): - build_file = gyp.common.BuildFile(target) - build_file_node = dependency_nodes[build_file] - target_dependencies = spec.get("dependencies", []) - for dependency in target_dependencies: - try: - dependency_build_file = gyp.common.BuildFile(dependency) - except GypError as e: - gyp.common.ExceptionAppend( - e, "while computing dependencies of .gyp file %s" % build_file - ) - raise - - if dependency_build_file == build_file: - # A .gyp file is allowed to refer back to itself. - continue - dependency_node = dependency_nodes.get(dependency_build_file) - if not dependency_node: - raise GypError("Dependency '%s' not found" % dependency_build_file) - if dependency_node not in build_file_node.dependencies: - build_file_node.dependencies.append(dependency_node) - dependency_node.dependents.append(build_file_node) - - # Files that have no dependencies are treated as dependent on root_node. - root_node = DependencyGraphNode(None) - for build_file_node in dependency_nodes.values(): - if len(build_file_node.dependencies) == 0: - build_file_node.dependencies.append(root_node) - root_node.dependents.append(build_file_node) - - flat_list = root_node.FlattenToList() - - # If there's anything left unvisited, there must be a circular dependency - # (cycle). - if len(flat_list) != len(dependency_nodes): - if not root_node.dependents: - # If all files have dependencies, add the first file as a dependent - # of root_node so that the cycle can be discovered from root_node. - file_node = next(iter(dependency_nodes.values())) - file_node.dependencies.append(root_node) - root_node.dependents.append(file_node) - cycles = [] - for cycle in root_node.FindCycles(): - paths = [node.ref for node in cycle] - cycles.append("Cycle: %s" % " -> ".join(paths)) - raise DependencyGraphNode.CircularException( - "Cycles in .gyp file dependency graph detected:\n" + "\n".join(cycles) - ) - - -def DoDependentSettings(key, flat_list, targets, dependency_nodes): - # key should be one of all_dependent_settings, direct_dependent_settings, - # or link_settings. - - for target in flat_list: - target_dict = targets[target] - build_file = gyp.common.BuildFile(target) - - if key == "all_dependent_settings": - dependencies = dependency_nodes[target].DeepDependencies() - elif key == "direct_dependent_settings": - dependencies = dependency_nodes[target].DirectAndImportedDependencies( - targets - ) - elif key == "link_settings": - dependencies = dependency_nodes[target].DependenciesForLinkSettings(targets) - else: - raise GypError( - "DoDependentSettings doesn't know how to determine " - "dependencies for " + key - ) - - for dependency in dependencies: - dependency_dict = targets[dependency] - if key not in dependency_dict: - continue - dependency_build_file = gyp.common.BuildFile(dependency) - MergeDicts( - target_dict, dependency_dict[key], build_file, dependency_build_file - ) - - -def AdjustStaticLibraryDependencies( - flat_list, targets, dependency_nodes, sort_dependencies -): - # Recompute target "dependencies" properties. For each static library - # target, remove "dependencies" entries referring to other static libraries, - # unless the dependency has the "hard_dependency" attribute set. For each - # linkable target, add a "dependencies" entry referring to all of the - # target's computed list of link dependencies (including static libraries - # if no such entry is already present. - for target in flat_list: - target_dict = targets[target] - target_type = target_dict["type"] - - if target_type == "static_library": - if "dependencies" not in target_dict: - continue - - target_dict["dependencies_original"] = target_dict.get("dependencies", [])[ - : - ] - - # A static library should not depend on another static library unless - # the dependency relationship is "hard," which should only be done when - # a dependent relies on some side effect other than just the build - # product, like a rule or action output. Further, if a target has a - # non-hard dependency, but that dependency exports a hard dependency, - # the non-hard dependency can safely be removed, but the exported hard - # dependency must be added to the target to keep the same dependency - # ordering. - dependencies = dependency_nodes[target].DirectAndImportedDependencies( - targets - ) - index = 0 - while index < len(dependencies): - dependency = dependencies[index] - dependency_dict = targets[dependency] - - # Remove every non-hard static library dependency and remove every - # non-static library dependency that isn't a direct dependency. - if ( - dependency_dict["type"] == "static_library" - and not dependency_dict.get("hard_dependency", False) - ) or ( - dependency_dict["type"] != "static_library" - and dependency not in target_dict["dependencies"] - ): - # Take the dependency out of the list, and don't increment index - # because the next dependency to analyze will shift into the index - # formerly occupied by the one being removed. - del dependencies[index] - else: - index = index + 1 - - # Update the dependencies. If the dependencies list is empty, it's not - # needed, so unhook it. - if len(dependencies) > 0: - target_dict["dependencies"] = dependencies - else: - del target_dict["dependencies"] - - elif target_type in linkable_types: - # Get a list of dependency targets that should be linked into this - # target. Add them to the dependencies list if they're not already - # present. - - link_dependencies = dependency_nodes[target].DependenciesToLinkAgainst( - targets - ) - for dependency in link_dependencies: - if dependency == target: - continue - if "dependencies" not in target_dict: - target_dict["dependencies"] = [] - if dependency not in target_dict["dependencies"]: - target_dict["dependencies"].append(dependency) - # Sort the dependencies list in the order from dependents to dependencies. - # e.g. If A and B depend on C and C depends on D, sort them in A, B, C, D. - # Note: flat_list is already sorted in the order from dependencies to - # dependents. - if sort_dependencies and "dependencies" in target_dict: - target_dict["dependencies"] = [ - dep - for dep in reversed(flat_list) - if dep in target_dict["dependencies"] - ] - - -# Initialize this here to speed up MakePathRelative. -exception_re = re.compile(r"""["']?[-/$<>^]""") - - -def MakePathRelative(to_file, fro_file, item): - # If item is a relative path, it's relative to the build file dict that it's - # coming from. Fix it up to make it relative to the build file dict that - # it's going into. - # Exception: any |item| that begins with these special characters is - # returned without modification. - # / Used when a path is already absolute (shortcut optimization; - # such paths would be returned as absolute anyway) - # $ Used for build environment variables - # - Used for some build environment flags (such as -lapr-1 in a - # "libraries" section) - # < Used for our own variable and command expansions (see ExpandVariables) - # > Used for our own variable and command expansions (see ExpandVariables) - # ^ Used for our own variable and command expansions (see ExpandVariables) - # - # "/' Used when a value is quoted. If these are present, then we - # check the second character instead. - # - if to_file == fro_file or exception_re.match(item): - return item - else: - # TODO(dglazkov) The backslash/forward-slash replacement at the end is a - # temporary measure. This should really be addressed by keeping all paths - # in POSIX until actual project generation. - ret = os.path.normpath( - os.path.join( - gyp.common.RelativePath( - os.path.dirname(fro_file), os.path.dirname(to_file) - ), - item, - ) - ).replace("\\", "/") - if item.endswith("/"): - ret += "/" - return ret - - -def MergeLists(to, fro, to_file, fro_file, is_paths=False, append=True): - # Python documentation recommends objects which do not support hash - # set this value to None. Python library objects follow this rule. - def is_hashable(val): - return val.__hash__ - - # If x is hashable, returns whether x is in s. Else returns whether x is in items. - def is_in_set_or_list(x, s, items): - if is_hashable(x): - return x in s - return x in items - - prepend_index = 0 - - # Make membership testing of hashables in |to| (in particular, strings) - # faster. - hashable_to_set = {x for x in to if is_hashable(x)} - for item in fro: - singleton = False - if type(item) in (str, int): - # The cheap and easy case. - to_item = MakePathRelative(to_file, fro_file, item) if is_paths else item - - if not (isinstance(item, str) and item.startswith("-")): - # Any string that doesn't begin with a "-" is a singleton - it can - # only appear once in a list, to be enforced by the list merge append - # or prepend. - singleton = True - elif isinstance(item, dict): - # Make a copy of the dictionary, continuing to look for paths to fix. - # The other intelligent aspects of merge processing won't apply because - # item is being merged into an empty dict. - to_item = {} - MergeDicts(to_item, item, to_file, fro_file) - elif isinstance(item, list): - # Recurse, making a copy of the list. If the list contains any - # descendant dicts, path fixing will occur. Note that here, custom - # values for is_paths and append are dropped; those are only to be - # applied to |to| and |fro|, not sublists of |fro|. append shouldn't - # matter anyway because the new |to_item| list is empty. - to_item = [] - MergeLists(to_item, item, to_file, fro_file) - else: - raise TypeError( - "Attempt to merge list item of unsupported type " - + item.__class__.__name__ - ) - - if append: - # If appending a singleton that's already in the list, don't append. - # This ensures that the earliest occurrence of the item will stay put. - if not singleton or not is_in_set_or_list(to_item, hashable_to_set, to): - to.append(to_item) - if is_hashable(to_item): - hashable_to_set.add(to_item) - else: - # If prepending a singleton that's already in the list, remove the - # existing instance and proceed with the prepend. This ensures that the - # item appears at the earliest possible position in the list. - while singleton and to_item in to: - to.remove(to_item) - - # Don't just insert everything at index 0. That would prepend the new - # items to the list in reverse order, which would be an unwelcome - # surprise. - to.insert(prepend_index, to_item) - if is_hashable(to_item): - hashable_to_set.add(to_item) - prepend_index = prepend_index + 1 - - -def MergeDicts(to, fro, to_file, fro_file): - # I wanted to name the parameter "from" but it's a Python keyword... - for k, v in fro.items(): - # It would be nice to do "if not k in to: to[k] = v" but that wouldn't give - # copy semantics. Something else may want to merge from the |fro| dict - # later, and having the same dict ref pointed to twice in the tree isn't - # what anyone wants considering that the dicts may subsequently be - # modified. - if k in to: - bad_merge = False - if type(v) in (str, int): - if type(to[k]) not in (str, int): - bad_merge = True - elif not isinstance(v, type(to[k])): - bad_merge = True - - if bad_merge: - raise TypeError( - "Attempt to merge dict value of type " - + v.__class__.__name__ - + " into incompatible type " - + to[k].__class__.__name__ - + " for key " - + k - ) - if type(v) in (str, int): - # Overwrite the existing value, if any. Cheap and easy. - is_path = IsPathSection(k) - if is_path: - to[k] = MakePathRelative(to_file, fro_file, v) - else: - to[k] = v - elif isinstance(v, dict): - # Recurse, guaranteeing copies will be made of objects that require it. - if k not in to: - to[k] = {} - MergeDicts(to[k], v, to_file, fro_file) - elif isinstance(v, list): - # Lists in dicts can be merged with different policies, depending on - # how the key in the "from" dict (k, the from-key) is written. - # - # If the from-key has ...the to-list will have this action - # this character appended:... applied when receiving the from-list: - # = replace - # + prepend - # ? set, only if to-list does not yet exist - # (none) append - # - # This logic is list-specific, but since it relies on the associated - # dict key, it's checked in this dict-oriented function. - ext = k[-1] - append = True - if ext == "=": - list_base = k[:-1] - lists_incompatible = [list_base, list_base + "?"] - to[list_base] = [] - elif ext == "+": - list_base = k[:-1] - lists_incompatible = [list_base + "=", list_base + "?"] - append = False - elif ext == "?": - list_base = k[:-1] - lists_incompatible = [list_base, list_base + "=", list_base + "+"] - else: - list_base = k - lists_incompatible = [list_base + "=", list_base + "?"] - - # Some combinations of merge policies appearing together are meaningless. - # It's stupid to replace and append simultaneously, for example. Append - # and prepend are the only policies that can coexist. - for list_incompatible in lists_incompatible: - if list_incompatible in fro: - raise GypError( - "Incompatible list policies " + k + " and " + list_incompatible - ) - - if list_base in to: - if ext == "?": - # If the key ends in "?", the list will only be merged if it doesn't - # already exist. - continue - elif not isinstance(to[list_base], list): - # This may not have been checked above if merging in a list with an - # extension character. - raise TypeError( - "Attempt to merge dict value of type " - + v.__class__.__name__ - + " into incompatible type " - + to[list_base].__class__.__name__ - + " for key " - + list_base - + "(" - + k - + ")" - ) - else: - to[list_base] = [] - - # Call MergeLists, which will make copies of objects that require it. - # MergeLists can recurse back into MergeDicts, although this will be - # to make copies of dicts (with paths fixed), there will be no - # subsequent dict "merging" once entering a list because lists are - # always replaced, appended to, or prepended to. - is_paths = IsPathSection(list_base) - MergeLists(to[list_base], v, to_file, fro_file, is_paths, append) - else: - raise TypeError( - "Attempt to merge dict value of unsupported type " - + v.__class__.__name__ - + " for key " - + k - ) - - -def MergeConfigWithInheritance( - new_configuration_dict, build_file, target_dict, configuration, visited -): - # Skip if previously visited. - if configuration in visited: - return - - # Look at this configuration. - configuration_dict = target_dict["configurations"][configuration] - - # Merge in parents. - for parent in configuration_dict.get("inherit_from", []): - MergeConfigWithInheritance( - new_configuration_dict, - build_file, - target_dict, - parent, - visited + [configuration], - ) - - # Merge it into the new config. - MergeDicts(new_configuration_dict, configuration_dict, build_file, build_file) - - # Drop abstract. - if "abstract" in new_configuration_dict: - del new_configuration_dict["abstract"] - - -def SetUpConfigurations(target, target_dict): - # key_suffixes is a list of key suffixes that might appear on key names. - # These suffixes are handled in conditional evaluations (for =, +, and ?) - # and rules/exclude processing (for ! and /). Keys with these suffixes - # should be treated the same as keys without. - key_suffixes = ["=", "+", "?", "!", "/"] - - build_file = gyp.common.BuildFile(target) - - # Provide a single configuration by default if none exists. - # TODO(mark): Signal an error if default_configurations exists but - # configurations does not. - if "configurations" not in target_dict: - target_dict["configurations"] = {"Default": {}} - if "default_configuration" not in target_dict: - concrete = [ - i - for (i, config) in target_dict["configurations"].items() - if not config.get("abstract") - ] - target_dict["default_configuration"] = sorted(concrete)[0] - - merged_configurations = {} - configs = target_dict["configurations"] - for configuration, old_configuration_dict in configs.items(): - # Skip abstract configurations (saves work only). - if old_configuration_dict.get("abstract"): - continue - # Configurations inherit (most) settings from the enclosing target scope. - # Get the inheritance relationship right by making a copy of the target - # dict. - new_configuration_dict = {} - for key, target_val in target_dict.items(): - key_ext = key[-1:] - key_base = key[:-1] if key_ext in key_suffixes else key - if key_base not in non_configuration_keys: - new_configuration_dict[key] = gyp.simple_copy.deepcopy(target_val) - - # Merge in configuration (with all its parents first). - MergeConfigWithInheritance( - new_configuration_dict, build_file, target_dict, configuration, [] - ) - - merged_configurations[configuration] = new_configuration_dict - - # Put the new configurations back into the target dict as a configuration. - for configuration, value in merged_configurations.items(): - target_dict["configurations"][configuration] = value - # Now drop all the abstract ones. - configs = target_dict["configurations"] - target_dict["configurations"] = { - k: v for k, v in configs.items() if not v.get("abstract") - } - - # Now that all of the target's configurations have been built, go through - # the target dict's keys and remove everything that's been moved into a - # "configurations" section. - delete_keys = [] - for key in target_dict: - key_ext = key[-1:] - key_base = key[:-1] if key_ext in key_suffixes else key - if key_base not in non_configuration_keys: - delete_keys.append(key) - for key in delete_keys: - del target_dict[key] - - # Check the configurations to see if they contain invalid keys. - for configuration in target_dict["configurations"]: - configuration_dict = target_dict["configurations"][configuration] - for key in configuration_dict: - if key in invalid_configuration_keys: - raise GypError( - "%s not allowed in the %s configuration, found in " - "target %s" % (key, configuration, target) - ) - - -def ProcessListFiltersInDict(name, the_dict): - """Process regular expression and exclusion-based filters on lists. - - An exclusion list is in a dict key named with a trailing "!", like - "sources!". Every item in such a list is removed from the associated - main list, which in this example, would be "sources". Removed items are - placed into a "sources_excluded" list in the dict. - - Regular expression (regex) filters are contained in dict keys named with a - trailing "/", such as "sources/" to operate on the "sources" list. Regex - filters in a dict take the form: - 'sources/': [ ['exclude', '_(linux|mac|win)\\.cc$'], - ['include', '_mac\\.cc$'] ], - The first filter says to exclude all files ending in _linux.cc, _mac.cc, and - _win.cc. The second filter then includes all files ending in _mac.cc that - are now or were once in the "sources" list. Items matching an "exclude" - filter are subject to the same processing as would occur if they were listed - by name in an exclusion list (ending in "!"). Items matching an "include" - filter are brought back into the main list if previously excluded by an - exclusion list or exclusion regex filter. Subsequent matching "exclude" - patterns can still cause items to be excluded after matching an "include". - """ - - # Look through the dictionary for any lists whose keys end in "!" or "/". - # These are lists that will be treated as exclude lists and regular - # expression-based exclude/include lists. Collect the lists that are - # needed first, looking for the lists that they operate on, and assemble - # then into |lists|. This is done in a separate loop up front, because - # the _included and _excluded keys need to be added to the_dict, and that - # can't be done while iterating through it. - - lists = [] - del_lists = [] - for key, value in the_dict.items(): - if not key: - continue - operation = key[-1] - if operation not in {"!", "/"}: - continue - - if not isinstance(value, list): - raise ValueError( - name + " key " + key + " must be list, not " + value.__class__.__name__ - ) - - list_key = key[:-1] - if list_key not in the_dict: - # This happens when there's a list like "sources!" but no corresponding - # "sources" list. Since there's nothing for it to operate on, queue up - # the "sources!" list for deletion now. - del_lists.append(key) - continue - - if not isinstance(the_dict[list_key], list): - value = the_dict[list_key] - raise ValueError( - name - + " key " - + list_key - + " must be list, not " - + value.__class__.__name__ - + " when applying " - + {"!": "exclusion", "/": "regex"}[operation] - ) - - if list_key not in lists: - lists.append(list_key) - - # Delete the lists that are known to be unneeded at this point. - for del_list in del_lists: - del the_dict[del_list] - - for list_key in lists: - the_list = the_dict[list_key] - - # Initialize the list_actions list, which is parallel to the_list. Each - # item in list_actions identifies whether the corresponding item in - # the_list should be excluded, unconditionally preserved (included), or - # whether no exclusion or inclusion has been applied. Items for which - # no exclusion or inclusion has been applied (yet) have value -1, items - # excluded have value 0, and items included have value 1. Includes and - # excludes override previous actions. All items in list_actions are - # initialized to -1 because no excludes or includes have been processed - # yet. - list_actions = list((-1,) * len(the_list)) - - exclude_key = list_key + "!" - if exclude_key in the_dict: - for exclude_item in the_dict[exclude_key]: - for index, list_item in enumerate(the_list): - if exclude_item == list_item: - # This item matches the exclude_item, so set its action to 0 - # (exclude). - list_actions[index] = 0 - - # The "whatever!" list is no longer needed, dump it. - del the_dict[exclude_key] - - regex_key = list_key + "/" - if regex_key in the_dict: - for regex_item in the_dict[regex_key]: - [action, pattern] = regex_item - pattern_re = re.compile(pattern) - - if action == "exclude": - # This item matches an exclude regex, set its value to 0 (exclude). - action_value = 0 - elif action == "include": - # This item matches an include regex, set its value to 1 (include). - action_value = 1 - else: - # This is an action that doesn't make any sense. - raise ValueError( - "Unrecognized action " - + action - + " in " - + name - + " key " - + regex_key - ) - - for index, list_item in enumerate(the_list): - if list_actions[index] == action_value: - # Even if the regex matches, nothing will change so continue - # (regex searches are expensive). - continue - if pattern_re.search(list_item): - # Regular expression match. - list_actions[index] = action_value - - # The "whatever/" list is no longer needed, dump it. - del the_dict[regex_key] - - # Add excluded items to the excluded list. - # - # Note that exclude_key ("sources!") is different from excluded_key - # ("sources_excluded"). The exclude_key list is input and it was already - # processed and deleted; the excluded_key list is output and it's about - # to be created. - excluded_key = list_key + "_excluded" - if excluded_key in the_dict: - raise GypError( - name + " key " + excluded_key + " must not be present prior " - " to applying exclusion/regex filters for " + list_key - ) - - excluded_list = [] - - # Go backwards through the list_actions list so that as items are deleted, - # the indices of items that haven't been seen yet don't shift. That means - # that things need to be prepended to excluded_list to maintain them in the - # same order that they existed in the_list. - for index in range(len(list_actions) - 1, -1, -1): - if list_actions[index] == 0: - # Dump anything with action 0 (exclude). Keep anything with action 1 - # (include) or -1 (no include or exclude seen for the item). - excluded_list.insert(0, the_list[index]) - del the_list[index] - - # If anything was excluded, put the excluded list into the_dict at - # excluded_key. - if len(excluded_list) > 0: - the_dict[excluded_key] = excluded_list - - # Now recurse into subdicts and lists that may contain dicts. - for key, value in the_dict.items(): - if isinstance(value, dict): - ProcessListFiltersInDict(key, value) - elif isinstance(value, list): - ProcessListFiltersInList(key, value) - - -def ProcessListFiltersInList(name, the_list): - for item in the_list: - if isinstance(item, dict): - ProcessListFiltersInDict(name, item) - elif isinstance(item, list): - ProcessListFiltersInList(name, item) - - -def ValidateTargetType(target, target_dict): - """Ensures the 'type' field on the target is one of the known types. - - Arguments: - target: string, name of target. - target_dict: dict, target spec. - - Raises an exception on error. - """ - VALID_TARGET_TYPES = ( - "executable", - "loadable_module", - "static_library", - "shared_library", - "mac_kernel_extension", - "none", - "windows_driver", - ) - target_type = target_dict.get("type", None) - if target_type not in VALID_TARGET_TYPES: - raise GypError( - "Target %s has an invalid target type '%s'. " - "Must be one of %s." % (target, target_type, "/".join(VALID_TARGET_TYPES)) - ) - if ( - target_dict.get("standalone_static_library", 0) - and not target_type == "static_library" - ): - raise GypError( - "Target %s has type %s but standalone_static_library flag is" - " only valid for static_library type." % (target, target_type) - ) - - -def ValidateRulesInTarget(target, target_dict, extra_sources_for_rules): - """Ensures that the rules sections in target_dict are valid and consistent, - and determines which sources they apply to. - - Arguments: - target: string, name of target. - target_dict: dict, target spec containing "rules" and "sources" lists. - extra_sources_for_rules: a list of keys to scan for rule matches in - addition to 'sources'. - """ - - # Dicts to map between values found in rules' 'rule_name' and 'extension' - # keys and the rule dicts themselves. - rule_names = {} - rule_extensions = {} - - rules = target_dict.get("rules", []) - for rule in rules: - # Make sure that there's no conflict among rule names and extensions. - rule_name = rule["rule_name"] - if rule_name in rule_names: - raise GypError(f"rule {rule_name} exists in duplicate, target {target}") - rule_names[rule_name] = rule - - rule_extension = rule["extension"] - if rule_extension.startswith("."): - rule_extension = rule_extension[1:] - if rule_extension in rule_extensions: - raise GypError( - ( - "extension %s associated with multiple rules, " - + "target %s rules %s and %s" - ) - % ( - rule_extension, - target, - rule_extensions[rule_extension]["rule_name"], - rule_name, - ) - ) - rule_extensions[rule_extension] = rule - - # Make sure rule_sources isn't already there. It's going to be - # created below if needed. - if "rule_sources" in rule: - raise GypError( - "rule_sources must not exist in input, target %s rule %s" - % (target, rule_name) - ) - - rule_sources = [] - source_keys = ["sources"] - source_keys.extend(extra_sources_for_rules) - for source_key in source_keys: - for source in target_dict.get(source_key, []): - (_source_root, source_extension) = os.path.splitext(source) - if source_extension.startswith("."): - source_extension = source_extension[1:] - if source_extension == rule_extension: - rule_sources.append(source) - - if len(rule_sources) > 0: - rule["rule_sources"] = rule_sources - - -def ValidateRunAsInTarget(target, target_dict, build_file): - target_name = target_dict.get("target_name") - run_as = target_dict.get("run_as") - if not run_as: - return - if not isinstance(run_as, dict): - raise GypError( - "The 'run_as' in target %s from file %s should be a " - "dictionary." % (target_name, build_file) - ) - action = run_as.get("action") - if not action: - raise GypError( - "The 'run_as' in target %s from file %s must have an " - "'action' section." % (target_name, build_file) - ) - if not isinstance(action, list): - raise GypError( - "The 'action' for 'run_as' in target %s from file %s " - "must be a list." % (target_name, build_file) - ) - working_directory = run_as.get("working_directory") - if working_directory and not isinstance(working_directory, str): - raise GypError( - "The 'working_directory' for 'run_as' in target %s " - "in file %s should be a string." % (target_name, build_file) - ) - environment = run_as.get("environment") - if environment and not isinstance(environment, dict): - raise GypError( - "The 'environment' for 'run_as' in target %s " - "in file %s should be a dictionary." % (target_name, build_file) - ) - - -def ValidateActionsInTarget(target, target_dict, build_file): - """Validates the inputs to the actions in a target.""" - target_name = target_dict.get("target_name") - actions = target_dict.get("actions", []) - for action in actions: - action_name = action.get("action_name") - if not action_name: - raise GypError( - "Anonymous action in target %s. " - "An action must have an 'action_name' field." % target_name - ) - inputs = action.get("inputs", None) - if inputs is None: - raise GypError("Action in target %s has no inputs." % target_name) - action_command = action.get("action") - if action_command and not action_command[0]: - raise GypError("Empty action as command in target %s." % target_name) - - -def TurnIntIntoStrInDict(the_dict): - """Given dict the_dict, recursively converts all integers into strings.""" - # Use items instead of iteritems because there's no need to try to look at - # reinserted keys and their associated values. - for k, v in the_dict.items(): - if isinstance(v, int): - v = str(v) - the_dict[k] = v - elif isinstance(v, dict): - TurnIntIntoStrInDict(v) - elif isinstance(v, list): - TurnIntIntoStrInList(v) - - if isinstance(k, int): - del the_dict[k] - the_dict[str(k)] = v - - -def TurnIntIntoStrInList(the_list): - """Given list the_list, recursively converts all integers into strings.""" - for index, item in enumerate(the_list): - if isinstance(item, int): - the_list[index] = str(item) - elif isinstance(item, dict): - TurnIntIntoStrInDict(item) - elif isinstance(item, list): - TurnIntIntoStrInList(item) - - -def PruneUnwantedTargets(targets, flat_list, dependency_nodes, root_targets, data): - """Return only the targets that are deep dependencies of |root_targets|.""" - qualified_root_targets = [] - for target in root_targets: - target = target.strip() - qualified_targets = gyp.common.FindQualifiedTargets(target, flat_list) - if not qualified_targets: - raise GypError("Could not find target %s" % target) - qualified_root_targets.extend(qualified_targets) - - wanted_targets = {} - for target in qualified_root_targets: - wanted_targets[target] = targets[target] - for dependency in dependency_nodes[target].DeepDependencies(): - wanted_targets[dependency] = targets[dependency] - - wanted_flat_list = [t for t in flat_list if t in wanted_targets] - - # Prune unwanted targets from each build_file's data dict. - for build_file in data["target_build_files"]: - if "targets" not in data[build_file]: - continue - new_targets = [] - for target in data[build_file]["targets"]: - qualified_name = gyp.common.QualifiedTarget( - build_file, target["target_name"], target["toolset"] - ) - if qualified_name in wanted_targets: - new_targets.append(target) - data[build_file]["targets"] = new_targets - - return wanted_targets, wanted_flat_list - - -def VerifyNoCollidingTargets(targets): - """Verify that no two targets in the same directory share the same name. - - Arguments: - targets: A list of targets in the form 'path/to/file.gyp:target_name'. - """ - # Keep a dict going from 'subdirectory:target_name' to 'foo.gyp'. - used = {} - for target in targets: - # Separate out 'path/to/file.gyp, 'target_name' from - # 'path/to/file.gyp:target_name'. - path, name = target.rsplit(":", 1) - # Separate out 'path/to', 'file.gyp' from 'path/to/file.gyp'. - subdir, gyp = os.path.split(path) - # Use '.' for the current directory '', so that the error messages make - # more sense. - if not subdir: - subdir = "." - # Prepare a key like 'path/to:target_name'. - key = subdir + ":" + name - if key in used: - # Complain if this target is already used. - raise GypError( - 'Duplicate target name "%s" in directory "%s" used both ' - 'in "%s" and "%s".' % (name, subdir, gyp, used[key]) - ) - used[key] = gyp - - -def SetGeneratorGlobals(generator_input_info): - # Set up path_sections and non_configuration_keys with the default data plus - # the generator-specific data. - global path_sections - path_sections = set(base_path_sections) - path_sections.update(generator_input_info["path_sections"]) - - global non_configuration_keys - non_configuration_keys = base_non_configuration_keys[:] - non_configuration_keys.extend(generator_input_info["non_configuration_keys"]) - - global multiple_toolsets - multiple_toolsets = generator_input_info["generator_supports_multiple_toolsets"] - - global generator_filelist_paths - generator_filelist_paths = generator_input_info["generator_filelist_paths"] - - -def Load( - build_files, - variables, - includes, - depth, - generator_input_info, - check, - circular_check, - parallel, - root_targets, -): - SetGeneratorGlobals(generator_input_info) - # A generator can have other lists (in addition to sources) be processed - # for rules. - extra_sources_for_rules = generator_input_info["extra_sources_for_rules"] - - # Load build files. This loads every target-containing build file into - # the |data| dictionary such that the keys to |data| are build file names, - # and the values are the entire build file contents after "early" or "pre" - # processing has been done and includes have been resolved. - # NOTE: data contains both "target" files (.gyp) and "includes" (.gypi), as - # well as meta-data (e.g. 'included_files' key). 'target_build_files' keeps - # track of the keys corresponding to "target" files. - data = {"target_build_files": set()} - # Normalize paths everywhere. This is important because paths will be - # used as keys to the data dict and for references between input files. - build_files = set(map(os.path.normpath, build_files)) - if parallel: - LoadTargetBuildFilesParallel( - build_files, data, variables, includes, depth, check, generator_input_info - ) - else: - aux_data = {} - for build_file in build_files: - try: - LoadTargetBuildFile( - build_file, data, aux_data, variables, includes, depth, check, True - ) - except Exception as e: - gyp.common.ExceptionAppend(e, "while trying to load %s" % build_file) - raise - - # Build a dict to access each target's subdict by qualified name. - targets = BuildTargetsDict(data) - - # Fully qualify all dependency links. - QualifyDependencies(targets) - - # Remove self-dependencies from targets that have 'prune_self_dependencies' - # set to 1. - RemoveSelfDependencies(targets) - - # Expand dependencies specified as build_file:*. - ExpandWildcardDependencies(targets, data) - - # Remove all dependencies marked as 'link_dependency' from the targets of - # type 'none'. - RemoveLinkDependenciesFromNoneTargets(targets) - - # Apply exclude (!) and regex (/) list filters only for dependency_sections. - for target_name, target_dict in targets.items(): - tmp_dict = {} - for key_base in dependency_sections: - for op in ("", "!", "/"): - key = key_base + op - if key in target_dict: - tmp_dict[key] = target_dict[key] - del target_dict[key] - ProcessListFiltersInDict(target_name, tmp_dict) - # Write the results back to |target_dict|. - for key, value in tmp_dict.items(): - target_dict[key] = value - - # Make sure every dependency appears at most once. - RemoveDuplicateDependencies(targets) - - if circular_check: - # Make sure that any targets in a.gyp don't contain dependencies in other - # .gyp files that further depend on a.gyp. - VerifyNoGYPFileCircularDependencies(targets) - - [dependency_nodes, flat_list] = BuildDependencyList(targets) - - if root_targets: - # Remove, from |targets| and |flat_list|, the targets that are not deep - # dependencies of the targets specified in |root_targets|. - targets, flat_list = PruneUnwantedTargets( - targets, flat_list, dependency_nodes, root_targets, data - ) - - # Check that no two targets in the same directory have the same name. - VerifyNoCollidingTargets(flat_list) - - # Handle dependent settings of various types. - for settings_type in [ - "all_dependent_settings", - "direct_dependent_settings", - "link_settings", - ]: - DoDependentSettings(settings_type, flat_list, targets, dependency_nodes) - - # Take out the dependent settings now that they've been published to all - # of the targets that require them. - for target in flat_list: - if settings_type in targets[target]: - del targets[target][settings_type] - - # Make sure static libraries don't declare dependencies on other static - # libraries, but that linkables depend on all unlinked static libraries - # that they need so that their link steps will be correct. - gii = generator_input_info - if gii["generator_wants_static_library_dependencies_adjusted"]: - AdjustStaticLibraryDependencies( - flat_list, - targets, - dependency_nodes, - gii["generator_wants_sorted_dependencies"], - ) - - # Apply "post"/"late"/"target" variable expansions and condition evaluations. - for target in flat_list: - target_dict = targets[target] - build_file = gyp.common.BuildFile(target) - ProcessVariablesAndConditionsInDict( - target_dict, PHASE_LATE, variables, build_file - ) - - # Move everything that can go into a "configurations" section into one. - for target in flat_list: - target_dict = targets[target] - SetUpConfigurations(target, target_dict) - - # Apply exclude (!) and regex (/) list filters. - for target in flat_list: - target_dict = targets[target] - ProcessListFiltersInDict(target, target_dict) - - # Apply "latelate" variable expansions and condition evaluations. - for target in flat_list: - target_dict = targets[target] - build_file = gyp.common.BuildFile(target) - ProcessVariablesAndConditionsInDict( - target_dict, PHASE_LATELATE, variables, build_file - ) - - # Make sure that the rules make sense, and build up rule_sources lists as - # needed. Not all generators will need to use the rule_sources lists, but - # some may, and it seems best to build the list in a common spot. - # Also validate actions and run_as elements in targets. - for target in flat_list: - target_dict = targets[target] - build_file = gyp.common.BuildFile(target) - ValidateTargetType(target, target_dict) - ValidateRulesInTarget(target, target_dict, extra_sources_for_rules) - ValidateRunAsInTarget(target, target_dict, build_file) - ValidateActionsInTarget(target, target_dict, build_file) - - # Generators might not expect ints. Turn them into strs. - TurnIntIntoStrInDict(data) - - # TODO(mark): Return |data| for now because the generator needs a list of - # build files that came in. In the future, maybe it should just accept - # a list, and not the whole data dict. - return [flat_list, targets, data] diff --git a/tools/gyp/pylib/gyp/input_test.py b/tools/gyp/pylib/gyp/input_test.py deleted file mode 100755 index ff8c8fbecc3..00000000000 --- a/tools/gyp/pylib/gyp/input_test.py +++ /dev/null @@ -1,99 +0,0 @@ -#!/usr/bin/env python3 - -# Copyright 2013 Google Inc. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Unit tests for the input.py file.""" - -import unittest - -import gyp.input - - -class TestFindCycles(unittest.TestCase): - def setUp(self): - self.nodes = {} - for x in ("a", "b", "c", "d", "e"): - self.nodes[x] = gyp.input.DependencyGraphNode(x) - - def _create_dependency(self, dependent, dependency): - dependent.dependencies.append(dependency) - dependency.dependents.append(dependent) - - def test_no_cycle_empty_graph(self): - for label, node in self.nodes.items(): - self.assertEqual([], node.FindCycles()) - - def test_no_cycle_line(self): - self._create_dependency(self.nodes["a"], self.nodes["b"]) - self._create_dependency(self.nodes["b"], self.nodes["c"]) - self._create_dependency(self.nodes["c"], self.nodes["d"]) - - for label, node in self.nodes.items(): - self.assertEqual([], node.FindCycles()) - - def test_no_cycle_dag(self): - self._create_dependency(self.nodes["a"], self.nodes["b"]) - self._create_dependency(self.nodes["a"], self.nodes["c"]) - self._create_dependency(self.nodes["b"], self.nodes["c"]) - - for label, node in self.nodes.items(): - self.assertEqual([], node.FindCycles()) - - def test_cycle_self_reference(self): - self._create_dependency(self.nodes["a"], self.nodes["a"]) - - self.assertEqual( - [[self.nodes["a"], self.nodes["a"]]], self.nodes["a"].FindCycles() - ) - - def test_cycle_two_nodes(self): - self._create_dependency(self.nodes["a"], self.nodes["b"]) - self._create_dependency(self.nodes["b"], self.nodes["a"]) - - self.assertEqual( - [[self.nodes["a"], self.nodes["b"], self.nodes["a"]]], - self.nodes["a"].FindCycles(), - ) - self.assertEqual( - [[self.nodes["b"], self.nodes["a"], self.nodes["b"]]], - self.nodes["b"].FindCycles(), - ) - - def test_two_cycles(self): - self._create_dependency(self.nodes["a"], self.nodes["b"]) - self._create_dependency(self.nodes["b"], self.nodes["a"]) - - self._create_dependency(self.nodes["b"], self.nodes["c"]) - self._create_dependency(self.nodes["c"], self.nodes["b"]) - - cycles = self.nodes["a"].FindCycles() - self.assertTrue([self.nodes["a"], self.nodes["b"], self.nodes["a"]] in cycles) - self.assertTrue([self.nodes["b"], self.nodes["c"], self.nodes["b"]] in cycles) - self.assertEqual(2, len(cycles)) - - def test_big_cycle(self): - self._create_dependency(self.nodes["a"], self.nodes["b"]) - self._create_dependency(self.nodes["b"], self.nodes["c"]) - self._create_dependency(self.nodes["c"], self.nodes["d"]) - self._create_dependency(self.nodes["d"], self.nodes["e"]) - self._create_dependency(self.nodes["e"], self.nodes["a"]) - - self.assertEqual( - [ - [ - self.nodes["a"], - self.nodes["b"], - self.nodes["c"], - self.nodes["d"], - self.nodes["e"], - self.nodes["a"], - ] - ], - self.nodes["a"].FindCycles(), - ) - - -if __name__ == "__main__": - unittest.main() diff --git a/tools/gyp/pylib/gyp/mac_tool.py b/tools/gyp/pylib/gyp/mac_tool.py deleted file mode 100755 index 4c38f0586c4..00000000000 --- a/tools/gyp/pylib/gyp/mac_tool.py +++ /dev/null @@ -1,765 +0,0 @@ -#!/usr/bin/env python3 -# Copyright (c) 2012 Google Inc. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Utility functions to perform Xcode-style build steps. - -These functions are executed via gyp-mac-tool when using the Makefile generator. -""" - -import fcntl -import fnmatch -import glob -import json -import os -import plistlib -import re -import shutil -import struct -import subprocess -import sys -import tempfile - - -def main(args): - executor = MacTool() - if (exit_code := executor.Dispatch(args)) is not None: - sys.exit(exit_code) - - -class MacTool: - """This class performs all the Mac tooling steps. The methods can either be - executed directly, or dispatched from an argument list.""" - - def Dispatch(self, args): - """Dispatches a string command to a method.""" - if len(args) < 1: - raise Exception("Not enough arguments") - - method = "Exec%s" % self._CommandifyName(args[0]) - return getattr(self, method)(*args[1:]) - - def _CommandifyName(self, name_string): - """Transforms a tool name like copy-info-plist to CopyInfoPlist""" - return name_string.title().replace("-", "") - - def ExecCopyBundleResource(self, source, dest, convert_to_binary): - """Copies a resource file to the bundle/Resources directory, performing any - necessary compilation on each resource.""" - convert_to_binary = convert_to_binary == "True" - extension = os.path.splitext(source)[1].lower() - if os.path.isdir(source): - # Copy tree. - # TODO(thakis): This copies file attributes like mtime, while the - # single-file branch below doesn't. This should probably be changed to - # be consistent with the single-file branch. - if os.path.exists(dest): - shutil.rmtree(dest) - shutil.copytree(source, dest) - elif extension in {".xib", ".storyboard"}: - return self._CopyXIBFile(source, dest) - elif extension == ".strings" and not convert_to_binary: - self._CopyStringsFile(source, dest) - else: - if os.path.exists(dest): - os.unlink(dest) - shutil.copy(source, dest) - - if convert_to_binary and extension in {".plist", ".strings"}: - self._ConvertToBinary(dest) - - def _CopyXIBFile(self, source, dest): - """Compiles a XIB file with ibtool into a binary plist in the bundle.""" - - # ibtool sometimes crashes with relative paths. See crbug.com/314728. - base = os.path.dirname(os.path.realpath(__file__)) - if os.path.relpath(source): - source = os.path.join(base, source) - if os.path.relpath(dest): - dest = os.path.join(base, dest) - - args = ["xcrun", "ibtool", "--errors", "--warnings", "--notices"] - - if os.environ["XCODE_VERSION_ACTUAL"] > "0700": - args.extend(["--auto-activate-custom-fonts"]) - if "IPHONEOS_DEPLOYMENT_TARGET" in os.environ: - args.extend( - [ - "--target-device", - "iphone", - "--target-device", - "ipad", - "--minimum-deployment-target", - os.environ["IPHONEOS_DEPLOYMENT_TARGET"], - ] - ) - else: - args.extend( - [ - "--target-device", - "mac", - "--minimum-deployment-target", - os.environ["MACOSX_DEPLOYMENT_TARGET"], - ] - ) - - args.extend( - ["--output-format", "human-readable-text", "--compile", dest, source] - ) - - ibtool_section_re = re.compile(r"/\*.*\*/") - ibtool_re = re.compile(r".*note:.*is clipping its content") - try: - stdout = subprocess.check_output(args) - except subprocess.CalledProcessError as e: - print(e.output) - raise - current_section_header = None - for line in stdout.splitlines(): - if ibtool_section_re.match(line): - current_section_header = line - elif not ibtool_re.match(line): - if current_section_header: - print(current_section_header) - current_section_header = None - print(line) - return 0 - - def _ConvertToBinary(self, dest): - subprocess.check_call( - ["xcrun", "plutil", "-convert", "binary1", "-o", dest, dest] - ) - - def _CopyStringsFile(self, source, dest): - """Copies a .strings file using iconv to reconvert the input into UTF-16.""" - input_code = self._DetectInputEncoding(source) or "UTF-8" - - # Xcode's CpyCopyStringsFile / builtin-copyStrings seems to call - # CFPropertyListCreateFromXMLData() behind the scenes; at least it prints - # CFPropertyListCreateFromXMLData(): Old-style plist parser: missing - # semicolon in dictionary. - # on invalid files. Do the same kind of validation. - import CoreFoundation # noqa: PLC0415 - - with open(source, "rb") as in_file: - s = in_file.read() - d = CoreFoundation.CFDataCreate(None, s, len(s)) - _, error = CoreFoundation.CFPropertyListCreateFromXMLData(None, d, 0, None) - if error: - return - - with open(dest, "wb") as fp: - fp.write(s.decode(input_code).encode("UTF-16")) - - def _DetectInputEncoding(self, file_name): - """Reads the first few bytes from file_name and tries to guess the text - encoding. Returns None as a guess if it can't detect it.""" - with open(file_name, "rb") as fp: - try: - header = fp.read(3) - except Exception: - return None - if header.startswith((b"\xfe\xff", b"\xff\xfe")): - return "UTF-16" - elif header.startswith(b"\xef\xbb\xbf"): - return "UTF-8" - else: - return None - - def ExecCopyInfoPlist(self, source, dest, convert_to_binary, *keys): - """Copies the |source| Info.plist to the destination directory |dest|.""" - # Read the source Info.plist into memory. - with open(source) as fd: - lines = fd.read() - - # Insert synthesized key/value pairs (e.g. BuildMachineOSBuild). - plist = plistlib.readPlistFromString(lines) - if keys: - plist.update(json.loads(keys[0])) - lines = plistlib.writePlistToString(plist) - - # Go through all the environment variables and replace them as variables in - # the file. - IDENT_RE = re.compile(r"[_/\s]") - for key in os.environ: - if key.startswith("_"): - continue - evar = "${%s}" % key - evalue = os.environ[key] - lines = lines.replace(lines, evar, evalue) - - # Xcode supports various suffices on environment variables, which are - # all undocumented. :rfc1034identifier is used in the standard project - # template these days, and :identifier was used earlier. They are used to - # convert non-url characters into things that look like valid urls -- - # except that the replacement character for :identifier, '_' isn't valid - # in a URL either -- oops, hence :rfc1034identifier was born. - evar = "${%s:identifier}" % key - evalue = IDENT_RE.sub("_", os.environ[key]) - lines = lines.replace(lines, evar, evalue) - - evar = "${%s:rfc1034identifier}" % key - evalue = IDENT_RE.sub("-", os.environ[key]) - lines = lines.replace(lines, evar, evalue) - - # Remove any keys with values that haven't been replaced. - lines = lines.splitlines() - for i in range(len(lines)): - if lines[i].strip().startswith("${"): - lines[i] = None - lines[i - 1] = None - lines = "\n".join(line for line in lines if line is not None) - - # Write out the file with variables replaced. - with open(dest, "w") as fd: - fd.write(lines) - - # Now write out PkgInfo file now that the Info.plist file has been - # "compiled". - self._WritePkgInfo(dest) - - if convert_to_binary == "True": - self._ConvertToBinary(dest) - - def _WritePkgInfo(self, info_plist): - """This writes the PkgInfo file from the data stored in Info.plist.""" - plist = plistlib.readPlist(info_plist) - if not plist: - return - - # Only create PkgInfo for executable types. - package_type = plist["CFBundlePackageType"] - if package_type != "APPL": - return - - # The format of PkgInfo is eight characters, representing the bundle type - # and bundle signature, each four characters. If that is missing, four - # '?' characters are used instead. - signature_code = plist.get("CFBundleSignature", "????") - if len(signature_code) != 4: # Wrong length resets everything, too. - signature_code = "?" * 4 - - dest = os.path.join(os.path.dirname(info_plist), "PkgInfo") - with open(dest, "w") as fp: - fp.write(f"{package_type}{signature_code}") - - def ExecFlock(self, lockfile, *cmd_list): - """Emulates the most basic behavior of Linux's flock(1).""" - # Rely on exception handling to report errors. - fd = os.open(lockfile, os.O_RDONLY | os.O_NOCTTY | os.O_CREAT, 0o666) - fcntl.flock(fd, fcntl.LOCK_EX) - return subprocess.call(cmd_list) - - def ExecFilterLibtool(self, *cmd_list): - """Calls libtool and filters out '/path/to/libtool: file: foo.o has no - symbols'.""" - libtool_re = re.compile( - r"^.*libtool: (?:for architecture: \S* )?file: .* has no symbols$" - ) - libtool_re5 = re.compile( - r"^.*libtool: warning for library: " - + r".* the table of contents is empty " - + r"\(no object file members in the library define global symbols\)$" - ) - env = os.environ.copy() - # Ref: - # http://www.opensource.apple.com/source/cctools/cctools-809/misc/libtool.c - # The problem with this flag is that it resets the file mtime on the file to - # epoch=0, e.g. 1970-1-1 or 1969-12-31 depending on timezone. - env["ZERO_AR_DATE"] = "1" - libtoolout = subprocess.Popen(cmd_list, stderr=subprocess.PIPE, env=env) - err = libtoolout.communicate()[1].decode("utf-8") - for line in err.splitlines(): - if not libtool_re.match(line) and not libtool_re5.match(line): - print(line, file=sys.stderr) - # Unconditionally touch the output .a file on the command line if present - # and the command succeeded. A bit hacky. - if not libtoolout.returncode: - for i in range(len(cmd_list) - 1): - if cmd_list[i] == "-o" and cmd_list[i + 1].endswith(".a"): - os.utime(cmd_list[i + 1], None) - break - return libtoolout.returncode - - def ExecPackageIosFramework(self, framework): - # Find the name of the binary based on the part before the ".framework". - binary = os.path.basename(framework).split(".")[0] - module_path = os.path.join(framework, "Modules") - if not os.path.exists(module_path): - os.mkdir(module_path) - module_template = ( - "framework module %s {\n" - ' umbrella header "%s.h"\n' - "\n" - " export *\n" - " module * { export * }\n" - "}\n" % (binary, binary) - ) - - with open(os.path.join(module_path, "module.modulemap"), "w") as module_file: - module_file.write(module_template) - - def ExecPackageFramework(self, framework, version): - """Takes a path to Something.framework and the Current version of that and - sets up all the symlinks.""" - # Find the name of the binary based on the part before the ".framework". - binary = os.path.basename(framework).split(".")[0] - - CURRENT = "Current" - RESOURCES = "Resources" - VERSIONS = "Versions" - - if not os.path.exists(os.path.join(framework, VERSIONS, version, binary)): - # Binary-less frameworks don't seem to contain symlinks (see e.g. - # chromium's out/Debug/org.chromium.Chromium.manifest/ bundle). - return - - # Move into the framework directory to set the symlinks correctly. - pwd = os.getcwd() - os.chdir(framework) - - # Set up the Current version. - self._Relink(version, os.path.join(VERSIONS, CURRENT)) - - # Set up the root symlinks. - self._Relink(os.path.join(VERSIONS, CURRENT, binary), binary) - self._Relink(os.path.join(VERSIONS, CURRENT, RESOURCES), RESOURCES) - - # Back to where we were before! - os.chdir(pwd) - - def _Relink(self, dest, link): - """Creates a symlink to |dest| named |link|. If |link| already exists, - it is overwritten.""" - if os.path.lexists(link): - os.remove(link) - os.symlink(dest, link) - - def ExecCompileIosFrameworkHeaderMap(self, out, framework, *all_headers): - framework_name = os.path.basename(framework).split(".")[0] - all_headers = [os.path.abspath(header) for header in all_headers] - filelist = {} - for header in all_headers: - filename = os.path.basename(header) - filelist[filename] = header - filelist[os.path.join(framework_name, filename)] = header - WriteHmap(out, filelist) - - def ExecCopyIosFrameworkHeaders(self, framework, *copy_headers): - header_path = os.path.join(framework, "Headers") - if not os.path.exists(header_path): - os.makedirs(header_path) - for header in copy_headers: - shutil.copy(header, os.path.join(header_path, os.path.basename(header))) - - def ExecCompileXcassets(self, keys, *inputs): - """Compiles multiple .xcassets files into a single .car file. - - This invokes 'actool' to compile all the inputs .xcassets files. The - |keys| arguments is a json-encoded dictionary of extra arguments to - pass to 'actool' when the asset catalogs contains an application icon - or a launch image. - - Note that 'actool' does not create the Assets.car file if the asset - catalogs does not contains imageset. - """ - command_line = [ - "xcrun", - "actool", - "--output-format", - "human-readable-text", - "--compress-pngs", - "--notices", - "--warnings", - "--errors", - ] - is_iphone_target = "IPHONEOS_DEPLOYMENT_TARGET" in os.environ - if is_iphone_target: - platform = os.environ["CONFIGURATION"].split("-")[-1] - if platform not in ("iphoneos", "iphonesimulator"): - platform = "iphonesimulator" - command_line.extend( - [ - "--platform", - platform, - "--target-device", - "iphone", - "--target-device", - "ipad", - "--minimum-deployment-target", - os.environ["IPHONEOS_DEPLOYMENT_TARGET"], - "--compile", - os.path.abspath(os.environ["CONTENTS_FOLDER_PATH"]), - ] - ) - else: - command_line.extend( - [ - "--platform", - "macosx", - "--target-device", - "mac", - "--minimum-deployment-target", - os.environ["MACOSX_DEPLOYMENT_TARGET"], - "--compile", - os.path.abspath(os.environ["UNLOCALIZED_RESOURCES_FOLDER_PATH"]), - ] - ) - if keys: - keys = json.loads(keys) - for key, value in keys.items(): - arg_name = "--" + key - if isinstance(value, bool): - if value: - command_line.append(arg_name) - elif isinstance(value, list): - for v in value: - command_line.append(arg_name) - command_line.append(str(v)) - else: - command_line.append(arg_name) - command_line.append(str(value)) - # Note: actool crashes if inputs path are relative, so use os.path.abspath - # to get absolute path name for inputs. - command_line.extend(map(os.path.abspath, inputs)) - subprocess.check_call(command_line) - - def ExecMergeInfoPlist(self, output, *inputs): - """Merge multiple .plist files into a single .plist file.""" - merged_plist = {} - for path in inputs: - plist = self._LoadPlistMaybeBinary(path) - self._MergePlist(merged_plist, plist) - plistlib.writePlist(merged_plist, output) - - def ExecCodeSignBundle(self, key, entitlements, provisioning, path, preserve): - """Code sign a bundle. - - This function tries to code sign an iOS bundle, following the same - algorithm as Xcode: - 1. pick the provisioning profile that best match the bundle identifier, - and copy it into the bundle as embedded.mobileprovision, - 2. copy Entitlements.plist from user or SDK next to the bundle, - 3. code sign the bundle. - """ - substitutions, overrides = self._InstallProvisioningProfile( - provisioning, self._GetCFBundleIdentifier() - ) - entitlements_path = self._InstallEntitlements( - entitlements, substitutions, overrides - ) - - args = ["codesign", "--force", "--sign", key] - if preserve == "True": - args.extend(["--deep", "--preserve-metadata=identifier,entitlements"]) - else: - args.extend(["--entitlements", entitlements_path]) - args.extend(["--timestamp=none", path]) - subprocess.check_call(args) - - def _InstallProvisioningProfile(self, profile, bundle_identifier): - """Installs embedded.mobileprovision into the bundle. - - Args: - profile: string, optional, short name of the .mobileprovision file - to use, if empty or the file is missing, the best file installed - will be used - bundle_identifier: string, value of CFBundleIdentifier from Info.plist - - Returns: - A tuple containing two dictionary: variables substitutions and values - to overrides when generating the entitlements file. - """ - source_path, provisioning_data, team_id = self._FindProvisioningProfile( - profile, bundle_identifier - ) - target_path = os.path.join( - os.environ["BUILT_PRODUCTS_DIR"], - os.environ["CONTENTS_FOLDER_PATH"], - "embedded.mobileprovision", - ) - shutil.copy2(source_path, target_path) - substitutions = self._GetSubstitutions(bundle_identifier, team_id + ".") - return substitutions, provisioning_data["Entitlements"] - - def _FindProvisioningProfile(self, profile, bundle_identifier): - """Finds the .mobileprovision file to use for signing the bundle. - - Checks all the installed provisioning profiles (or if the user specified - the PROVISIONING_PROFILE variable, only consult it) and select the most - specific that correspond to the bundle identifier. - - Args: - profile: string, optional, short name of the .mobileprovision file - to use, if empty or the file is missing, the best file installed - will be used - bundle_identifier: string, value of CFBundleIdentifier from Info.plist - - Returns: - A tuple of the path to the selected provisioning profile, the data of - the embedded plist in the provisioning profile and the team identifier - to use for code signing. - - Raises: - SystemExit: if no .mobileprovision can be used to sign the bundle. - """ - profiles_dir = os.path.join( - os.environ["HOME"], "Library", "MobileDevice", "Provisioning Profiles" - ) - if not os.path.isdir(profiles_dir): - print( - "cannot find mobile provisioning for %s" % (bundle_identifier), - file=sys.stderr, - ) - sys.exit(1) - provisioning_profiles = None - if profile: - profile_path = os.path.join(profiles_dir, profile + ".mobileprovision") - if os.path.exists(profile_path): - provisioning_profiles = [profile_path] - if not provisioning_profiles: - provisioning_profiles = glob.glob( - os.path.join(profiles_dir, "*.mobileprovision") - ) - valid_provisioning_profiles = {} - for profile_path in provisioning_profiles: - profile_data = self._LoadProvisioningProfile(profile_path) - app_id_pattern = profile_data.get("Entitlements", {}).get( - "application-identifier", "" - ) - for team_identifier in profile_data.get("TeamIdentifier", []): - app_id = f"{team_identifier}.{bundle_identifier}" - if fnmatch.fnmatch(app_id, app_id_pattern): - valid_provisioning_profiles[app_id_pattern] = ( - profile_path, - profile_data, - team_identifier, - ) - if not valid_provisioning_profiles: - print( - "cannot find mobile provisioning for %s" % (bundle_identifier), - file=sys.stderr, - ) - sys.exit(1) - # If the user has multiple provisioning profiles installed that can be - # used for ${bundle_identifier}, pick the most specific one (ie. the - # provisioning profile whose pattern is the longest). - selected_key = max(valid_provisioning_profiles, key=len) - return valid_provisioning_profiles[selected_key] - - def _LoadProvisioningProfile(self, profile_path): - """Extracts the plist embedded in a provisioning profile. - - Args: - profile_path: string, path to the .mobileprovision file - - Returns: - Content of the plist embedded in the provisioning profile as a dictionary. - """ - with tempfile.NamedTemporaryFile() as temp: - subprocess.check_call( - ["security", "cms", "-D", "-i", profile_path, "-o", temp.name] - ) - return self._LoadPlistMaybeBinary(temp.name) - - def _MergePlist(self, merged_plist, plist): - """Merge |plist| into |merged_plist|.""" - for key, value in plist.items(): - if isinstance(value, dict): - merged_value = merged_plist.get(key, {}) - if isinstance(merged_value, dict): - self._MergePlist(merged_value, value) - merged_plist[key] = merged_value - else: - merged_plist[key] = value - else: - merged_plist[key] = value - - def _LoadPlistMaybeBinary(self, plist_path): - """Loads into a memory a plist possibly encoded in binary format. - - This is a wrapper around plistlib.readPlist that tries to convert the - plist to the XML format if it can't be parsed (assuming that it is in - the binary format). - - Args: - plist_path: string, path to a plist file, in XML or binary format - - Returns: - Content of the plist as a dictionary. - """ - try: - # First, try to read the file using plistlib that only supports XML, - # and if an exception is raised, convert a temporary copy to XML and - # load that copy. - return plistlib.readPlist(plist_path) - except Exception: - pass - with tempfile.NamedTemporaryFile() as temp: - shutil.copy2(plist_path, temp.name) - subprocess.check_call(["plutil", "-convert", "xml1", temp.name]) - return plistlib.readPlist(temp.name) - - def _GetSubstitutions(self, bundle_identifier, app_identifier_prefix): - """Constructs a dictionary of variable substitutions for Entitlements.plist. - - Args: - bundle_identifier: string, value of CFBundleIdentifier from Info.plist - app_identifier_prefix: string, value for AppIdentifierPrefix - - Returns: - Dictionary of substitutions to apply when generating Entitlements.plist. - """ - return { - "CFBundleIdentifier": bundle_identifier, - "AppIdentifierPrefix": app_identifier_prefix, - } - - def _GetCFBundleIdentifier(self): - """Extracts CFBundleIdentifier value from Info.plist in the bundle. - - Returns: - Value of CFBundleIdentifier in the Info.plist located in the bundle. - """ - info_plist_path = os.path.join( - os.environ["TARGET_BUILD_DIR"], os.environ["INFOPLIST_PATH"] - ) - info_plist_data = self._LoadPlistMaybeBinary(info_plist_path) - return info_plist_data["CFBundleIdentifier"] - - def _InstallEntitlements(self, entitlements, substitutions, overrides): - """Generates and install the ${BundleName}.xcent entitlements file. - - Expands variables "$(variable)" pattern in the source entitlements file, - add extra entitlements defined in the .mobileprovision file and the copy - the generated plist to "${BundlePath}.xcent". - - Args: - entitlements: string, optional, path to the Entitlements.plist template - to use, defaults to "${SDKROOT}/Entitlements.plist" - substitutions: dictionary, variable substitutions - overrides: dictionary, values to add to the entitlements - - Returns: - Path to the generated entitlements file. - """ - source_path = entitlements - target_path = os.path.join( - os.environ["BUILT_PRODUCTS_DIR"], os.environ["PRODUCT_NAME"] + ".xcent" - ) - if not source_path: - source_path = os.path.join(os.environ["SDKROOT"], "Entitlements.plist") - shutil.copy2(source_path, target_path) - data = self._LoadPlistMaybeBinary(target_path) - data = self._ExpandVariables(data, substitutions) - if overrides: - for key in overrides: - if key not in data: - data[key] = overrides[key] - plistlib.writePlist(data, target_path) - return target_path - - def _ExpandVariables(self, data, substitutions): - """Expands variables "$(variable)" in data. - - Args: - data: object, can be either string, list or dictionary - substitutions: dictionary, variable substitutions to perform - - Returns: - Copy of data where each references to "$(variable)" has been replaced - by the corresponding value found in substitutions, or left intact if - the key was not found. - """ - if isinstance(data, str): - for key, value in substitutions.items(): - data = data.replace("$(%s)" % key, value) - return data - if isinstance(data, list): - return [self._ExpandVariables(v, substitutions) for v in data] - if isinstance(data, dict): - return {k: self._ExpandVariables(data[k], substitutions) for k in data} - return data - - -def NextGreaterPowerOf2(x): - return 2 ** (x).bit_length() - - -def WriteHmap(output_name, filelist): - """Generates a header map based on |filelist|. - - Per Mark Mentovai: - A header map is structured essentially as a hash table, keyed by names used - in #includes, and providing pathnames to the actual files. - - The implementation below and the comment above comes from inspecting: - http://www.opensource.apple.com/source/distcc/distcc-2503/distcc_dist/include_server/headermap.py?txt - while also looking at the implementation in clang in: - https://llvm.org/svn/llvm-project/cfe/trunk/lib/Lex/HeaderMap.cpp - """ - magic = 1751998832 - version = 1 - _reserved = 0 - count = len(filelist) - capacity = NextGreaterPowerOf2(count) - strings_offset = 24 + (12 * capacity) - max_value_length = max(len(value) for value in filelist.values()) - - out = open(output_name, "wb") - out.write( - struct.pack( - " 0 or arg.count("/") > 1: - arg = os.path.normpath(arg) - - # For a literal quote, CommandLineToArgvW requires 2n+1 backslashes - # preceding it, and results in n backslashes + the quote. So we substitute - # in 2* what we match, +1 more, plus the quote. - if quote_cmd: - arg = windows_quoter_regex.sub(lambda mo: 2 * mo.group(1) + '\\"', arg) - - # %'s also need to be doubled otherwise they're interpreted as batch - # positional arguments. Also make sure to escape the % so that they're - # passed literally through escaping so they can be singled to just the - # original %. Otherwise, trying to pass the literal representation that - # looks like an environment variable to the shell (e.g. %PATH%) would fail. - arg = arg.replace("%", "%%") - - # These commands are used in rsp files, so no escaping for the shell (via ^) - # is necessary. - - # As a workaround for programs that don't use CommandLineToArgvW, gyp - # supports msvs_quote_cmd=0, which simply disables all quoting. - if quote_cmd: - # Finally, wrap the whole thing in quotes so that the above quote rule - # applies and whitespace isn't a word break. - return f'"{arg}"' - - return arg - - -def EncodeRspFileList(args, quote_cmd): - """Process a list of arguments using QuoteCmdExeArgument.""" - # Note that the first argument is assumed to be the command. Don't add - # quotes around it because then built-ins like 'echo', etc. won't work. - # Take care to normpath only the path in the case of 'call ../x.bat' because - # otherwise the whole thing is incorrectly interpreted as a path and not - # normalized correctly. - if not args: - return "" - if args[0].startswith("call "): - call, program = args[0].split(" ", 1) - program = call + " " + os.path.normpath(program) - else: - program = os.path.normpath(args[0]) - return program + " " + " ".join(QuoteForRspFile(arg, quote_cmd) for arg in args[1:]) - - -def _GenericRetrieve(root, default, path): - """Given a list of dictionary keys |path| and a tree of dicts |root|, find - value at path, or return |default| if any of the path doesn't exist.""" - if not root: - return default - if not path: - return root - return _GenericRetrieve(root.get(path[0]), default, path[1:]) - - -def _AddPrefix(element, prefix): - """Add |prefix| to |element| or each subelement if element is iterable.""" - if element is None: - return element - # Note, not Iterable because we don't want to handle strings like that. - if isinstance(element, (list, tuple)): - return [prefix + e for e in element] - else: - return prefix + element - - -def _DoRemapping(element, map): - """If |element| then remap it through |map|. If |element| is iterable then - each item will be remapped. Any elements not found will be removed.""" - if map is not None and element is not None: - if not callable(map): - map = map.get # Assume it's a dict, otherwise a callable to do the remap. - if isinstance(element, (list, tuple)): - element = filter(None, [map(elem) for elem in element]) - else: - element = map(element) - return element - - -def _AppendOrReturn(append, element): - """If |append| is None, simply return |element|. If |append| is not None, - then add |element| to it, adding each item in |element| if it's a list or - tuple.""" - if append is not None and element is not None: - if isinstance(element, (list, tuple)): - append.extend(element) - else: - append.append(element) - else: - return element - - -def _FindDirectXInstallation(): - """Try to find an installation location for the DirectX SDK. Check for the - standard environment variable, and if that doesn't exist, try to find - via the registry. May return None if not found in either location.""" - # Return previously calculated value, if there is one - if hasattr(_FindDirectXInstallation, "dxsdk_dir"): - return _FindDirectXInstallation.dxsdk_dir - - dxsdk_dir = os.environ.get("DXSDK_DIR") - if not dxsdk_dir: - # Setup params to pass to and attempt to launch reg.exe. - cmd = ["reg.exe", "query", r"HKLM\Software\Microsoft\DirectX", "/s"] - p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - stdout = p.communicate()[0].decode("utf-8") - for line in stdout.splitlines(): - if "InstallPath" in line: - dxsdk_dir = line.split(" ")[3] + "\\" - - # Cache return value - _FindDirectXInstallation.dxsdk_dir = dxsdk_dir - return dxsdk_dir - - -def GetGlobalVSMacroEnv(vs_version): - """Get a dict of variables mapping internal VS macro names to their gyp - equivalents. Returns all variables that are independent of the target.""" - env = {} - # '$(VSInstallDir)' and '$(VCInstallDir)' are available when and only when - # Visual Studio is actually installed. - if vs_version.Path(): - env["$(VSInstallDir)"] = vs_version.Path() - env["$(VCInstallDir)"] = os.path.join(vs_version.Path(), "VC") + "\\" - # Chromium uses DXSDK_DIR in include/lib paths, but it may or may not be - # set. This happens when the SDK is sync'd via src-internal, rather than - # by typical end-user installation of the SDK. If it's not set, we don't - # want to leave the unexpanded variable in the path, so simply strip it. - dxsdk_dir = _FindDirectXInstallation() - env["$(DXSDK_DIR)"] = dxsdk_dir if dxsdk_dir else "" - # Try to find an installation location for the Windows DDK by checking - # the WDK_DIR environment variable, may be None. - env["$(WDK_DIR)"] = os.environ.get("WDK_DIR", "") - return env - - -def ExtractSharedMSVSSystemIncludes(configs, generator_flags): - """Finds msvs_system_include_dirs that are common to all targets, removes - them from all targets, and returns an OrderedSet containing them.""" - all_system_includes = OrderedSet(configs[0].get("msvs_system_include_dirs", [])) - for config in configs[1:]: - system_includes = config.get("msvs_system_include_dirs", []) - all_system_includes = all_system_includes & OrderedSet(system_includes) - if not all_system_includes: - return None - # Expand macros in all_system_includes. - env = GetGlobalVSMacroEnv(GetVSVersion(generator_flags)) - expanded_system_includes = OrderedSet( - [ExpandMacros(include, env) for include in all_system_includes] - ) - if any("$" in include for include in expanded_system_includes): - # Some path relies on target-specific variables, bail. - return None - - # Remove system includes shared by all targets from the targets. - for config in configs: - includes = config.get("msvs_system_include_dirs", []) - if includes: # Don't insert a msvs_system_include_dirs key if not needed. - # This must check the unexpanded includes list: - new_includes = [i for i in includes if i not in all_system_includes] - config["msvs_system_include_dirs"] = new_includes - return expanded_system_includes - - -class MsvsSettings: - """A class that understands the gyp 'msvs_...' values (especially the - msvs_settings field). They largely correpond to the VS2008 IDE DOM. This - class helps map those settings to command line options.""" - - def __init__(self, spec, generator_flags): - self.spec = spec - self.vs_version = GetVSVersion(generator_flags) - - supported_fields = [ - ("msvs_configuration_attributes", dict), - ("msvs_settings", dict), - ("msvs_system_include_dirs", list), - ("msvs_disabled_warnings", list), - ("msvs_precompiled_header", str), - ("msvs_precompiled_source", str), - ("msvs_configuration_platform", str), - ("msvs_target_platform", str), - ] - configs = spec["configurations"] - for field, default in supported_fields: - setattr(self, field, {}) - for configname, config in configs.items(): - getattr(self, field)[configname] = config.get(field, default()) - - self.msvs_cygwin_dirs = spec.get("msvs_cygwin_dirs", ["."]) - - unsupported_fields = [ - "msvs_prebuild", - "msvs_postbuild", - ] - unsupported = [] - for field in unsupported_fields: - for config in configs.values(): - if field in config: - unsupported += [ - "{} not supported (target {}).".format( - field, spec["target_name"] - ) - ] - if unsupported: - raise Exception("\n".join(unsupported)) - - def GetExtension(self): - """Returns the extension for the target, with no leading dot. - - Uses 'product_extension' if specified, otherwise uses MSVS defaults based on - the target type. - """ - ext = self.spec.get("product_extension", None) - return ext or gyp.MSVSUtil.TARGET_TYPE_EXT.get(self.spec["type"], "") - - def GetVSMacroEnv(self, base_to_build=None, config=None): - """Get a dict of variables mapping internal VS macro names to their gyp - equivalents.""" - target_arch = self.GetArch(config) - target_platform = "Win32" if target_arch == "x86" else target_arch - target_name = self.spec.get("product_prefix", "") + self.spec.get( - "product_name", self.spec["target_name"] - ) - target_dir = base_to_build + "\\" if base_to_build else "" - target_ext = "." + self.GetExtension() - target_file_name = target_name + target_ext - - replacements = { - "$(InputName)": "${root}", - "$(InputPath)": "${source}", - "$(IntDir)": "$!INTERMEDIATE_DIR", - "$(OutDir)\\": target_dir, - "$(PlatformName)": target_platform, - "$(ProjectDir)\\": "", - "$(ProjectName)": self.spec["target_name"], - "$(TargetDir)\\": target_dir, - "$(TargetExt)": target_ext, - "$(TargetFileName)": target_file_name, - "$(TargetName)": target_name, - "$(TargetPath)": os.path.join(target_dir, target_file_name), - } - replacements.update(GetGlobalVSMacroEnv(self.vs_version)) - return replacements - - def ConvertVSMacros(self, s, base_to_build=None, config=None): - """Convert from VS macro names to something equivalent.""" - env = self.GetVSMacroEnv(base_to_build, config=config) - return ExpandMacros(s, env) - - def AdjustLibraries(self, libraries): - """Strip -l from library if it's specified with that.""" - libs = [lib[2:] if lib.startswith("-l") else lib for lib in libraries] - return [ - lib + ".lib" - if not lib.lower().endswith(".lib") and not lib.lower().endswith(".obj") - else lib - for lib in libs - ] - - def _GetAndMunge(self, field, path, default, prefix, append, map): - """Retrieve a value from |field| at |path| or return |default|. If - |append| is specified, and the item is found, it will be appended to that - object instead of returned. If |map| is specified, results will be - remapped through |map| before being returned or appended.""" - result = _GenericRetrieve(field, default, path) - result = _DoRemapping(result, map) - result = _AddPrefix(result, prefix) - return _AppendOrReturn(append, result) - - class _GetWrapper: - def __init__(self, parent, field, base_path, append=None): - self.parent = parent - self.field = field - self.base_path = [base_path] - self.append = append - - def __call__(self, name, map=None, prefix="", default=None): - return self.parent._GetAndMunge( - self.field, - self.base_path + [name], - default=default, - prefix=prefix, - append=self.append, - map=map, - ) - - def GetArch(self, config): - """Get architecture based on msvs_configuration_platform and - msvs_target_platform. Returns either 'x86' or 'x64'.""" - configuration_platform = self.msvs_configuration_platform.get(config, "") - platform = self.msvs_target_platform.get(config, "") - if not platform: # If no specific override, use the configuration's. - platform = configuration_platform - # Map from platform to architecture. - return {"Win32": "x86", "x64": "x64", "ARM64": "arm64"}.get(platform, "x86") - - def _TargetConfig(self, config): - """Returns the target-specific configuration.""" - # There's two levels of architecture/platform specification in VS. The - # first level is globally for the configuration (this is what we consider - # "the" config at the gyp level, which will be something like 'Debug' or - # 'Release'), VS2015 and later only use this level - if int(self.vs_version.short_name) >= 2015: - return config - # and a second target-specific configuration, which is an - # override for the global one. |config| is remapped here to take into - # account the local target-specific overrides to the global configuration. - arch = self.GetArch(config) - if arch == "x64" and not config.endswith("_x64"): - config += "_x64" - if arch == "x86" and config.endswith("_x64"): - config = config.rsplit("_", 1)[0] - return config - - def _Setting(self, path, config, default=None, prefix="", append=None, map=None): - """_GetAndMunge for msvs_settings.""" - return self._GetAndMunge( - self.msvs_settings[config], path, default, prefix, append, map - ) - - def _ConfigAttrib( - self, path, config, default=None, prefix="", append=None, map=None - ): - """_GetAndMunge for msvs_configuration_attributes.""" - return self._GetAndMunge( - self.msvs_configuration_attributes[config], - path, - default, - prefix, - append, - map, - ) - - def AdjustIncludeDirs(self, include_dirs, config): - """Updates include_dirs to expand VS specific paths, and adds the system - include dirs used for platform SDK and similar.""" - config = self._TargetConfig(config) - includes = include_dirs + self.msvs_system_include_dirs[config] - includes.extend( - self._Setting( - ("VCCLCompilerTool", "AdditionalIncludeDirectories"), config, default=[] - ) - ) - return [self.ConvertVSMacros(p, config=config) for p in includes] - - def AdjustMidlIncludeDirs(self, midl_include_dirs, config): - """Updates midl_include_dirs to expand VS specific paths, and adds the - system include dirs used for platform SDK and similar.""" - config = self._TargetConfig(config) - includes = midl_include_dirs + self.msvs_system_include_dirs[config] - includes.extend( - self._Setting( - ("VCMIDLTool", "AdditionalIncludeDirectories"), config, default=[] - ) - ) - return [self.ConvertVSMacros(p, config=config) for p in includes] - - def GetComputedDefines(self, config): - """Returns the set of defines that are injected to the defines list based - on other VS settings.""" - config = self._TargetConfig(config) - defines = [] - if self._ConfigAttrib(["CharacterSet"], config) == "1": - defines.extend(("_UNICODE", "UNICODE")) - if self._ConfigAttrib(["CharacterSet"], config) == "2": - defines.append("_MBCS") - defines.extend( - self._Setting( - ("VCCLCompilerTool", "PreprocessorDefinitions"), config, default=[] - ) - ) - return defines - - def GetCompilerPdbName(self, config, expand_special): - """Get the pdb file name that should be used for compiler invocations, or - None if there's no explicit name specified.""" - config = self._TargetConfig(config) - pdbname = self._Setting(("VCCLCompilerTool", "ProgramDataBaseFileName"), config) - if pdbname: - pdbname = expand_special(self.ConvertVSMacros(pdbname)) - return pdbname - - def GetMapFileName(self, config, expand_special): - """Gets the explicitly overridden map file name for a target or returns None - if it's not set.""" - config = self._TargetConfig(config) - map_file = self._Setting(("VCLinkerTool", "MapFileName"), config) - if map_file: - map_file = expand_special(self.ConvertVSMacros(map_file, config=config)) - return map_file - - def GetOutputName(self, config, expand_special): - """Gets the explicitly overridden output name for a target or returns None - if it's not overridden.""" - config = self._TargetConfig(config) - type = self.spec["type"] - root = "VCLibrarianTool" if type == "static_library" else "VCLinkerTool" - # TODO(scottmg): Handle OutputDirectory without OutputFile. - output_file = self._Setting((root, "OutputFile"), config) - if output_file: - output_file = expand_special( - self.ConvertVSMacros(output_file, config=config) - ) - return output_file - - def GetPDBName(self, config, expand_special, default): - """Gets the explicitly overridden pdb name for a target or returns - default if it's not overridden, or if no pdb will be generated.""" - config = self._TargetConfig(config) - output_file = self._Setting(("VCLinkerTool", "ProgramDatabaseFile"), config) - generate_debug_info = self._Setting( - ("VCLinkerTool", "GenerateDebugInformation"), config - ) - if generate_debug_info == "true": - if output_file: - return expand_special(self.ConvertVSMacros(output_file, config=config)) - else: - return default - else: - return None - - def GetNoImportLibrary(self, config): - """If NoImportLibrary: true, ninja will not expect the output to include - an import library.""" - config = self._TargetConfig(config) - noimplib = self._Setting(("NoImportLibrary",), config) - return noimplib == "true" - - def GetAsmflags(self, config): - """Returns the flags that need to be added to ml invocations.""" - config = self._TargetConfig(config) - asmflags = [] - safeseh = self._Setting(("MASM", "UseSafeExceptionHandlers"), config) - if safeseh == "true": - asmflags.append("/safeseh") - return asmflags - - def GetCflags(self, config): - """Returns the flags that need to be added to .c and .cc compilations.""" - config = self._TargetConfig(config) - cflags = [] - cflags.extend(["/wd" + w for w in self.msvs_disabled_warnings[config]]) - cl = self._GetWrapper( - self, self.msvs_settings[config], "VCCLCompilerTool", append=cflags - ) - cl( - "Optimization", - map={"0": "d", "1": "1", "2": "2", "3": "x"}, - prefix="/O", - default="2", - ) - cl("InlineFunctionExpansion", prefix="/Ob") - cl("DisableSpecificWarnings", prefix="/wd") - cl("StringPooling", map={"true": "/GF"}) - cl("EnableFiberSafeOptimizations", map={"true": "/GT"}) - cl("OmitFramePointers", map={"false": "-", "true": ""}, prefix="/Oy") - cl("EnableIntrinsicFunctions", map={"false": "-", "true": ""}, prefix="/Oi") - cl("FavorSizeOrSpeed", map={"1": "t", "2": "s"}, prefix="/O") - cl( - "FloatingPointModel", - map={"0": "precise", "1": "strict", "2": "fast"}, - prefix="/fp:", - default="0", - ) - cl("CompileAsManaged", map={"false": "", "true": "/clr"}) - cl("WholeProgramOptimization", map={"true": "/GL"}) - cl("WarningLevel", prefix="/W") - cl("WarnAsError", map={"true": "/WX"}) - cl( - "CallingConvention", - map={"0": "d", "1": "r", "2": "z", "3": "v"}, - prefix="/G", - ) - cl("DebugInformationFormat", map={"1": "7", "3": "i", "4": "I"}, prefix="/Z") - cl("RuntimeTypeInfo", map={"true": "/GR", "false": "/GR-"}) - cl("EnableFunctionLevelLinking", map={"true": "/Gy", "false": "/Gy-"}) - cl("MinimalRebuild", map={"true": "/Gm"}) - cl("BufferSecurityCheck", map={"true": "/GS", "false": "/GS-"}) - cl("BasicRuntimeChecks", map={"1": "s", "2": "u", "3": "1"}, prefix="/RTC") - cl( - "RuntimeLibrary", - map={"0": "T", "1": "Td", "2": "D", "3": "Dd"}, - prefix="/M", - ) - cl("ExceptionHandling", map={"1": "sc", "2": "a"}, prefix="/EH") - cl("DefaultCharIsUnsigned", map={"true": "/J"}) - cl( - "TreatWChar_tAsBuiltInType", - map={"false": "-", "true": ""}, - prefix="/Zc:wchar_t", - ) - cl("EnablePREfast", map={"true": "/analyze"}) - cl("AdditionalOptions", prefix="") - cl( - "EnableEnhancedInstructionSet", - map={"1": "SSE", "2": "SSE2", "3": "AVX", "4": "IA32", "5": "AVX2"}, - prefix="/arch:", - ) - cflags.extend( - [ - "/FI" + f - for f in self._Setting( - ("VCCLCompilerTool", "ForcedIncludeFiles"), config, default=[] - ) - ] - ) - if float(self.vs_version.project_version) >= 12.0: - # New flag introduced in VS2013 (project version 12.0) Forces writes to - # the program database (PDB) to be serialized through MSPDBSRV.EXE. - # https://msdn.microsoft.com/en-us/library/dn502518.aspx - cflags.append("/FS") - # ninja handles parallelism by itself, don't have the compiler do it too. - cflags = [x for x in cflags if not x.startswith("/MP")] - return cflags - - def _GetPchFlags(self, config, extension): - """Get the flags to be added to the cflags for precompiled header support.""" - config = self._TargetConfig(config) - # The PCH is only built once by a particular source file. Usage of PCH must - # only be for the same language (i.e. C vs. C++), so only include the pch - # flags when the language matches. - if self.msvs_precompiled_header[config]: - source_ext = os.path.splitext(self.msvs_precompiled_source[config])[1] - if _LanguageMatchesForPch(source_ext, extension): - pch = self.msvs_precompiled_header[config] - pchbase = os.path.split(pch)[1] - return ["/Yu" + pch, "/FI" + pch, "/Fp${pchprefix}." + pchbase + ".pch"] - return [] - - def GetCflagsC(self, config): - """Returns the flags that need to be added to .c compilations.""" - config = self._TargetConfig(config) - return self._GetPchFlags(config, ".c") - - def GetCflagsCC(self, config): - """Returns the flags that need to be added to .cc compilations.""" - config = self._TargetConfig(config) - return ["/TP"] + self._GetPchFlags(config, ".cc") - - def _GetAdditionalLibraryDirectories(self, root, config, gyp_to_build_path): - """Get and normalize the list of paths in AdditionalLibraryDirectories - setting.""" - config = self._TargetConfig(config) - libpaths = self._Setting( - (root, "AdditionalLibraryDirectories"), config, default=[] - ) - libpaths = [ - os.path.normpath(gyp_to_build_path(self.ConvertVSMacros(p, config=config))) - for p in libpaths - ] - return ['/LIBPATH:"' + p + '"' for p in libpaths] - - def GetLibFlags(self, config, gyp_to_build_path): - """Returns the flags that need to be added to lib commands.""" - config = self._TargetConfig(config) - libflags = [] - lib = self._GetWrapper( - self, self.msvs_settings[config], "VCLibrarianTool", append=libflags - ) - libflags.extend( - self._GetAdditionalLibraryDirectories( - "VCLibrarianTool", config, gyp_to_build_path - ) - ) - lib("LinkTimeCodeGeneration", map={"true": "/LTCG"}) - lib( - "TargetMachine", - map={"1": "X86", "17": "X64", "3": "ARM"}, - prefix="/MACHINE:", - ) - lib("AdditionalOptions") - return libflags - - def GetDefFile(self, gyp_to_build_path): - """Returns the .def file from sources, if any. Otherwise returns None.""" - spec = self.spec - if spec["type"] in ("shared_library", "loadable_module", "executable"): - def_files = [ - s for s in spec.get("sources", []) if s.lower().endswith(".def") - ] - if len(def_files) == 1: - return gyp_to_build_path(def_files[0]) - elif len(def_files) > 1: - raise Exception("Multiple .def files") - return None - - def _GetDefFileAsLdflags(self, ldflags, gyp_to_build_path): - """.def files get implicitly converted to a ModuleDefinitionFile for the - linker in the VS generator. Emulate that behaviour here.""" - if def_file := self.GetDefFile(gyp_to_build_path): - ldflags.append('/DEF:"%s"' % def_file) - - def GetPGDName(self, config, expand_special): - """Gets the explicitly overridden pgd name for a target or returns None - if it's not overridden.""" - config = self._TargetConfig(config) - output_file = self._Setting(("VCLinkerTool", "ProfileGuidedDatabase"), config) - if output_file: - output_file = expand_special( - self.ConvertVSMacros(output_file, config=config) - ) - return output_file - - def GetLdflags( - self, - config, - gyp_to_build_path, - expand_special, - manifest_base_name, - output_name, - is_executable, - build_dir, - ): - """Returns the flags that need to be added to link commands, and the - manifest files.""" - config = self._TargetConfig(config) - ldflags = [] - ld = self._GetWrapper( - self, self.msvs_settings[config], "VCLinkerTool", append=ldflags - ) - self._GetDefFileAsLdflags(ldflags, gyp_to_build_path) - ld("GenerateDebugInformation", map={"true": "/DEBUG"}) - # TODO: These 'map' values come from machineTypeOption enum, - # and does not have an official value for ARM64 in VS2017 (yet). - # It needs to verify the ARM64 value when machineTypeOption is updated. - ld( - "TargetMachine", - map={"1": "X86", "17": "X64", "3": "ARM", "18": "ARM64"}, - prefix="/MACHINE:", - ) - ldflags.extend( - self._GetAdditionalLibraryDirectories( - "VCLinkerTool", config, gyp_to_build_path - ) - ) - ld("DelayLoadDLLs", prefix="/DELAYLOAD:") - ld("TreatLinkerWarningAsErrors", prefix="/WX", map={"true": "", "false": ":NO"}) - if out := self.GetOutputName(config, expand_special): - ldflags.append("/OUT:" + out) - if pdb := self.GetPDBName(config, expand_special, output_name + ".pdb"): - ldflags.append("/PDB:" + pdb) - if pgd := self.GetPGDName(config, expand_special): - ldflags.append("/PGD:" + pgd) - map_file = self.GetMapFileName(config, expand_special) - ld("GenerateMapFile", map={"true": "/MAP:" + map_file if map_file else "/MAP"}) - ld("MapExports", map={"true": "/MAPINFO:EXPORTS"}) - ld("AdditionalOptions", prefix="") - - minimum_required_version = self._Setting( - ("VCLinkerTool", "MinimumRequiredVersion"), config, default="" - ) - if minimum_required_version: - minimum_required_version = "," + minimum_required_version - ld( - "SubSystem", - map={ - "1": "CONSOLE%s" % minimum_required_version, - "2": "WINDOWS%s" % minimum_required_version, - }, - prefix="/SUBSYSTEM:", - ) - - stack_reserve_size = self._Setting( - ("VCLinkerTool", "StackReserveSize"), config, default="" - ) - if stack_reserve_size: - stack_commit_size = self._Setting( - ("VCLinkerTool", "StackCommitSize"), config, default="" - ) - if stack_commit_size: - stack_commit_size = "," + stack_commit_size - ldflags.append(f"/STACK:{stack_reserve_size}{stack_commit_size}") - - ld("TerminalServerAware", map={"1": ":NO", "2": ""}, prefix="/TSAWARE") - ld("LinkIncremental", map={"1": ":NO", "2": ""}, prefix="/INCREMENTAL") - ld("BaseAddress", prefix="/BASE:") - ld("FixedBaseAddress", map={"1": ":NO", "2": ""}, prefix="/FIXED") - ld("RandomizedBaseAddress", map={"1": ":NO", "2": ""}, prefix="/DYNAMICBASE") - ld("DataExecutionPrevention", map={"1": ":NO", "2": ""}, prefix="/NXCOMPAT") - ld("OptimizeReferences", map={"1": "NOREF", "2": "REF"}, prefix="/OPT:") - ld("ForceSymbolReferences", prefix="/INCLUDE:") - ld("EnableCOMDATFolding", map={"1": "NOICF", "2": "ICF"}, prefix="/OPT:") - ld( - "LinkTimeCodeGeneration", - map={"1": "", "2": ":PGINSTRUMENT", "3": ":PGOPTIMIZE", "4": ":PGUPDATE"}, - prefix="/LTCG", - ) - ld("IgnoreDefaultLibraryNames", prefix="/NODEFAULTLIB:") - ld("ResourceOnlyDLL", map={"true": "/NOENTRY"}) - ld("EntryPointSymbol", prefix="/ENTRY:") - ld("Profile", map={"true": "/PROFILE"}) - ld("LargeAddressAware", map={"1": ":NO", "2": ""}, prefix="/LARGEADDRESSAWARE") - # TODO(scottmg): This should sort of be somewhere else (not really a flag). - ld("AdditionalDependencies", prefix="") - - safeseh_default = "true" if self.GetArch(config) == "x86" else None - ld( - "ImageHasSafeExceptionHandlers", - map={"false": ":NO", "true": ""}, - prefix="/SAFESEH", - default=safeseh_default, - ) - - # If the base address is not specifically controlled, DYNAMICBASE should - # be on by default. - if not any("DYNAMICBASE" in flag or flag == "/FIXED" for flag in ldflags): - ldflags.append("/DYNAMICBASE") - - # If the NXCOMPAT flag has not been specified, default to on. Despite the - # documentation that says this only defaults to on when the subsystem is - # Vista or greater (which applies to the linker), the IDE defaults it on - # unless it's explicitly off. - if not any("NXCOMPAT" in flag for flag in ldflags): - ldflags.append("/NXCOMPAT") - - have_def_file = any(flag.startswith("/DEF:") for flag in ldflags) - ( - manifest_flags, - intermediate_manifest, - manifest_files, - ) = self._GetLdManifestFlags( - config, - manifest_base_name, - gyp_to_build_path, - is_executable and not have_def_file, - build_dir, - ) - ldflags.extend(manifest_flags) - return ldflags, intermediate_manifest, manifest_files - - def _GetLdManifestFlags( - self, config, name, gyp_to_build_path, allow_isolation, build_dir - ): - """Returns a 3-tuple: - - the set of flags that need to be added to the link to generate - a default manifest - - the intermediate manifest that the linker will generate that should be - used to assert it doesn't add anything to the merged one. - - the list of all the manifest files to be merged by the manifest tool and - included into the link.""" - generate_manifest = self._Setting( - ("VCLinkerTool", "GenerateManifest"), config, default="true" - ) - if generate_manifest != "true": - # This means not only that the linker should not generate the intermediate - # manifest but also that the manifest tool should do nothing even when - # additional manifests are specified. - return ["/MANIFEST:NO"], [], [] - - output_name = name + ".intermediate.manifest" - flags = [ - "/MANIFEST", - "/ManifestFile:" + output_name, - ] - - # Instead of using the MANIFESTUAC flags, we generate a .manifest to - # include into the list of manifests. This allows us to avoid the need to - # do two passes during linking. The /MANIFEST flag and /ManifestFile are - # still used, and the intermediate manifest is used to assert that the - # final manifest we get from merging all the additional manifest files - # (plus the one we generate here) isn't modified by merging the - # intermediate into it. - - # Always NO, because we generate a manifest file that has what we want. - flags.append("/MANIFESTUAC:NO") - - config = self._TargetConfig(config) - enable_uac = self._Setting( - ("VCLinkerTool", "EnableUAC"), config, default="true" - ) - manifest_files = [] - generated_manifest_outer = ( - "" - "" - "%s" - ) - if enable_uac == "true": - execution_level = self._Setting( - ("VCLinkerTool", "UACExecutionLevel"), config, default="0" - ) - execution_level_map = { - "0": "asInvoker", - "1": "highestAvailable", - "2": "requireAdministrator", - } - - ui_access = self._Setting( - ("VCLinkerTool", "UACUIAccess"), config, default="false" - ) - - level = execution_level_map[execution_level] - inner = f""" - - - - - - -""" - else: - inner = "" - - generated_manifest_contents = generated_manifest_outer % inner - generated_name = name + ".generated.manifest" - # Need to join with the build_dir here as we're writing it during - # generation time, but we return the un-joined version because the build - # will occur in that directory. We only write the file if the contents - # have changed so that simply regenerating the project files doesn't - # cause a relink. - build_dir_generated_name = os.path.join(build_dir, generated_name) - gyp.common.EnsureDirExists(build_dir_generated_name) - f = gyp.common.WriteOnDiff(build_dir_generated_name) - f.write(generated_manifest_contents) - f.close() - manifest_files = [generated_name] - - if allow_isolation: - flags.append("/ALLOWISOLATION") - - manifest_files += self._GetAdditionalManifestFiles(config, gyp_to_build_path) - return flags, output_name, manifest_files - - def _GetAdditionalManifestFiles(self, config, gyp_to_build_path): - """Gets additional manifest files that are added to the default one - generated by the linker.""" - files = self._Setting( - ("VCManifestTool", "AdditionalManifestFiles"), config, default=[] - ) - if isinstance(files, str): - files = files.split(";") - return [ - os.path.normpath(gyp_to_build_path(self.ConvertVSMacros(f, config=config))) - for f in files - ] - - def IsUseLibraryDependencyInputs(self, config): - """Returns whether the target should be linked via Use Library Dependency - Inputs (using component .objs of a given .lib).""" - config = self._TargetConfig(config) - uldi = self._Setting(("VCLinkerTool", "UseLibraryDependencyInputs"), config) - return uldi == "true" - - def IsEmbedManifest(self, config): - """Returns whether manifest should be linked into binary.""" - config = self._TargetConfig(config) - embed = self._Setting( - ("VCManifestTool", "EmbedManifest"), config, default="true" - ) - return embed == "true" - - def IsLinkIncremental(self, config): - """Returns whether the target should be linked incrementally.""" - config = self._TargetConfig(config) - link_inc = self._Setting(("VCLinkerTool", "LinkIncremental"), config) - return link_inc != "1" - - def GetRcflags(self, config, gyp_to_ninja_path): - """Returns the flags that need to be added to invocations of the resource - compiler.""" - config = self._TargetConfig(config) - rcflags = [] - rc = self._GetWrapper( - self, self.msvs_settings[config], "VCResourceCompilerTool", append=rcflags - ) - rc("AdditionalIncludeDirectories", map=gyp_to_ninja_path, prefix="/I") - rcflags.append("/I" + gyp_to_ninja_path(".")) - rc("PreprocessorDefinitions", prefix="/d") - # /l arg must be in hex without leading '0x' - rc("Culture", prefix="/l", map=lambda x: hex(int(x))[2:]) - return rcflags - - def BuildCygwinBashCommandLine(self, args, path_to_base): - """Build a command line that runs args via cygwin bash. We assume that all - incoming paths are in Windows normpath'd form, so they need to be - converted to posix style for the part of the command line that's passed to - bash. We also have to do some Visual Studio macro emulation here because - various rules use magic VS names for things. Also note that rules that - contain ninja variables cannot be fixed here (for example ${source}), so - the outer generator needs to make sure that the paths that are written out - are in posix style, if the command line will be used here.""" - cygwin_dir = os.path.normpath( - os.path.join(path_to_base, self.msvs_cygwin_dirs[0]) - ) - cd = ("cd %s" % path_to_base).replace("\\", "/") - args = [a.replace("\\", "/").replace('"', '\\"') for a in args] - args = ["'%s'" % a.replace("'", "'\\''") for a in args] - bash_cmd = " ".join(args) - cmd = ( - 'call "%s\\setup_env.bat" && set CYGWIN=nontsec && ' % cygwin_dir - + f'bash -c "{cd} ; {bash_cmd}"' - ) - return cmd - - RuleShellFlags = namedtuple("RuleShellFlags", ["cygwin", "quote"]) # noqa: PYI024 - - def GetRuleShellFlags(self, rule): - """Return RuleShellFlags about how the given rule should be run. This - includes whether it should run under cygwin (msvs_cygwin_shell), and - whether the commands should be quoted (msvs_quote_cmd).""" - # If the variable is unset, or set to 1 we use cygwin - cygwin = ( - int(rule.get("msvs_cygwin_shell", self.spec.get("msvs_cygwin_shell", 1))) - != 0 - ) - # Default to quoting. There's only a few special instances where the - # target command uses non-standard command line parsing and handle quotes - # and quote escaping differently. - quote_cmd = int(rule.get("msvs_quote_cmd", 1)) - assert quote_cmd != 0 or cygwin != 1, ( - "msvs_quote_cmd=0 only applicable for msvs_cygwin_shell=0" - ) - return MsvsSettings.RuleShellFlags(cygwin, quote_cmd) - - def _HasExplicitRuleForExtension(self, spec, extension): - """Determine if there's an explicit rule for a particular extension.""" - return any(rule["extension"] == extension for rule in spec.get("rules", [])) - - def _HasExplicitIdlActions(self, spec): - """Determine if an action should not run midl for .idl files.""" - return any( - action.get("explicit_idl_action", 0) for action in spec.get("actions", []) - ) - - def HasExplicitIdlRulesOrActions(self, spec): - """Determine if there's an explicit rule or action for idl files. When - there isn't we need to generate implicit rules to build MIDL .idl files.""" - return self._HasExplicitRuleForExtension( - spec, "idl" - ) or self._HasExplicitIdlActions(spec) - - def HasExplicitAsmRules(self, spec): - """Determine if there's an explicit rule for asm files. When there isn't we - need to generate implicit rules to assemble .asm files.""" - return self._HasExplicitRuleForExtension(spec, "asm") - - def GetIdlBuildData(self, source, config): - """Determine the implicit outputs for an idl file. Returns output - directory, outputs, and variables and flags that are required.""" - config = self._TargetConfig(config) - midl_get = self._GetWrapper(self, self.msvs_settings[config], "VCMIDLTool") - - def midl(name, default=None): - return self.ConvertVSMacros(midl_get(name, default=default), config=config) - - tlb = midl("TypeLibraryName", default="${root}.tlb") - header = midl("HeaderFileName", default="${root}.h") - dlldata = midl("DLLDataFileName", default="dlldata.c") - iid = midl("InterfaceIdentifierFileName", default="${root}_i.c") - proxy = midl("ProxyFileName", default="${root}_p.c") - # Note that .tlb is not included in the outputs as it is not always - # generated depending on the content of the input idl file. - outdir = midl("OutputDirectory", default="") - output = [header, dlldata, iid, proxy] - variables = [ - ("tlb", tlb), - ("h", header), - ("dlldata", dlldata), - ("iid", iid), - ("proxy", proxy), - ] - # TODO(scottmg): Are there configuration settings to set these flags? - target_platform = self.GetArch(config) - if target_platform == "x86": - target_platform = "win32" - flags = ["/char", "signed", "/env", target_platform, "/Oicf"] - return outdir, output, variables, flags - - -def _LanguageMatchesForPch(source_ext, pch_source_ext): - c_exts = (".c",) - cc_exts = (".cc", ".cxx", ".cpp") - return (source_ext in c_exts and pch_source_ext in c_exts) or ( - source_ext in cc_exts and pch_source_ext in cc_exts - ) - - -class PrecompiledHeader: - """Helper to generate dependencies and build rules to handle generation of - precompiled headers. Interface matches the GCH handler in xcode_emulation.py. - """ - - def __init__( - self, settings, config, gyp_to_build_path, gyp_to_unique_output, obj_ext - ): - self.settings = settings - self.config = config - pch_source = self.settings.msvs_precompiled_source[self.config] - self.pch_source = gyp_to_build_path(pch_source) - filename, _ = os.path.splitext(pch_source) - self.output_obj = gyp_to_unique_output(filename + obj_ext).lower() - - def _PchHeader(self): - """Get the header that will appear in an #include line for all source - files.""" - return self.settings.msvs_precompiled_header[self.config] - - def GetObjDependencies(self, sources, objs, arch): - """Given a list of sources files and the corresponding object files, - returns a list of the pch files that should be depended upon. The - additional wrapping in the return value is for interface compatibility - with make.py on Mac, and xcode_emulation.py.""" - assert arch is None - if not self._PchHeader(): - return [] - pch_ext = os.path.splitext(self.pch_source)[1] - for source in sources: - if _LanguageMatchesForPch(os.path.splitext(source)[1], pch_ext): - return [(None, None, self.output_obj)] - return [] - - def GetPchBuildCommands(self, arch): - """Not used on Windows as there are no additional build steps required - (instead, existing steps are modified in GetFlagsModifications below).""" - return [] - - def GetFlagsModifications( - self, input, output, implicit, command, cflags_c, cflags_cc, expand_special - ): - """Get the modified cflags and implicit dependencies that should be used - for the pch compilation step.""" - if input == self.pch_source: - pch_output = ["/Yc" + self._PchHeader()] - if command == "cxx": - return ( - [("cflags_cc", map(expand_special, cflags_cc + pch_output))], - self.output_obj, - [], - ) - elif command == "cc": - return ( - [("cflags_c", map(expand_special, cflags_c + pch_output))], - self.output_obj, - [], - ) - return [], output, implicit - - -vs_version = None - - -def GetVSVersion(generator_flags): - global vs_version - if not vs_version: - vs_version = gyp.MSVSVersion.SelectVisualStudioVersion( - generator_flags.get("msvs_version", "auto"), allow_fallback=False - ) - return vs_version - - -def _GetVsvarsSetupArgs(generator_flags, arch): - vs = GetVSVersion(generator_flags) - return vs.SetupScript() - - -def ExpandMacros(string, expansions): - """Expand $(Variable) per expansions dict. See MsvsSettings.GetVSMacroEnv - for the canonical way to retrieve a suitable dict.""" - if "$" in string: - for old, new in expansions.items(): - assert "$(" not in new, new - string = string.replace(old, new) - return string - - -def _ExtractImportantEnvironment(output_of_set): - """Extracts environment variables required for the toolchain to run from - a textual dump output by the cmd.exe 'set' command.""" - envvars_to_save = ( - "goma_.*", # TODO(scottmg): This is ugly, but needed for goma. - "include", - "lib", - "libpath", - "path", - "pathext", - "systemroot", - "temp", - "tmp", - ) - env = {} - # This occasionally happens and leads to misleading SYSTEMROOT error messages - # if not caught here. - if output_of_set.count("=") == 0: - raise Exception("Invalid output_of_set. Value is:\n%s" % output_of_set) - for line in output_of_set.splitlines(): - for envvar in envvars_to_save: - if re.match(envvar + "=", line.lower()): - var, setting = line.split("=", 1) - if envvar == "path": - # Our own rules (for running gyp-win-tool) and other actions in - # Chromium rely on python being in the path. Add the path to this - # python here so that if it's not in the path when ninja is run - # later, python will still be found. - setting = os.path.dirname(sys.executable) + os.pathsep + setting - env[var.upper()] = setting - break - for required in ("SYSTEMROOT", "TEMP", "TMP"): - if required not in env: - raise Exception( - 'Environment variable "%s" required to be set to valid path' % required - ) - return env - - -def _FormatAsEnvironmentBlock(envvar_dict): - """Format as an 'environment block' directly suitable for CreateProcess. - Briefly this is a list of key=value\0, terminated by an additional \0. See - CreateProcess documentation for more details.""" - block = "" - nul = "\0" - for key, value in envvar_dict.items(): - block += key + "=" + value + nul - block += nul - return block - - -def _ExtractCLPath(output_of_where): - """Gets the path to cl.exe based on the output of calling the environment - setup batch file, followed by the equivalent of `where`.""" - # Take the first line, as that's the first found in the PATH. - for line in output_of_where.strip().splitlines(): - if line.startswith("LOC:"): - return line[len("LOC:") :].strip() - - -def GenerateEnvironmentFiles( - toplevel_build_dir, generator_flags, system_includes, open_out -): - """It's not sufficient to have the absolute path to the compiler, linker, - etc. on Windows, as those tools rely on .dlls being in the PATH. We also - need to support both x86 and x64 compilers within the same build (to support - msvs_target_platform hackery). Different architectures require a different - compiler binary, and different supporting environment variables (INCLUDE, - LIB, LIBPATH). So, we extract the environment here, wrap all invocations - of compiler tools (cl, link, lib, rc, midl, etc.) via win_tool.py which - sets up the environment, and then we do not prefix the compiler with - an absolute path, instead preferring something like "cl.exe" in the rule - which will then run whichever the environment setup has put in the path. - When the following procedure to generate environment files does not - meet your requirement (e.g. for custom toolchains), you can pass - "-G ninja_use_custom_environment_files" to the gyp to suppress file - generation and use custom environment files prepared by yourself.""" - archs = ("x86", "x64", "arm64") - if generator_flags.get("ninja_use_custom_environment_files", 0): - cl_paths = {} - for arch in archs: - cl_paths[arch] = "cl.exe" - return cl_paths - vs = GetVSVersion(generator_flags) - cl_paths = {} - for arch in archs: - # Extract environment variables for subprocesses. - args = vs.SetupScript(arch) - args.extend(("&&", "set")) - popen = subprocess.Popen( - args, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT - ) - variables = popen.communicate()[0].decode("utf-8") - if popen.returncode != 0: - raise Exception('"%s" failed with error %d' % (args, popen.returncode)) - env = _ExtractImportantEnvironment(variables) - - # Inject system includes from gyp files into INCLUDE. - if system_includes: - system_includes = system_includes | OrderedSet( - env.get("INCLUDE", "").split(";") - ) - env["INCLUDE"] = ";".join(system_includes) - - env_block = _FormatAsEnvironmentBlock(env) - f = open_out(os.path.join(toplevel_build_dir, "environment." + arch), "w") - f.write(env_block) - f.close() - - # Find cl.exe location for this architecture. - args = vs.SetupScript(arch) - args.extend( - ("&&", "for", "%i", "in", "(cl.exe)", "do", "@echo", "LOC:%~$PATH:i") - ) - popen = subprocess.Popen(args, shell=True, stdout=subprocess.PIPE) - output = popen.communicate()[0].decode("utf-8") - cl_paths[arch] = _ExtractCLPath(output) - return cl_paths - - -def VerifyMissingSources(sources, build_dir, generator_flags, gyp_to_ninja): - """Emulate behavior of msvs_error_on_missing_sources present in the msvs - generator: Check that all regular source files, i.e. not created at run time, - exist on disk. Missing files cause needless recompilation when building via - VS, and we want this check to match for people/bots that build using ninja, - so they're not surprised when the VS build fails.""" - if int(generator_flags.get("msvs_error_on_missing_sources", 0)): - no_specials = filter(lambda x: "$" not in x, sources) - relative = [os.path.join(build_dir, gyp_to_ninja(s)) for s in no_specials] - missing = [x for x in relative if not os.path.exists(x)] - if missing: - # They'll look like out\Release\..\..\stuff\things.cc, so normalize the - # path for a slightly less crazy looking output. - cleaned_up = [os.path.normpath(x) for x in missing] - raise Exception("Missing input files:\n%s" % "\n".join(cleaned_up)) - - -# Sets some values in default_variables, which are required for many -# generators, run on Windows. -def CalculateCommonVariables(default_variables, params): - generator_flags = params.get("generator_flags", {}) - - # Set a variable so conditions can be based on msvs_version. - msvs_version = gyp.msvs_emulation.GetVSVersion(generator_flags) - default_variables["MSVS_VERSION"] = msvs_version.ShortName() - - # To determine processor word size on Windows, in addition to checking - # PROCESSOR_ARCHITECTURE (which reflects the word size of the current - # process), it is also necessary to check PROCESSOR_ARCHITEW6432 (which - # contains the actual word size of the system when running thru WOW64). - if "64" in os.environ.get("PROCESSOR_ARCHITECTURE", "") or "64" in os.environ.get( - "PROCESSOR_ARCHITEW6432", "" - ): - default_variables["MSVS_OS_BITS"] = 64 - else: - default_variables["MSVS_OS_BITS"] = 32 diff --git a/tools/gyp/pylib/gyp/ninja_syntax.py b/tools/gyp/pylib/gyp/ninja_syntax.py deleted file mode 100644 index 0e3e86c7430..00000000000 --- a/tools/gyp/pylib/gyp/ninja_syntax.py +++ /dev/null @@ -1,174 +0,0 @@ -# This file comes from -# https://github.com/martine/ninja/blob/master/misc/ninja_syntax.py -# Do not edit! Edit the upstream one instead. - -"""Python module for generating .ninja files. - -Note that this is emphatically not a required piece of Ninja; it's -just a helpful utility for build-file-generation systems that already -use Python. -""" - -import textwrap - - -def escape_path(word): - return word.replace("$ ", "$$ ").replace(" ", "$ ").replace(":", "$:") - - -class Writer: - def __init__(self, output, width=78): - self.output = output - self.width = width - - def newline(self): - self.output.write("\n") - - def comment(self, text): - for line in textwrap.wrap(text, self.width - 2): - self.output.write("# " + line + "\n") - - def variable(self, key, value, indent=0): - if value is None: - return - if isinstance(value, list): - value = " ".join(filter(None, value)) # Filter out empty strings. - self._line(f"{key} = {value}", indent) - - def pool(self, name, depth): - self._line("pool %s" % name) - self.variable("depth", depth, indent=1) - - def rule( - self, - name, - command, - description=None, - depfile=None, - generator=False, - pool=None, - restat=False, - rspfile=None, - rspfile_content=None, - deps=None, - ): - self._line("rule %s" % name) - self.variable("command", command, indent=1) - if description: - self.variable("description", description, indent=1) - if depfile: - self.variable("depfile", depfile, indent=1) - if generator: - self.variable("generator", "1", indent=1) - if pool: - self.variable("pool", pool, indent=1) - if restat: - self.variable("restat", "1", indent=1) - if rspfile: - self.variable("rspfile", rspfile, indent=1) - if rspfile_content: - self.variable("rspfile_content", rspfile_content, indent=1) - if deps: - self.variable("deps", deps, indent=1) - - def build( - self, outputs, rule, inputs=None, implicit=None, order_only=None, variables=None - ): - outputs = self._as_list(outputs) - all_inputs = self._as_list(inputs)[:] - out_outputs = list(map(escape_path, outputs)) - all_inputs = list(map(escape_path, all_inputs)) - - if implicit: - implicit = map(escape_path, self._as_list(implicit)) - all_inputs.append("|") - all_inputs.extend(implicit) - if order_only: - order_only = map(escape_path, self._as_list(order_only)) - all_inputs.append("||") - all_inputs.extend(order_only) - - self._line( - "build {}: {}".format(" ".join(out_outputs), " ".join([rule] + all_inputs)) - ) - - if variables: - if isinstance(variables, dict): - iterator = iter(variables.items()) - else: - iterator = iter(variables) - - for key, val in iterator: - self.variable(key, val, indent=1) - - return outputs - - def include(self, path): - self._line("include %s" % path) - - def subninja(self, path): - self._line("subninja %s" % path) - - def default(self, paths): - self._line("default %s" % " ".join(self._as_list(paths))) - - def _count_dollars_before_index(self, s, i): - """Returns the number of '$' characters right in front of s[i].""" - dollar_count = 0 - dollar_index = i - 1 - while dollar_index > 0 and s[dollar_index] == "$": - dollar_count += 1 - dollar_index -= 1 - return dollar_count - - def _line(self, text, indent=0): - """Write 'text' word-wrapped at self.width characters.""" - leading_space = " " * indent - while len(leading_space) + len(text) > self.width: - # The text is too wide; wrap if possible. - - # Find the rightmost space that would obey our width constraint and - # that's not an escaped space. - available_space = self.width - len(leading_space) - len(" $") - space = available_space - while True: - space = text.rfind(" ", 0, space) - if space < 0 or self._count_dollars_before_index(text, space) % 2 == 0: - break - - if space < 0: - # No such space; just use the first unescaped space we can find. - space = available_space - 1 - while True: - space = text.find(" ", space + 1) - if ( - space < 0 - or self._count_dollars_before_index(text, space) % 2 == 0 - ): - break - if space < 0: - # Give up on breaking. - break - - self.output.write(leading_space + text[0:space] + " $\n") - text = text[space + 1 :] - - # Subsequent lines are continuations, so indent them. - leading_space = " " * (indent + 2) - - self.output.write(leading_space + text + "\n") - - def _as_list(self, input): - if input is None: - return [] - if isinstance(input, list): - return input - return [input] - - -def escape(string): - """Escape a string such that it can be embedded into a Ninja file without - further interpretation.""" - assert "\n" not in string, "Ninja syntax does not allow newlines" - # We only have one special metacharacter: '$'. - return string.replace("$", "$$") diff --git a/tools/gyp/pylib/gyp/simple_copy.py b/tools/gyp/pylib/gyp/simple_copy.py deleted file mode 100644 index 2b9100f3e1b..00000000000 --- a/tools/gyp/pylib/gyp/simple_copy.py +++ /dev/null @@ -1,61 +0,0 @@ -# Copyright 2014 Google Inc. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""A clone of the default copy.deepcopy that doesn't handle cyclic -structures or complex types except for dicts and lists. This is -because gyp copies so large structure that small copy overhead ends up -taking seconds in a project the size of Chromium.""" - - -class Error(Exception): - pass - - -__all__ = ["Error", "deepcopy"] - - -def deepcopy(x): - """Deep copy operation on gyp objects such as strings, ints, dicts - and lists. More than twice as fast as copy.deepcopy but much less - generic.""" - - try: - return _deepcopy_dispatch[type(x)](x) - except KeyError: - raise Error( - f"Unsupported type {type(x)} for deepcopy. Use copy.deepcopy " - + "or expand simple_copy support." - ) - - -_deepcopy_dispatch = d = {} - - -def _deepcopy_atomic(x): - return x - - -types = bool, float, int, str, type, type(None) - -for x in types: - d[x] = _deepcopy_atomic - - -def _deepcopy_list(x): - return [deepcopy(a) for a in x] - - -d[list] = _deepcopy_list - - -def _deepcopy_dict(x): - y = {} - for key, value in x.items(): - y[deepcopy(key)] = deepcopy(value) - return y - - -d[dict] = _deepcopy_dict - -del d diff --git a/tools/gyp/pylib/gyp/win_tool.py b/tools/gyp/pylib/gyp/win_tool.py deleted file mode 100755 index 43665577bdd..00000000000 --- a/tools/gyp/pylib/gyp/win_tool.py +++ /dev/null @@ -1,371 +0,0 @@ -#!/usr/bin/env python3 - -# Copyright (c) 2012 Google Inc. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Utility functions for Windows builds. - -These functions are executed via gyp-win-tool when using the ninja generator. -""" - -import os -import re -import shutil -import stat -import string -import subprocess -import sys - -BASE_DIR = os.path.dirname(os.path.abspath(__file__)) - -# A regex matching an argument corresponding to the output filename passed to -# link.exe. -_LINK_EXE_OUT_ARG = re.compile("/OUT:(?P.+)$", re.IGNORECASE) - - -def main(args): - executor = WinTool() - if (exit_code := executor.Dispatch(args)) is not None: - sys.exit(exit_code) - - -class WinTool: - """This class performs all the Windows tooling steps. The methods can either - be executed directly, or dispatched from an argument list.""" - - def _UseSeparateMspdbsrv(self, env, args): - """Allows to use a unique instance of mspdbsrv.exe per linker instead of a - shared one.""" - if len(args) < 1: - raise Exception("Not enough arguments") - - if args[0] != "link.exe": - return - - # Use the output filename passed to the linker to generate an endpoint name - # for mspdbsrv.exe. - endpoint_name = None - for arg in args: - m = _LINK_EXE_OUT_ARG.match(arg) - if m: - endpoint_name = re.sub( - r"\W+", "", "%s_%d" % (m.group("out"), os.getpid()) - ) - break - - if endpoint_name is None: - return - - # Adds the appropriate environment variable. This will be read by link.exe - # to know which instance of mspdbsrv.exe it should connect to (if it's - # not set then the default endpoint is used). - env["_MSPDBSRV_ENDPOINT_"] = endpoint_name - - def Dispatch(self, args): - """Dispatches a string command to a method.""" - if len(args) < 1: - raise Exception("Not enough arguments") - - method = "Exec%s" % self._CommandifyName(args[0]) - return getattr(self, method)(*args[1:]) - - def _CommandifyName(self, name_string): - """Transforms a tool name like recursive-mirror to RecursiveMirror.""" - return name_string.title().replace("-", "") - - def _GetEnv(self, arch): - """Gets the saved environment from a file for a given architecture.""" - # The environment is saved as an "environment block" (see CreateProcess - # and msvs_emulation for details). We convert to a dict here. - # Drop last 2 NULs, one for list terminator, one for trailing vs. separator. - pairs = open(arch).read()[:-2].split("\0") - kvs = [item.split("=", 1) for item in pairs] - return dict(kvs) - - def ExecStamp(self, path): - """Simple stamp command.""" - open(path, "w").close() - - def ExecRecursiveMirror(self, source, dest): - """Emulation of rm -rf out && cp -af in out.""" - if os.path.exists(dest): - if os.path.isdir(dest): - - def _on_error(fn, path, excinfo): - # The operation failed, possibly because the file is set to - # read-only. If that's why, make it writable and try the op again. - if not os.access(path, os.W_OK): - os.chmod(path, stat.S_IWRITE) - fn(path) - - shutil.rmtree(dest, onerror=_on_error) - else: - if not os.access(dest, os.W_OK): - # Attempt to make the file writable before deleting it. - os.chmod(dest, stat.S_IWRITE) - os.unlink(dest) - - if os.path.isdir(source): - shutil.copytree(source, dest) - else: - shutil.copy2(source, dest) - - def ExecLinkWrapper(self, arch, use_separate_mspdbsrv, *args): - """Filter diagnostic output from link that looks like: - ' Creating library ui.dll.lib and object ui.dll.exp' - This happens when there are exports from the dll or exe. - """ - env = self._GetEnv(arch) - if use_separate_mspdbsrv == "True": - self._UseSeparateMspdbsrv(env, args) - if sys.platform == "win32": - args = list(args) # *args is a tuple by default, which is read-only. - args[0] = args[0].replace("/", "\\") - # https://docs.python.org/2/library/subprocess.html: - # "On Unix with shell=True [...] if args is a sequence, the first item - # specifies the command string, and any additional items will be treated as - # additional arguments to the shell itself. That is to say, Popen does the - # equivalent of: - # Popen(['/bin/sh', '-c', args[0], args[1], ...])" - # For that reason, since going through the shell doesn't seem necessary on - # non-Windows don't do that there. - link = subprocess.Popen( - args, - shell=sys.platform == "win32", - env=env, - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT, - ) - out = link.communicate()[0].decode("utf-8") - for line in out.splitlines(): - if ( - not line.startswith(" Creating library ") - and not line.startswith("Generating code") - and not line.startswith("Finished generating code") - ): - print(line) - return link.returncode - - def ExecLinkWithManifests( - self, - arch, - embed_manifest, - out, - ldcmd, - resname, - mt, - rc, - intermediate_manifest, - *manifests, - ): - """A wrapper for handling creating a manifest resource and then executing - a link command.""" - # The 'normal' way to do manifests is to have link generate a manifest - # based on gathering dependencies from the object files, then merge that - # manifest with other manifests supplied as sources, convert the merged - # manifest to a resource, and then *relink*, including the compiled - # version of the manifest resource. This breaks incremental linking, and - # is generally overly complicated. Instead, we merge all the manifests - # provided (along with one that includes what would normally be in the - # linker-generated one, see msvs_emulation.py), and include that into the - # first and only link. We still tell link to generate a manifest, but we - # only use that to assert that our simpler process did not miss anything. - variables = { - "python": sys.executable, - "arch": arch, - "out": out, - "ldcmd": ldcmd, - "resname": resname, - "mt": mt, - "rc": rc, - "intermediate_manifest": intermediate_manifest, - "manifests": " ".join(manifests), - } - add_to_ld = "" - if manifests: - subprocess.check_call( - "%(python)s gyp-win-tool manifest-wrapper %(arch)s %(mt)s -nologo " - "-manifest %(manifests)s -out:%(out)s.manifest" % variables - ) - if embed_manifest == "True": - subprocess.check_call( - "%(python)s gyp-win-tool manifest-to-rc %(arch)s %(out)s.manifest" - " %(out)s.manifest.rc %(resname)s" % variables - ) - subprocess.check_call( - "%(python)s gyp-win-tool rc-wrapper %(arch)s %(rc)s " - "%(out)s.manifest.rc" % variables - ) - add_to_ld = " %(out)s.manifest.res" % variables - subprocess.check_call(ldcmd + add_to_ld) - - # Run mt.exe on the theoretically complete manifest we generated, merging - # it with the one the linker generated to confirm that the linker - # generated one does not add anything. This is strictly unnecessary for - # correctness, it's only to verify that e.g. /MANIFESTDEPENDENCY was not - # used in a #pragma comment. - if manifests: - # Merge the intermediate one with ours to .assert.manifest, then check - # that .assert.manifest is identical to ours. - subprocess.check_call( - "%(python)s gyp-win-tool manifest-wrapper %(arch)s %(mt)s -nologo " - "-manifest %(out)s.manifest %(intermediate_manifest)s " - "-out:%(out)s.assert.manifest" % variables - ) - assert_manifest = "%(out)s.assert.manifest" % variables - our_manifest = "%(out)s.manifest" % variables - # Load and normalize the manifests. mt.exe sometimes removes whitespace, - # and sometimes doesn't unfortunately. - with open(our_manifest) as our_f, open(assert_manifest) as assert_f: - translator = str.maketrans("", "", string.whitespace) - our_data = our_f.read().translate(translator) - assert_data = assert_f.read().translate(translator) - if our_data != assert_data: - os.unlink(out) - - def dump(filename): - print(filename, file=sys.stderr) - print("-----", file=sys.stderr) - with open(filename) as f: - print(f.read(), file=sys.stderr) - print("-----", file=sys.stderr) - - dump(intermediate_manifest) - dump(our_manifest) - dump(assert_manifest) - sys.stderr.write( - 'Linker generated manifest "%s" added to final manifest "%s" ' - '(result in "%s"). ' - "Were /MANIFEST switches used in #pragma statements? " - % (intermediate_manifest, our_manifest, assert_manifest) - ) - return 1 - - def ExecManifestWrapper(self, arch, *args): - """Run manifest tool with environment set. Strip out undesirable warning - (some XML blocks are recognized by the OS loader, but not the manifest - tool).""" - env = self._GetEnv(arch) - popen = subprocess.Popen( - args, shell=True, env=env, stdout=subprocess.PIPE, stderr=subprocess.STDOUT - ) - out = popen.communicate()[0].decode("utf-8") - for line in out.splitlines(): - if line and "manifest authoring warning 81010002" not in line: - print(line) - return popen.returncode - - def ExecManifestToRc(self, arch, *args): - """Creates a resource file pointing a SxS assembly manifest. - |args| is tuple containing path to resource file, path to manifest file - and resource name which can be "1" (for executables) or "2" (for DLLs).""" - manifest_path, resource_path, resource_name = args - with open(resource_path, "w") as output: - output.write( - '#include \n%s RT_MANIFEST "%s"' - % (resource_name, os.path.abspath(manifest_path).replace("\\", "/")) - ) - - def ExecMidlWrapper(self, arch, outdir, tlb, h, dlldata, iid, proxy, idl, *flags): - """Filter noisy filenames output from MIDL compile step that isn't - quietable via command line flags. - """ - args = ( - ["midl", "/nologo"] - + list(flags) - + [ - "/out", - outdir, - "/tlb", - tlb, - "/h", - h, - "/dlldata", - dlldata, - "/iid", - iid, - "/proxy", - proxy, - idl, - ] - ) - env = self._GetEnv(arch) - popen = subprocess.Popen( - args, shell=True, env=env, stdout=subprocess.PIPE, stderr=subprocess.STDOUT - ) - out = popen.communicate()[0].decode("utf-8") - # Filter junk out of stdout, and write filtered versions. Output we want - # to filter is pairs of lines that look like this: - # Processing C:\Program Files (x86)\Microsoft SDKs\...\include\objidl.idl - # objidl.idl - lines = out.splitlines() - prefixes = ("Processing ", "64 bit Processing ") - processing = {os.path.basename(x) for x in lines if x.startswith(prefixes)} - for line in lines: - if not line.startswith(prefixes) and line not in processing: - print(line) - return popen.returncode - - def ExecAsmWrapper(self, arch, *args): - """Filter logo banner from invocations of asm.exe.""" - env = self._GetEnv(arch) - popen = subprocess.Popen( - args, shell=True, env=env, stdout=subprocess.PIPE, stderr=subprocess.STDOUT - ) - out = popen.communicate()[0].decode("utf-8") - for line in out.splitlines(): - if ( - not line.startswith("Copyright (C) Microsoft Corporation") - and not line.startswith("Microsoft (R) Macro Assembler") - and not line.startswith(" Assembling: ") - and line - ): - print(line) - return popen.returncode - - def ExecRcWrapper(self, arch, *args): - """Filter logo banner from invocations of rc.exe. Older versions of RC - don't support the /nologo flag.""" - env = self._GetEnv(arch) - popen = subprocess.Popen( - args, shell=True, env=env, stdout=subprocess.PIPE, stderr=subprocess.STDOUT - ) - out = popen.communicate()[0].decode("utf-8") - for line in out.splitlines(): - if ( - not line.startswith("Microsoft (R) Windows (R) Resource Compiler") - and not line.startswith("Copyright (C) Microsoft Corporation") - and line - ): - print(line) - return popen.returncode - - def ExecActionWrapper(self, arch, rspfile, *dir): - """Runs an action command line from a response file using the environment - for |arch|. If |dir| is supplied, use that as the working directory.""" - env = self._GetEnv(arch) - # TODO(scottmg): This is a temporary hack to get some specific variables - # through to actions that are set after gyp-time. http://crbug.com/333738. - for k, v in os.environ.items(): - if k not in env: - env[k] = v - args = open(rspfile).read() - dir = dir[0] if dir else None - return subprocess.call(args, shell=True, env=env, cwd=dir) - - def ExecClCompile(self, project_dir, selected_files): - """Executed by msvs-ninja projects when the 'ClCompile' target is used to - build selected C/C++ files.""" - project_dir = os.path.relpath(project_dir, BASE_DIR) - selected_files = selected_files.split(";") - ninja_targets = [ - os.path.join(project_dir, filename) + "^^" for filename in selected_files - ] - cmd = ["ninja.exe"] - cmd.extend(ninja_targets) - return subprocess.call(cmd, shell=True, cwd=BASE_DIR) - - -if __name__ == "__main__": - sys.exit(main(sys.argv[1:])) diff --git a/tools/gyp/pylib/gyp/xcode_emulation.py b/tools/gyp/pylib/gyp/xcode_emulation.py deleted file mode 100644 index d13eaa9af24..00000000000 --- a/tools/gyp/pylib/gyp/xcode_emulation.py +++ /dev/null @@ -1,1936 +0,0 @@ -# Copyright (c) 2012 Google Inc. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -""" -This module contains classes that help to emulate xcodebuild behavior on top of -other build systems, such as make and ninja. -""" - -import copy -import os -import os.path -import re -import shlex -import subprocess -import sys - -import gyp.common -from gyp.common import GypError - -# Populated lazily by XcodeVersion, for efficiency, and to fix an issue when -# "xcodebuild" is called too quickly (it has been found to return incorrect -# version number). -XCODE_VERSION_CACHE = None - -# Populated lazily by GetXcodeArchsDefault, to an |XcodeArchsDefault| instance -# corresponding to the installed version of Xcode. -XCODE_ARCHS_DEFAULT_CACHE = None - - -def XcodeArchsVariableMapping(archs, archs_including_64_bit=None): - """Constructs a dictionary with expansion for $(ARCHS_STANDARD) variable, - and optionally for $(ARCHS_STANDARD_INCLUDING_64_BIT).""" - mapping = {"$(ARCHS_STANDARD)": archs} - if archs_including_64_bit: - mapping["$(ARCHS_STANDARD_INCLUDING_64_BIT)"] = archs_including_64_bit - return mapping - - -class XcodeArchsDefault: - """A class to resolve ARCHS variable from xcode_settings, resolving Xcode - macros and implementing filtering by VALID_ARCHS. The expansion of macros - depends on the SDKROOT used ("macosx", "iphoneos", "iphonesimulator") and - on the version of Xcode. - """ - - # Match variable like $(ARCHS_STANDARD). - variable_pattern = re.compile(r"\$\([a-zA-Z_][a-zA-Z0-9_]*\)$") - - def __init__(self, default, mac, iphonesimulator, iphoneos): - self._default = (default,) - self._archs = {"mac": mac, "ios": iphoneos, "iossim": iphonesimulator} - - def _VariableMapping(self, sdkroot): - """Returns the dictionary of variable mapping depending on the SDKROOT.""" - sdkroot = sdkroot.lower() - if "iphoneos" in sdkroot: - return self._archs["ios"] - elif "iphonesimulator" in sdkroot: - return self._archs["iossim"] - else: - return self._archs["mac"] - - def _ExpandArchs(self, archs, sdkroot): - """Expands variables references in ARCHS, and remove duplicates.""" - variable_mapping = self._VariableMapping(sdkroot) - expanded_archs = [] - for arch in archs: - if self.variable_pattern.match(arch): - variable = arch - try: - variable_expansion = variable_mapping[variable] - for arch in variable_expansion: - if arch not in expanded_archs: - expanded_archs.append(arch) - except KeyError: - print('Warning: Ignoring unsupported variable "%s".' % variable) - elif arch not in expanded_archs: - expanded_archs.append(arch) - return expanded_archs - - def ActiveArchs(self, archs, valid_archs, sdkroot): - """Expands variables references in ARCHS, and filter by VALID_ARCHS if it - is defined (if not set, Xcode accept any value in ARCHS, otherwise, only - values present in VALID_ARCHS are kept).""" - expanded_archs = self._ExpandArchs(archs or self._default, sdkroot or "") - if valid_archs: - filtered_archs = [] - for arch in expanded_archs: - if arch in valid_archs: - filtered_archs.append(arch) - expanded_archs = filtered_archs - return expanded_archs - - -def GetXcodeArchsDefault(): - """Returns the |XcodeArchsDefault| object to use to expand ARCHS for the - installed version of Xcode. The default values used by Xcode for ARCHS - and the expansion of the variables depends on the version of Xcode used. - - For all version anterior to Xcode 5.0 or posterior to Xcode 5.1 included - uses $(ARCHS_STANDARD) if ARCHS is unset, while Xcode 5.0 to 5.0.2 uses - $(ARCHS_STANDARD_INCLUDING_64_BIT). This variable was added to Xcode 5.0 - and deprecated with Xcode 5.1. - - For "macosx" SDKROOT, all version starting with Xcode 5.0 includes 64-bit - architecture as part of $(ARCHS_STANDARD) and default to only building it. - - For "iphoneos" and "iphonesimulator" SDKROOT, 64-bit architectures are part - of $(ARCHS_STANDARD_INCLUDING_64_BIT) from Xcode 5.0. From Xcode 5.1, they - are also part of $(ARCHS_STANDARD). - - All these rules are coded in the construction of the |XcodeArchsDefault| - object to use depending on the version of Xcode detected. The object is - for performance reason.""" - global XCODE_ARCHS_DEFAULT_CACHE - if XCODE_ARCHS_DEFAULT_CACHE: - return XCODE_ARCHS_DEFAULT_CACHE - xcode_version, _ = XcodeVersion() - if xcode_version < "0500": - XCODE_ARCHS_DEFAULT_CACHE = XcodeArchsDefault( - "$(ARCHS_STANDARD)", - XcodeArchsVariableMapping(["i386"]), - XcodeArchsVariableMapping(["i386"]), - XcodeArchsVariableMapping(["armv7"]), - ) - elif xcode_version < "0510": - XCODE_ARCHS_DEFAULT_CACHE = XcodeArchsDefault( - "$(ARCHS_STANDARD_INCLUDING_64_BIT)", - XcodeArchsVariableMapping(["x86_64"], ["x86_64"]), - XcodeArchsVariableMapping(["i386"], ["i386", "x86_64"]), - XcodeArchsVariableMapping( - ["armv7", "armv7s"], ["armv7", "armv7s", "arm64"] - ), - ) - else: - XCODE_ARCHS_DEFAULT_CACHE = XcodeArchsDefault( - "$(ARCHS_STANDARD)", - XcodeArchsVariableMapping(["x86_64"], ["x86_64"]), - XcodeArchsVariableMapping(["i386", "x86_64"], ["i386", "x86_64"]), - XcodeArchsVariableMapping( - ["armv7", "armv7s", "arm64"], ["armv7", "armv7s", "arm64"] - ), - ) - return XCODE_ARCHS_DEFAULT_CACHE - - -class XcodeSettings: - """A class that understands the gyp 'xcode_settings' object.""" - - # Populated lazily by _SdkPath(). Shared by all XcodeSettings, so cached - # at class-level for efficiency. - _sdk_path_cache = {} - _platform_path_cache = {} - _sdk_root_cache = {} - - # Populated lazily by GetExtraPlistItems(). Shared by all XcodeSettings, so - # cached at class-level for efficiency. - _plist_cache = {} - - # Populated lazily by GetIOSPostbuilds. Shared by all XcodeSettings, so - # cached at class-level for efficiency. - _codesigning_key_cache = {} - - def __init__(self, spec): - self.spec = spec - - self.isIOS = False - self.mac_toolchain_dir = None - self.header_map_path = None - - # Per-target 'xcode_settings' are pushed down into configs earlier by gyp. - # This means self.xcode_settings[config] always contains all settings - # for that config -- the per-target settings as well. Settings that are - # the same for all configs are implicitly per-target settings. - self.xcode_settings = {} - configs = spec["configurations"] - for configname, config in configs.items(): - self.xcode_settings[configname] = config.get("xcode_settings", {}) - self._ConvertConditionalKeys(configname) - if self.xcode_settings[configname].get("IPHONEOS_DEPLOYMENT_TARGET", None): - self.isIOS = True - - # This is only non-None temporarily during the execution of some methods. - self.configname = None - - # Used by _AdjustLibrary to match .a and .dylib entries in libraries. - self.library_re = re.compile(r"^lib([^/]+)\.(a|dylib)$") - - def _ConvertConditionalKeys(self, configname): - """Converts or warns on conditional keys. Xcode supports conditional keys, - such as CODE_SIGN_IDENTITY[sdk=iphoneos*]. This is a partial implementation - with some keys converted while the rest force a warning.""" - settings = self.xcode_settings[configname] - conditional_keys = [key for key in settings if key.endswith("]")] - for key in conditional_keys: - # If you need more, speak up at http://crbug.com/122592 - if key.endswith("[sdk=iphoneos*]"): - if configname.endswith("iphoneos"): - new_key = key.split("[")[0] - settings[new_key] = settings[key] - else: - print( - "Warning: Conditional keys not implemented, ignoring:", - " ".join(conditional_keys), - ) - del settings[key] - - def _Settings(self): - assert self.configname - return self.xcode_settings[self.configname] - - def _Test(self, test_key, cond_key, default): - return self._Settings().get(test_key, default) == cond_key - - def _Appendf(self, lst, test_key, format_str, default=None): - if test_key in self._Settings(): - lst.append(format_str % str(self._Settings()[test_key])) - elif default: - lst.append(format_str % str(default)) - - def _WarnUnimplemented(self, test_key): - if test_key in self._Settings(): - print('Warning: Ignoring not yet implemented key "%s".' % test_key) - - def IsBinaryOutputFormat(self, configname): - default = "binary" if self.isIOS else "xml" - format = self.xcode_settings[configname].get("INFOPLIST_OUTPUT_FORMAT", default) - return format == "binary" - - def IsIosFramework(self): - return self.spec["type"] == "shared_library" and self._IsBundle() and self.isIOS - - def _IsBundle(self): - return ( - int(self.spec.get("mac_bundle", 0)) != 0 - or self._IsXCTest() - or self._IsXCUiTest() - ) - - def _IsXCTest(self): - return int(self.spec.get("mac_xctest_bundle", 0)) != 0 - - def _IsXCUiTest(self): - return int(self.spec.get("mac_xcuitest_bundle", 0)) != 0 - - def _IsIosAppExtension(self): - return int(self.spec.get("ios_app_extension", 0)) != 0 - - def _IsIosWatchKitExtension(self): - return int(self.spec.get("ios_watchkit_extension", 0)) != 0 - - def _IsIosWatchApp(self): - return int(self.spec.get("ios_watch_app", 0)) != 0 - - def GetFrameworkVersion(self): - """Returns the framework version of the current target. Only valid for - bundles.""" - assert self._IsBundle() - return self.GetPerTargetSetting("FRAMEWORK_VERSION", default="A") - - def GetWrapperExtension(self): - """Returns the bundle extension (.app, .framework, .plugin, etc). Only - valid for bundles.""" - assert self._IsBundle() - if self.spec["type"] in ("loadable_module", "shared_library"): - default_wrapper_extension = { - "loadable_module": "bundle", - "shared_library": "framework", - }[self.spec["type"]] - wrapper_extension = self.GetPerTargetSetting( - "WRAPPER_EXTENSION", default=default_wrapper_extension - ) - return "." + self.spec.get("product_extension", wrapper_extension) - elif self.spec["type"] == "executable": - if self._IsIosAppExtension() or self._IsIosWatchKitExtension(): - return "." + self.spec.get("product_extension", "appex") - else: - return "." + self.spec.get("product_extension", "app") - else: - assert False, "Don't know extension for '{}', target '{}'".format( - self.spec["type"], - self.spec["target_name"], - ) - - def GetProductName(self): - """Returns PRODUCT_NAME.""" - return self.spec.get("product_name", self.spec["target_name"]) - - def GetFullProductName(self): - """Returns FULL_PRODUCT_NAME.""" - if self._IsBundle(): - return self.GetWrapperName() - else: - return self._GetStandaloneBinaryPath() - - def GetWrapperName(self): - """Returns the directory name of the bundle represented by this target. - Only valid for bundles.""" - assert self._IsBundle() - return self.GetProductName() + self.GetWrapperExtension() - - def GetBundleContentsFolderPath(self): - """Returns the qualified path to the bundle's contents folder. E.g. - Chromium.app/Contents or Foo.bundle/Versions/A. Only valid for bundles.""" - if self.isIOS: - return self.GetWrapperName() - assert self._IsBundle() - if self.spec["type"] == "shared_library": - return os.path.join( - self.GetWrapperName(), "Versions", self.GetFrameworkVersion() - ) - else: - # loadable_modules have a 'Contents' folder like executables. - return os.path.join(self.GetWrapperName(), "Contents") - - def GetBundleResourceFolder(self): - """Returns the qualified path to the bundle's resource folder. E.g. - Chromium.app/Contents/Resources. Only valid for bundles.""" - assert self._IsBundle() - if self.isIOS: - return self.GetBundleContentsFolderPath() - return os.path.join(self.GetBundleContentsFolderPath(), "Resources") - - def GetBundleExecutableFolderPath(self): - """Returns the qualified path to the bundle's executables folder. E.g. - Chromium.app/Contents/MacOS. Only valid for bundles.""" - assert self._IsBundle() - if self.spec["type"] in ("shared_library") or self.isIOS: - return self.GetBundleContentsFolderPath() - elif self.spec["type"] in ("executable", "loadable_module"): - return os.path.join(self.GetBundleContentsFolderPath(), "MacOS") - - def GetBundleJavaFolderPath(self): - """Returns the qualified path to the bundle's Java resource folder. - E.g. Chromium.app/Contents/Resources/Java. Only valid for bundles.""" - assert self._IsBundle() - return os.path.join(self.GetBundleResourceFolder(), "Java") - - def GetBundleFrameworksFolderPath(self): - """Returns the qualified path to the bundle's frameworks folder. E.g, - Chromium.app/Contents/Frameworks. Only valid for bundles.""" - assert self._IsBundle() - return os.path.join(self.GetBundleContentsFolderPath(), "Frameworks") - - def GetBundleSharedFrameworksFolderPath(self): - """Returns the qualified path to the bundle's frameworks folder. E.g, - Chromium.app/Contents/SharedFrameworks. Only valid for bundles.""" - assert self._IsBundle() - return os.path.join(self.GetBundleContentsFolderPath(), "SharedFrameworks") - - def GetBundleSharedSupportFolderPath(self): - """Returns the qualified path to the bundle's shared support folder. E.g, - Chromium.app/Contents/SharedSupport. Only valid for bundles.""" - assert self._IsBundle() - if self.spec["type"] == "shared_library": - return self.GetBundleResourceFolder() - else: - return os.path.join(self.GetBundleContentsFolderPath(), "SharedSupport") - - def GetBundlePlugInsFolderPath(self): - """Returns the qualified path to the bundle's plugins folder. E.g, - Chromium.app/Contents/PlugIns. Only valid for bundles.""" - assert self._IsBundle() - return os.path.join(self.GetBundleContentsFolderPath(), "PlugIns") - - def GetBundleXPCServicesFolderPath(self): - """Returns the qualified path to the bundle's XPC services folder. E.g, - Chromium.app/Contents/XPCServices. Only valid for bundles.""" - assert self._IsBundle() - return os.path.join(self.GetBundleContentsFolderPath(), "XPCServices") - - def GetBundlePlistPath(self): - """Returns the qualified path to the bundle's plist file. E.g. - Chromium.app/Contents/Info.plist. Only valid for bundles.""" - assert self._IsBundle() - if ( - self.spec["type"] in ("executable", "loadable_module") - or self.IsIosFramework() - ): - return os.path.join(self.GetBundleContentsFolderPath(), "Info.plist") - else: - return os.path.join( - self.GetBundleContentsFolderPath(), "Resources", "Info.plist" - ) - - def GetProductType(self): - """Returns the PRODUCT_TYPE of this target.""" - if self._IsIosAppExtension(): - assert self._IsBundle(), ( - "ios_app_extension flag requires mac_bundle " - "(target %s)" % self.spec["target_name"] - ) - return "com.apple.product-type.app-extension" - if self._IsIosWatchKitExtension(): - assert self._IsBundle(), ( - "ios_watchkit_extension flag requires " - "mac_bundle (target %s)" % self.spec["target_name"] - ) - return "com.apple.product-type.watchkit-extension" - if self._IsIosWatchApp(): - assert self._IsBundle(), ( - "ios_watch_app flag requires mac_bundle " - "(target %s)" % self.spec["target_name"] - ) - return "com.apple.product-type.application.watchapp" - if self._IsXCUiTest(): - assert self._IsBundle(), ( - "mac_xcuitest_bundle flag requires mac_bundle " - "(target %s)" % self.spec["target_name"] - ) - return "com.apple.product-type.bundle.ui-testing" - if self._IsBundle(): - return { - "executable": "com.apple.product-type.application", - "loadable_module": "com.apple.product-type.bundle", - "shared_library": "com.apple.product-type.framework", - }[self.spec["type"]] - else: - return { - "executable": "com.apple.product-type.tool", - "loadable_module": "com.apple.product-type.library.dynamic", - "shared_library": "com.apple.product-type.library.dynamic", - "static_library": "com.apple.product-type.library.static", - }[self.spec["type"]] - - def GetMachOType(self): - """Returns the MACH_O_TYPE of this target.""" - # Weird, but matches Xcode. - if not self._IsBundle() and self.spec["type"] == "executable": - return "" - return { - "executable": "mh_execute", - "static_library": "staticlib", - "shared_library": "mh_dylib", - "loadable_module": "mh_bundle", - }[self.spec["type"]] - - def _GetBundleBinaryPath(self): - """Returns the name of the bundle binary of by this target. - E.g. Chromium.app/Contents/MacOS/Chromium. Only valid for bundles.""" - assert self._IsBundle() - return os.path.join( - self.GetBundleExecutableFolderPath(), self.GetExecutableName() - ) - - def _GetStandaloneExecutableSuffix(self): - if "product_extension" in self.spec: - return "." + self.spec["product_extension"] - return { - "executable": "", - "static_library": ".a", - "shared_library": ".dylib", - "loadable_module": ".so", - }[self.spec["type"]] - - def _GetStandaloneExecutablePrefix(self): - return self.spec.get( - "product_prefix", - { - "executable": "", - "static_library": "lib", - "shared_library": "lib", - # Non-bundled loadable_modules are called foo.so for some reason - # (that is, .so and no prefix) with the xcode build -- match that. - "loadable_module": "", - }[self.spec["type"]], - ) - - def _GetStandaloneBinaryPath(self): - """Returns the name of the non-bundle binary represented by this target. - E.g. hello_world. Only valid for non-bundles.""" - assert not self._IsBundle() - assert self.spec["type"] in { - "executable", - "shared_library", - "static_library", - "loadable_module", - }, "Unexpected type %s" % self.spec["type"] - target = self.spec["target_name"] - if self.spec["type"] in {"loadable_module", "shared_library", "static_library"}: - if target[:3] == "lib": - target = target[3:] - - target_prefix = self._GetStandaloneExecutablePrefix() - target = self.spec.get("product_name", target) - target_ext = self._GetStandaloneExecutableSuffix() - return target_prefix + target + target_ext - - def GetExecutableName(self): - """Returns the executable name of the bundle represented by this target. - E.g. Chromium.""" - if self._IsBundle(): - return self.spec.get("product_name", self.spec["target_name"]) - else: - return self._GetStandaloneBinaryPath() - - def GetExecutablePath(self): - """Returns the qualified path to the primary executable of the bundle - represented by this target. E.g. Chromium.app/Contents/MacOS/Chromium.""" - if self._IsBundle(): - return self._GetBundleBinaryPath() - else: - return self._GetStandaloneBinaryPath() - - def GetActiveArchs(self, configname): - """Returns the architectures this target should be built for.""" - config_settings = self.xcode_settings[configname] - xcode_archs_default = GetXcodeArchsDefault() - return xcode_archs_default.ActiveArchs( - config_settings.get("ARCHS"), - config_settings.get("VALID_ARCHS"), - config_settings.get("SDKROOT"), - ) - - def _GetSdkVersionInfoItem(self, sdk, infoitem): - # xcodebuild requires Xcode and can't run on Command Line Tools-only - # systems from 10.7 onward. - # Since the CLT has no SDK paths anyway, returning None is the - # most sensible route and should still do the right thing. - try: - return GetStdoutQuiet(["xcrun", "--sdk", sdk, infoitem]) - except (GypError, OSError): - pass - - def _SdkRoot(self, configname): - if configname is None: - configname = self.configname - return self.GetPerConfigSetting("SDKROOT", configname, default="") - - def _XcodePlatformPath(self, configname=None): - sdk_root = self._SdkRoot(configname) - if sdk_root not in XcodeSettings._platform_path_cache: - platform_path = self._GetSdkVersionInfoItem( - sdk_root, "--show-sdk-platform-path" - ) - XcodeSettings._platform_path_cache[sdk_root] = platform_path - return XcodeSettings._platform_path_cache[sdk_root] - - def _SdkPath(self, configname=None): - sdk_root = self._SdkRoot(configname) - if sdk_root.startswith("/"): - return sdk_root - return self._XcodeSdkPath(sdk_root) - - def _XcodeSdkPath(self, sdk_root): - if sdk_root not in XcodeSettings._sdk_path_cache: - sdk_path = self._GetSdkVersionInfoItem(sdk_root, "--show-sdk-path") - XcodeSettings._sdk_path_cache[sdk_root] = sdk_path - if sdk_root: - XcodeSettings._sdk_root_cache[sdk_path] = sdk_root - return XcodeSettings._sdk_path_cache[sdk_root] - - def _AppendPlatformVersionMinFlags(self, lst): - self._Appendf(lst, "MACOSX_DEPLOYMENT_TARGET", "-mmacosx-version-min=%s") - if "IPHONEOS_DEPLOYMENT_TARGET" in self._Settings(): - # TODO: Implement this better? - sdk_path_basename = os.path.basename(self._SdkPath()) - if sdk_path_basename.lower().startswith("iphonesimulator"): - self._Appendf( - lst, "IPHONEOS_DEPLOYMENT_TARGET", "-mios-simulator-version-min=%s" - ) - else: - self._Appendf( - lst, "IPHONEOS_DEPLOYMENT_TARGET", "-miphoneos-version-min=%s" - ) - - def GetCflags(self, configname, arch=None): - """Returns flags that need to be added to .c, .cc, .m, and .mm - compilations.""" - # This functions (and the similar ones below) do not offer complete - # emulation of all xcode_settings keys. They're implemented on demand. - - self.configname = configname - cflags = [] - - sdk_root = self._SdkPath() - if "SDKROOT" in self._Settings() and sdk_root: - cflags.append("-isysroot") - cflags.append(sdk_root) - - if self.header_map_path: - cflags.append("-I%s" % self.header_map_path) - - if self._Test("CLANG_WARN_CONSTANT_CONVERSION", "YES", default="NO"): - cflags.append("-Wconstant-conversion") - - if self._Test("GCC_CHAR_IS_UNSIGNED_CHAR", "YES", default="NO"): - cflags.append("-funsigned-char") - - if self._Test("GCC_CW_ASM_SYNTAX", "YES", default="YES"): - cflags.append("-fasm-blocks") - - if "GCC_DYNAMIC_NO_PIC" in self._Settings(): - if self._Settings()["GCC_DYNAMIC_NO_PIC"] == "YES": - cflags.append("-mdynamic-no-pic") - else: - pass - # TODO: In this case, it depends on the target. xcode passes - # mdynamic-no-pic by default for executable and possibly static lib - # according to mento - - if self._Test("GCC_ENABLE_PASCAL_STRINGS", "YES", default="YES"): - cflags.append("-mpascal-strings") - - self._Appendf(cflags, "GCC_OPTIMIZATION_LEVEL", "-O%s", default="s") - - if self._Test("GCC_GENERATE_DEBUGGING_SYMBOLS", "YES", default="YES"): - dbg_format = self._Settings().get("DEBUG_INFORMATION_FORMAT", "dwarf") - if dbg_format == "dwarf": - cflags.append("-gdwarf-2") - elif dbg_format == "stabs": - raise NotImplementedError("stabs debug format is not supported yet.") - elif dbg_format == "dwarf-with-dsym": - cflags.append("-gdwarf-2") - else: - raise NotImplementedError("Unknown debug format %s" % dbg_format) - - if self._Settings().get("GCC_STRICT_ALIASING") == "YES": - cflags.append("-fstrict-aliasing") - elif self._Settings().get("GCC_STRICT_ALIASING") == "NO": - cflags.append("-fno-strict-aliasing") - - if self._Test("GCC_SYMBOLS_PRIVATE_EXTERN", "YES", default="NO"): - cflags.append("-fvisibility=hidden") - - if self._Test("GCC_TREAT_WARNINGS_AS_ERRORS", "YES", default="NO"): - cflags.append("-Werror") - - if self._Test("GCC_WARN_ABOUT_MISSING_NEWLINE", "YES", default="NO"): - cflags.append("-Wnewline-eof") - - # In Xcode, this is only activated when GCC_COMPILER_VERSION is clang or - # llvm-gcc. It also requires a fairly recent libtool, and - # if the system clang isn't used, DYLD_LIBRARY_PATH needs to contain the - # path to the libLTO.dylib that matches the used clang. - if self._Test("LLVM_LTO", "YES", default="NO"): - cflags.append("-flto") - - self._AppendPlatformVersionMinFlags(cflags) - - # TODO: - if self._Test("COPY_PHASE_STRIP", "YES", default="NO"): - self._WarnUnimplemented("COPY_PHASE_STRIP") - self._WarnUnimplemented("GCC_DEBUGGING_SYMBOLS") - self._WarnUnimplemented("GCC_ENABLE_OBJC_EXCEPTIONS") - - # TODO: This is exported correctly, but assigning to it is not supported. - self._WarnUnimplemented("MACH_O_TYPE") - self._WarnUnimplemented("PRODUCT_TYPE") - - # If GYP_CROSSCOMPILE (--cross-compiling), disable architecture-specific - # additions and assume these will be provided as required via CC_host, - # CXX_host, CC_target and CXX_target. - if not gyp.common.CrossCompileRequested(): - if arch is not None: - archs = [arch] - else: - assert self.configname - archs = self.GetActiveArchs(self.configname) - if len(archs) != 1: - # TODO: Supporting fat binaries will be annoying. - self._WarnUnimplemented("ARCHS") - archs = ["i386"] - cflags.append("-arch") - cflags.append(archs[0]) - - if archs[0] in ("i386", "x86_64"): - if self._Test("GCC_ENABLE_SSE3_EXTENSIONS", "YES", default="NO"): - cflags.append("-msse3") - if self._Test( - "GCC_ENABLE_SUPPLEMENTAL_SSE3_INSTRUCTIONS", "YES", default="NO" - ): - cflags.append("-mssse3") # Note 3rd 's'. - if self._Test("GCC_ENABLE_SSE41_EXTENSIONS", "YES", default="NO"): - cflags.append("-msse4.1") - if self._Test("GCC_ENABLE_SSE42_EXTENSIONS", "YES", default="NO"): - cflags.append("-msse4.2") - - cflags += self._Settings().get("WARNING_CFLAGS", []) - - if self._IsXCTest(): - platform_root = self._XcodePlatformPath(configname) - if platform_root: - cflags.append("-F" + platform_root + "/Developer/Library/Frameworks/") - - framework_root = sdk_root if sdk_root else "" - config = self.spec["configurations"][self.configname] - framework_dirs = config.get("mac_framework_dirs", []) - for directory in framework_dirs: - cflags.append("-F" + directory.replace("$(SDKROOT)", framework_root)) - - self.configname = None - return cflags - - def GetCflagsC(self, configname): - """Returns flags that need to be added to .c, and .m compilations.""" - self.configname = configname - cflags_c = [] - if self._Settings().get("GCC_C_LANGUAGE_STANDARD", "") == "ansi": - cflags_c.append("-ansi") - else: - self._Appendf(cflags_c, "GCC_C_LANGUAGE_STANDARD", "-std=%s") - cflags_c += self._Settings().get("OTHER_CFLAGS", []) - self.configname = None - return cflags_c - - def GetCflagsCC(self, configname): - """Returns flags that need to be added to .cc, and .mm compilations.""" - self.configname = configname - cflags_cc = [] - - clang_cxx_language_standard = self._Settings().get( - "CLANG_CXX_LANGUAGE_STANDARD" - ) - # Note: Don't make c++0x to c++11 so that c++0x can be used with older - # clangs that don't understand c++11 yet (like Xcode 4.2's). - if clang_cxx_language_standard: - cflags_cc.append("-std=%s" % clang_cxx_language_standard) - - self._Appendf(cflags_cc, "CLANG_CXX_LIBRARY", "-stdlib=%s") - - if self._Test("GCC_ENABLE_CPP_RTTI", "NO", default="YES"): - cflags_cc.append("-fno-rtti") - if self._Test("GCC_ENABLE_CPP_EXCEPTIONS", "NO", default="YES"): - cflags_cc.append("-fno-exceptions") - if self._Test("GCC_INLINES_ARE_PRIVATE_EXTERN", "YES", default="NO"): - cflags_cc.append("-fvisibility-inlines-hidden") - if self._Test("GCC_THREADSAFE_STATICS", "NO", default="YES"): - cflags_cc.append("-fno-threadsafe-statics") - # Note: This flag is a no-op for clang, it only has an effect for gcc. - if self._Test("GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO", "NO", default="YES"): - cflags_cc.append("-Wno-invalid-offsetof") - - other_ccflags = [] - - for flag in self._Settings().get("OTHER_CPLUSPLUSFLAGS", ["$(inherited)"]): - # TODO: More general variable expansion. Missing in many other places too. - if flag in ("$inherited", "$(inherited)", "${inherited}"): - flag = "$OTHER_CFLAGS" - if flag in ("$OTHER_CFLAGS", "$(OTHER_CFLAGS)", "${OTHER_CFLAGS}"): - other_ccflags += self._Settings().get("OTHER_CFLAGS", []) - else: - other_ccflags.append(flag) - cflags_cc += other_ccflags - - self.configname = None - return cflags_cc - - def _AddObjectiveCGarbageCollectionFlags(self, flags): - gc_policy = self._Settings().get("GCC_ENABLE_OBJC_GC", "unsupported") - if gc_policy == "supported": - flags.append("-fobjc-gc") - elif gc_policy == "required": - flags.append("-fobjc-gc-only") - - def _AddObjectiveCARCFlags(self, flags): - if self._Test("CLANG_ENABLE_OBJC_ARC", "YES", default="NO"): - flags.append("-fobjc-arc") - - def _AddObjectiveCMissingPropertySynthesisFlags(self, flags): - if self._Test( - "CLANG_WARN_OBJC_MISSING_PROPERTY_SYNTHESIS", "YES", default="NO" - ): - flags.append("-Wobjc-missing-property-synthesis") - - def GetCflagsObjC(self, configname): - """Returns flags that need to be added to .m compilations.""" - self.configname = configname - cflags_objc = [] - self._AddObjectiveCGarbageCollectionFlags(cflags_objc) - self._AddObjectiveCARCFlags(cflags_objc) - self._AddObjectiveCMissingPropertySynthesisFlags(cflags_objc) - self.configname = None - return cflags_objc - - def GetCflagsObjCC(self, configname): - """Returns flags that need to be added to .mm compilations.""" - self.configname = configname - cflags_objcc = [] - self._AddObjectiveCGarbageCollectionFlags(cflags_objcc) - self._AddObjectiveCARCFlags(cflags_objcc) - self._AddObjectiveCMissingPropertySynthesisFlags(cflags_objcc) - if self._Test("GCC_OBJC_CALL_CXX_CDTORS", "YES", default="NO"): - cflags_objcc.append("-fobjc-call-cxx-cdtors") - self.configname = None - return cflags_objcc - - def GetInstallNameBase(self): - """Return DYLIB_INSTALL_NAME_BASE for this target.""" - # Xcode sets this for shared_libraries, and for nonbundled loadable_modules. - if self.spec["type"] != "shared_library" and ( - self.spec["type"] != "loadable_module" or self._IsBundle() - ): - return None - install_base = self.GetPerTargetSetting( - "DYLIB_INSTALL_NAME_BASE", - default="/Library/Frameworks" if self._IsBundle() else "/usr/local/lib", - ) - return install_base - - def _StandardizePath(self, path): - """Do :standardizepath processing for path.""" - # I'm not quite sure what :standardizepath does. Just call normpath(), - # but don't let @executable_path/../foo collapse to foo. - if "/" in path: - prefix, rest = "", path - if path.startswith("@"): - prefix, rest = path.split("/", 1) - rest = os.path.normpath(rest) # :standardizepath - path = os.path.join(prefix, rest) - return path - - def GetInstallName(self): - """Return LD_DYLIB_INSTALL_NAME for this target.""" - # Xcode sets this for shared_libraries, and for nonbundled loadable_modules. - if self.spec["type"] != "shared_library" and ( - self.spec["type"] != "loadable_module" or self._IsBundle() - ): - return None - - default_install_name = ( - "$(DYLIB_INSTALL_NAME_BASE:standardizepath)/$(EXECUTABLE_PATH)" - ) - install_name = self.GetPerTargetSetting( - "LD_DYLIB_INSTALL_NAME", default=default_install_name - ) - - # Hardcode support for the variables used in chromium for now, to - # unblock people using the make build. - if "$" in install_name: - assert install_name in ( - "$(DYLIB_INSTALL_NAME_BASE:standardizepath)/" - "$(WRAPPER_NAME)/$(PRODUCT_NAME)", - default_install_name, - ), ( - "Variables in LD_DYLIB_INSTALL_NAME are not generally supported " - "yet in target '%s' (got '%s')" - % (self.spec["target_name"], install_name) - ) - - install_name = install_name.replace( - "$(DYLIB_INSTALL_NAME_BASE:standardizepath)", - self._StandardizePath(self.GetInstallNameBase()), - ) - if self._IsBundle(): - # These are only valid for bundles, hence the |if|. - install_name = install_name.replace( - "$(WRAPPER_NAME)", self.GetWrapperName() - ) - install_name = install_name.replace( - "$(PRODUCT_NAME)", self.GetProductName() - ) - else: - assert "$(WRAPPER_NAME)" not in install_name - assert "$(PRODUCT_NAME)" not in install_name - - install_name = install_name.replace( - "$(EXECUTABLE_PATH)", self.GetExecutablePath() - ) - return install_name - - def _MapLinkerFlagFilename(self, ldflag, gyp_to_build_path): - """Checks if ldflag contains a filename and if so remaps it from - gyp-directory-relative to build-directory-relative.""" - # This list is expanded on demand. - # They get matched as: - # -exported_symbols_list file - # -Wl,exported_symbols_list file - # -Wl,exported_symbols_list,file - LINKER_FILE = r"(\S+)" - WORD = r"\S+" - linker_flags = [ - ["-exported_symbols_list", LINKER_FILE], # Needed for NaCl. - ["-unexported_symbols_list", LINKER_FILE], - ["-reexported_symbols_list", LINKER_FILE], - ["-sectcreate", WORD, WORD, LINKER_FILE], # Needed for remoting. - ] - for flag_pattern in linker_flags: - regex = re.compile("(?:-Wl,)?" + "[ ,]".join(flag_pattern)) - m = regex.match(ldflag) - if m: - ldflag = ( - ldflag[: m.start(1)] - + gyp_to_build_path(m.group(1)) - + ldflag[m.end(1) :] - ) - # Required for ffmpeg (no idea why they don't use LIBRARY_SEARCH_PATHS, - # TODO(thakis): Update ffmpeg.gyp): - if ldflag.startswith("-L"): - ldflag = "-L" + gyp_to_build_path(ldflag[len("-L") :]) - return ldflag - - def GetLdflags(self, configname, product_dir, gyp_to_build_path, arch=None): - """Returns flags that need to be passed to the linker. - - Args: - configname: The name of the configuration to get ld flags for. - product_dir: The directory where products such static and dynamic - libraries are placed. This is added to the library search path. - gyp_to_build_path: A function that converts paths relative to the - current gyp file to paths relative to the build directory. - """ - self.configname = configname - ldflags = [] - - # The xcode build is relative to a gyp file's directory, and OTHER_LDFLAGS - # can contain entries that depend on this. Explicitly absolutify these. - for ldflag in self._Settings().get("OTHER_LDFLAGS", []): - ldflags.append(self._MapLinkerFlagFilename(ldflag, gyp_to_build_path)) - - if self._Test("DEAD_CODE_STRIPPING", "YES", default="NO"): - ldflags.append("-Wl,-dead_strip") - - if self._Test("PREBINDING", "YES", default="NO"): - ldflags.append("-Wl,-prebind") - - self._Appendf( - ldflags, "DYLIB_COMPATIBILITY_VERSION", "-compatibility_version %s" - ) - self._Appendf(ldflags, "DYLIB_CURRENT_VERSION", "-current_version %s") - - self._AppendPlatformVersionMinFlags(ldflags) - - if "SDKROOT" in self._Settings() and self._SdkPath(): - ldflags.append("-isysroot") - ldflags.append(self._SdkPath()) - - for library_path in self._Settings().get("LIBRARY_SEARCH_PATHS", []): - ldflags.append("-L" + gyp_to_build_path(library_path)) - - if "ORDER_FILE" in self._Settings(): - ldflags.append("-Wl,-order_file") - ldflags.append("-Wl," + gyp_to_build_path(self._Settings()["ORDER_FILE"])) - - if not gyp.common.CrossCompileRequested(): - if arch is not None: - archs = [arch] - else: - assert self.configname - archs = self.GetActiveArchs(self.configname) - if len(archs) != 1: - # TODO: Supporting fat binaries will be annoying. - self._WarnUnimplemented("ARCHS") - archs = ["i386"] - # Avoid quoting the space between -arch and the arch name - ldflags.append("-arch") - ldflags.append(archs[0]) - - # Xcode adds the product directory by default. - # Rewrite -L. to -L./ to work around http://www.openradar.me/25313838 - ldflags.append("-L" + (product_dir if product_dir != "." else "./")) - - install_name = self.GetInstallName() - if install_name and self.spec["type"] != "loadable_module": - ldflags.append("-install_name") - ldflags.append(install_name.replace(" ", r"\ ")) - - for rpath in self._Settings().get("LD_RUNPATH_SEARCH_PATHS", []): - ldflags.append("-Wl,-rpath," + rpath) - - sdk_root = self._SdkPath() - if not sdk_root: - sdk_root = "" - config = self.spec["configurations"][self.configname] - framework_dirs = config.get("mac_framework_dirs", []) - for directory in framework_dirs: - ldflags.append("-F" + directory.replace("$(SDKROOT)", sdk_root)) - - if self._IsXCTest(): - platform_root = self._XcodePlatformPath(configname) - if sdk_root and platform_root: - ldflags.append("-F" + platform_root + "/Developer/Library/Frameworks/") - ldflags.append("-framework") - ldflags.append("XCTest") - - is_extension = self._IsIosAppExtension() or self._IsIosWatchKitExtension() - if sdk_root and is_extension: - # Adds the link flags for extensions. These flags are common for all - # extensions and provide loader and main function. - # These flags reflect the compilation options used by xcode to compile - # extensions. - xcode_version, _ = XcodeVersion() - if xcode_version < "0900": - ldflags.append("-lpkstart") - ldflags.append( - sdk_root - + "/System/Library/PrivateFrameworks/PlugInKit.framework/PlugInKit" - ) - else: - ldflags.append("-e") - ldflags.append("_NSExtensionMain") - ldflags.append("-fapplication-extension") - - self._Appendf(ldflags, "CLANG_CXX_LIBRARY", "-stdlib=%s") - - self.configname = None - return ldflags - - def GetLibtoolflags(self, configname): - """Returns flags that need to be passed to the static linker. - - Args: - configname: The name of the configuration to get ld flags for. - """ - self.configname = configname - libtoolflags = [] - - for libtoolflag in self._Settings().get("OTHER_LDFLAGS", []): - libtoolflags.append(libtoolflag) - # TODO(thakis): ARCHS? - - self.configname = None - return libtoolflags - - def GetPerTargetSettings(self): - """Gets a list of all the per-target settings. This will only fetch keys - whose values are the same across all configurations.""" - first_pass = True - result = {} - for configname in sorted(self.xcode_settings.keys()): - if first_pass: - result = dict(self.xcode_settings[configname]) - first_pass = False - else: - for key, value in self.xcode_settings[configname].items(): - if key not in result: - continue - elif result[key] != value: - del result[key] - return result - - def GetPerConfigSetting(self, setting, configname, default=None): - if configname in self.xcode_settings: - return self.xcode_settings[configname].get(setting, default) - else: - return self.GetPerTargetSetting(setting, default) - - def GetPerTargetSetting(self, setting, default=None): - """Tries to get xcode_settings.setting from spec. Assumes that the setting - has the same value in all configurations and throws otherwise.""" - is_first_pass = True - result = None - for configname in sorted(self.xcode_settings.keys()): - if is_first_pass: - result = self.xcode_settings[configname].get(setting, None) - is_first_pass = False - else: - assert result == self.xcode_settings[configname].get(setting, None), ( - "Expected per-target setting for '%s', got per-config setting " - "(target %s)" % (setting, self.spec["target_name"]) - ) - if result is None: - return default - return result - - def _GetStripPostbuilds(self, configname, output_binary, quiet): - """Returns a list of shell commands that contain the shell commands - necessary to strip this target's binary. These should be run as postbuilds - before the actual postbuilds run.""" - self.configname = configname - - result = [] - if self._Test("DEPLOYMENT_POSTPROCESSING", "YES", default="NO") and self._Test( - "STRIP_INSTALLED_PRODUCT", "YES", default="NO" - ): - default_strip_style = "debugging" - if ( - self.spec["type"] == "loadable_module" or self._IsIosAppExtension() - ) and self._IsBundle(): - default_strip_style = "non-global" - elif self.spec["type"] == "executable": - default_strip_style = "all" - - strip_style = self._Settings().get("STRIP_STYLE", default_strip_style) - strip_flags = {"all": "", "non-global": "-x", "debugging": "-S"}[ - strip_style - ] - - explicit_strip_flags = self._Settings().get("STRIPFLAGS", "") - if explicit_strip_flags: - strip_flags += " " + _NormalizeEnvVarReferences(explicit_strip_flags) - - if not quiet: - result.append("echo STRIP\\(%s\\)" % self.spec["target_name"]) - result.append(f"strip {strip_flags} {output_binary}") - - self.configname = None - return result - - def _GetDebugInfoPostbuilds(self, configname, output, output_binary, quiet): - """Returns a list of shell commands that contain the shell commands - necessary to massage this target's debug information. These should be run - as postbuilds before the actual postbuilds run.""" - self.configname = configname - - # For static libraries, no dSYMs are created. - result = [] - if ( - self._Test("GCC_GENERATE_DEBUGGING_SYMBOLS", "YES", default="YES") - and self._Test( - "DEBUG_INFORMATION_FORMAT", "dwarf-with-dsym", default="dwarf" - ) - and self.spec["type"] != "static_library" - ): - if not quiet: - result.append("echo DSYMUTIL\\(%s\\)" % self.spec["target_name"]) - result.append("dsymutil {} -o {}".format(output_binary, output + ".dSYM")) - - self.configname = None - return result - - def _GetTargetPostbuilds(self, configname, output, output_binary, quiet=False): - """Returns a list of shell commands that contain the shell commands - to run as postbuilds for this target, before the actual postbuilds.""" - # dSYMs need to build before stripping happens. - return self._GetDebugInfoPostbuilds( - configname, output, output_binary, quiet - ) + self._GetStripPostbuilds(configname, output_binary, quiet) - - def _GetIOSPostbuilds(self, configname, output_binary): - """Return a shell command to codesign the iOS output binary so it can - be deployed to a device. This should be run as the very last step of the - build.""" - if not ( - (self.isIOS and (self.spec["type"] == "executable" or self._IsXCTest())) - or self.IsIosFramework() - ): - return [] - - postbuilds = [] - product_name = self.GetFullProductName() - settings = self.xcode_settings[configname] - - # Xcode expects XCTests to be copied into the TEST_HOST dir. - if self._IsXCTest(): - source = os.path.join("${BUILT_PRODUCTS_DIR}", product_name) - test_host = os.path.dirname(settings.get("TEST_HOST")) - xctest_destination = os.path.join(test_host, "PlugIns", product_name) - postbuilds.extend([f"ditto {source} {xctest_destination}"]) - - key = self._GetIOSCodeSignIdentityKey(settings) - if not key: - return postbuilds - - # Warn for any unimplemented signing xcode keys. - unimpl = ["OTHER_CODE_SIGN_FLAGS"] - unimpl = set(unimpl) & set(self.xcode_settings[configname].keys()) - if unimpl: - print( - "Warning: Some codesign keys not implemented, ignoring: %s" - % ", ".join(sorted(unimpl)) - ) - - if self._IsXCTest(): - # For device xctests, Xcode copies two extra frameworks into $TEST_HOST. - test_host = os.path.dirname(settings.get("TEST_HOST")) - frameworks_dir = os.path.join(test_host, "Frameworks") - platform_root = self._XcodePlatformPath(configname) - frameworks = [ - "Developer/Library/PrivateFrameworks/IDEBundleInjection.framework", - "Developer/Library/Frameworks/XCTest.framework", - ] - for framework in frameworks: - source = os.path.join(platform_root, framework) - destination = os.path.join(frameworks_dir, os.path.basename(framework)) - postbuilds.extend([f"ditto {source} {destination}"]) - - # Then re-sign everything with 'preserve=True' - postbuilds.extend( - [ - '%s %s code-sign-bundle "%s" "%s" "%s" "%s" %s' - % ( - sys.executable, - os.path.join("${TARGET_BUILD_DIR}", "gyp-mac-tool"), - key, - settings.get("CODE_SIGN_ENTITLEMENTS", ""), - settings.get("PROVISIONING_PROFILE", ""), - destination, - True, - ) - ] - ) - plugin_dir = os.path.join(test_host, "PlugIns") - targets = [os.path.join(plugin_dir, product_name), test_host] - for target in targets: - postbuilds.extend( - [ - '%s %s code-sign-bundle "%s" "%s" "%s" "%s" %s' - % ( - sys.executable, - os.path.join("${TARGET_BUILD_DIR}", "gyp-mac-tool"), - key, - settings.get("CODE_SIGN_ENTITLEMENTS", ""), - settings.get("PROVISIONING_PROFILE", ""), - target, - True, - ) - ] - ) - - postbuilds.extend( - [ - '%s %s code-sign-bundle "%s" "%s" "%s" "%s" %s' - % ( - sys.executable, - os.path.join("${TARGET_BUILD_DIR}", "gyp-mac-tool"), - key, - settings.get("CODE_SIGN_ENTITLEMENTS", ""), - settings.get("PROVISIONING_PROFILE", ""), - os.path.join("${BUILT_PRODUCTS_DIR}", product_name), - False, - ) - ] - ) - return postbuilds - - def _GetIOSCodeSignIdentityKey(self, settings): - identity = settings.get("CODE_SIGN_IDENTITY") - if not identity: - return None - if identity not in XcodeSettings._codesigning_key_cache: - output = subprocess.check_output( - ["security", "find-identity", "-p", "codesigning", "-v"] - ) - for line in output.splitlines(): - if identity in line: - fingerprint = line.split()[1] - cache = XcodeSettings._codesigning_key_cache - assert identity not in cache or fingerprint == cache[identity], ( - "Multiple codesigning fingerprints for identity: %s" % identity - ) - XcodeSettings._codesigning_key_cache[identity] = fingerprint - return XcodeSettings._codesigning_key_cache.get(identity, "") - - def AddImplicitPostbuilds( - self, configname, output, output_binary, postbuilds=[], quiet=False - ): - """Returns a list of shell commands that should run before and after - |postbuilds|.""" - assert output_binary is not None - pre = self._GetTargetPostbuilds(configname, output, output_binary, quiet) - post = self._GetIOSPostbuilds(configname, output_binary) - return pre + postbuilds + post - - def _AdjustLibrary(self, library, config_name=None): - if library.endswith(".framework"): - l_flag = "-framework " + os.path.splitext(os.path.basename(library))[0] - else: - m = self.library_re.match(library) - l_flag = "-l" + m.group(1) if m else library - - sdk_root = self._SdkPath(config_name) - if not sdk_root: - sdk_root = "" - # Xcode 7 started shipping with ".tbd" (text based stubs) files instead of - # ".dylib" without providing a real support for them. What it does, for - # "/usr/lib" libraries, is do "-L/usr/lib -lname" which is dependent on the - # library order and cause collision when building Chrome. - # - # Instead substitute ".tbd" to ".dylib" in the generated project when the - # following conditions are both true: - # - library is referenced in the gyp file as "$(SDKROOT)/**/*.dylib", - # - the ".dylib" file does not exists but a ".tbd" file do. - library = l_flag.replace("$(SDKROOT)", sdk_root) - if l_flag.startswith("$(SDKROOT)"): - basename, ext = os.path.splitext(library) - if ext == ".dylib" and not os.path.exists(library): - tbd_library = basename + ".tbd" - if os.path.exists(tbd_library): - library = tbd_library - return library - - def AdjustLibraries(self, libraries, config_name=None): - """Transforms entries like 'Cocoa.framework' in libraries into entries like - '-framework Cocoa', 'libcrypto.dylib' into '-lcrypto', etc. - """ - libraries = [self._AdjustLibrary(library, config_name) for library in libraries] - return libraries - - def _BuildMachineOSBuild(self): - return GetStdout(["sw_vers", "-buildVersion"]) - - def _XcodeIOSDeviceFamily(self, configname): - family = self.xcode_settings[configname].get("TARGETED_DEVICE_FAMILY", "1") - return [int(x) for x in family.split(",")] - - def GetExtraPlistItems(self, configname=None): - """Returns a dictionary with extra items to insert into Info.plist.""" - if configname not in XcodeSettings._plist_cache: - cache = {} - cache["BuildMachineOSBuild"] = self._BuildMachineOSBuild() - - xcode_version, xcode_build = XcodeVersion() - cache["DTXcode"] = xcode_version - cache["DTXcodeBuild"] = xcode_build - compiler = self.xcode_settings[configname].get("GCC_VERSION") - if compiler is not None: - cache["DTCompiler"] = compiler - - sdk_root = self._SdkRoot(configname) - if not sdk_root: - sdk_root = self._DefaultSdkRoot() - sdk_version = self._GetSdkVersionInfoItem(sdk_root, "--show-sdk-version") - cache["DTSDKName"] = sdk_root + (sdk_version or "") - if xcode_version >= "0720": - cache["DTSDKBuild"] = self._GetSdkVersionInfoItem( - sdk_root, "--show-sdk-build-version" - ) - elif xcode_version >= "0430": - cache["DTSDKBuild"] = sdk_version - else: - cache["DTSDKBuild"] = cache["BuildMachineOSBuild"] - - if self.isIOS: - cache["MinimumOSVersion"] = self.xcode_settings[configname].get( - "IPHONEOS_DEPLOYMENT_TARGET" - ) - cache["DTPlatformName"] = sdk_root - cache["DTPlatformVersion"] = sdk_version - - if configname.endswith("iphoneos"): - cache["CFBundleSupportedPlatforms"] = ["iPhoneOS"] - cache["DTPlatformBuild"] = cache["DTSDKBuild"] - else: - cache["CFBundleSupportedPlatforms"] = ["iPhoneSimulator"] - # This is weird, but Xcode sets DTPlatformBuild to an empty field - # for simulator builds. - cache["DTPlatformBuild"] = "" - XcodeSettings._plist_cache[configname] = cache - - # Include extra plist items that are per-target, not per global - # XcodeSettings. - items = dict(XcodeSettings._plist_cache[configname]) - if self.isIOS: - items["UIDeviceFamily"] = self._XcodeIOSDeviceFamily(configname) - return items - - def _DefaultSdkRoot(self): - """Returns the default SDKROOT to use. - - Prior to version 5.0.0, if SDKROOT was not explicitly set in the Xcode - project, then the environment variable was empty. Starting with this - version, Xcode uses the name of the newest SDK installed. - """ - xcode_version, _ = XcodeVersion() - if xcode_version < "0500": - return "" - default_sdk_path = self._XcodeSdkPath("") - if default_sdk_root := XcodeSettings._sdk_root_cache.get(default_sdk_path): - return default_sdk_root - try: - all_sdks = GetStdout(["xcodebuild", "-showsdks"]) - except (GypError, OSError): - # If xcodebuild fails, there will be no valid SDKs - return "" - for line in all_sdks.splitlines(): - items = line.split() - if len(items) >= 3 and items[-2] == "-sdk": - sdk_root = items[-1] - sdk_path = self._XcodeSdkPath(sdk_root) - if sdk_path == default_sdk_path: - return sdk_root - return "" - - -class MacPrefixHeader: - """A class that helps with emulating Xcode's GCC_PREFIX_HEADER feature. - - This feature consists of several pieces: - * If GCC_PREFIX_HEADER is present, all compilations in that project get an - additional |-include path_to_prefix_header| cflag. - * If GCC_PRECOMPILE_PREFIX_HEADER is present too, then the prefix header is - instead compiled, and all other compilations in the project get an - additional |-include path_to_compiled_header| instead. - + Compiled prefix headers have the extension gch. There is one gch file for - every language used in the project (c, cc, m, mm), since gch files for - different languages aren't compatible. - + gch files themselves are built with the target's normal cflags, but they - obviously don't get the |-include| flag. Instead, they need a -x flag that - describes their language. - + All o files in the target need to depend on the gch file, to make sure - it's built before any o file is built. - - This class helps with some of these tasks, but it needs help from the build - system for writing dependencies to the gch files, for writing build commands - for the gch files, and for figuring out the location of the gch files. - """ - - def __init__( - self, xcode_settings, gyp_path_to_build_path, gyp_path_to_build_output - ): - """If xcode_settings is None, all methods on this class are no-ops. - - Args: - gyp_path_to_build_path: A function that takes a gyp-relative path, - and returns a path relative to the build directory. - gyp_path_to_build_output: A function that takes a gyp-relative path and - a language code ('c', 'cc', 'm', or 'mm'), and that returns a path - to where the output of precompiling that path for that language - should be placed (without the trailing '.gch'). - """ - # This doesn't support per-configuration prefix headers. Good enough - # for now. - self.header = None - self.compile_headers = False - if xcode_settings: - self.header = xcode_settings.GetPerTargetSetting("GCC_PREFIX_HEADER") - self.compile_headers = ( - xcode_settings.GetPerTargetSetting( - "GCC_PRECOMPILE_PREFIX_HEADER", default="NO" - ) - != "NO" - ) - self.compiled_headers = {} - if self.header: - if self.compile_headers: - for lang in ["c", "cc", "m", "mm"]: - self.compiled_headers[lang] = gyp_path_to_build_output( - self.header, lang - ) - self.header = gyp_path_to_build_path(self.header) - - def _CompiledHeader(self, lang, arch): - assert self.compile_headers - h = self.compiled_headers[lang] - if arch: - h += "." + arch - return h - - def GetInclude(self, lang, arch=None): - """Gets the cflags to include the prefix header for language |lang|.""" - if self.compile_headers and lang in self.compiled_headers: - return "-include %s" % self._CompiledHeader(lang, arch) - elif self.header: - return "-include %s" % self.header - else: - return "" - - def _Gch(self, lang, arch): - """Returns the actual file name of the prefix header for language |lang|.""" - assert self.compile_headers - return self._CompiledHeader(lang, arch) + ".gch" - - def GetObjDependencies(self, sources, objs, arch=None): - """Given a list of source files and the corresponding object files, returns - a list of (source, object, gch) tuples, where |gch| is the build-directory - relative path to the gch file each object file depends on. |compilable[i]| - has to be the source file belonging to |objs[i]|.""" - if not self.header or not self.compile_headers: - return [] - - result = [] - for source, obj in zip(sources, objs): - ext = os.path.splitext(source)[1] - lang = { - ".c": "c", - ".cpp": "cc", - ".cc": "cc", - ".cxx": "cc", - ".m": "m", - ".mm": "mm", - }.get(ext, None) - if lang: - result.append((source, obj, self._Gch(lang, arch))) - return result - - def GetPchBuildCommands(self, arch=None): - """Returns [(path_to_gch, language_flag, language, header)]. - |path_to_gch| and |header| are relative to the build directory. - """ - if not self.header or not self.compile_headers: - return [] - return [ - (self._Gch("c", arch), "-x c-header", "c", self.header), - (self._Gch("cc", arch), "-x c++-header", "cc", self.header), - (self._Gch("m", arch), "-x objective-c-header", "m", self.header), - (self._Gch("mm", arch), "-x objective-c++-header", "mm", self.header), - ] - - -def XcodeVersion(): - """Returns a tuple of version and build version of installed Xcode.""" - # `xcodebuild -version` output looks like - # Xcode 4.6.3 - # Build version 4H1503 - # or like - # Xcode 3.2.6 - # Component versions: DevToolsCore-1809.0; DevToolsSupport-1806.0 - # BuildVersion: 10M2518 - # Convert that to ('0463', '4H1503') or ('0326', '10M2518'). - global XCODE_VERSION_CACHE - if XCODE_VERSION_CACHE: - return XCODE_VERSION_CACHE - version = "" - build = "" - try: - version_list = GetStdoutQuiet(["xcodebuild", "-version"]).splitlines() - # In some circumstances xcodebuild exits 0 but doesn't return - # the right results; for example, a user on 10.7 or 10.8 with - # a bogus path set via xcode-select - # In that case this may be a CLT-only install so fall back to - # checking that version. - if len(version_list) < 2: - raise GypError("xcodebuild returned unexpected results") - version = version_list[0].split()[-1] # Last word on first line - build = version_list[-1].split()[-1] # Last word on last line - except (GypError, OSError): - # Xcode not installed so look for XCode Command Line Tools - version = CLTVersion() # macOS Catalina returns 11.0.0.0.1.1567737322 - if not version: - raise GypError("No Xcode or CLT version detected!") - # Be careful to convert "4.2.3" to "0423" and "11.0.0" to "1100": - version = version.split(".")[:3] # Just major, minor, micro - version[0] = version[0].zfill(2) # Add a leading zero if major is one digit - version = ("".join(version) + "00")[:4] # Limit to exactly four characters - XCODE_VERSION_CACHE = (version, build) - return XCODE_VERSION_CACHE - - -# This function ported from the logic in Homebrew's CLT version check -def CLTVersion(): - """Returns the version of command-line tools from pkgutil.""" - # pkgutil output looks like - # package-id: com.apple.pkg.CLTools_Executables - # version: 5.0.1.0.1.1382131676 - # volume: / - # location: / - # install-time: 1382544035 - # groups: com.apple.FindSystemFiles.pkg-group - # com.apple.DevToolsBoth.pkg-group - # com.apple.DevToolsNonRelocatableShared.pkg-group - STANDALONE_PKG_ID = "com.apple.pkg.DeveloperToolsCLILeo" - FROM_XCODE_PKG_ID = "com.apple.pkg.DeveloperToolsCLI" - MAVERICKS_PKG_ID = "com.apple.pkg.CLTools_Executables" - - regex = re.compile(r"version: (?P.+)") - for key in [MAVERICKS_PKG_ID, STANDALONE_PKG_ID, FROM_XCODE_PKG_ID]: - try: - output = GetStdout(["/usr/sbin/pkgutil", "--pkg-info", key]) - if m := re.search(regex, output): - return m.groupdict()["version"] - except (GypError, OSError): - continue - - regex = re.compile(r"Command Line Tools for Xcode\s+(?P\S+)") - try: - output = GetStdout(["/usr/sbin/softwareupdate", "--history"]) - if m := re.search(regex, output): - return m.groupdict()["version"] - except (GypError, OSError): - return None - - -def GetStdoutQuiet(cmdlist): - """Returns the content of standard output returned by invoking |cmdlist|. - Ignores the stderr. - Raises |GypError| if the command return with a non-zero return code.""" - job = subprocess.Popen(cmdlist, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - out = job.communicate()[0].decode("utf-8") - if job.returncode != 0: - raise GypError("Error %d running %s" % (job.returncode, cmdlist[0])) - return out.rstrip("\n") - - -def GetStdout(cmdlist): - """Returns the content of standard output returned by invoking |cmdlist|. - Raises |GypError| if the command return with a non-zero return code.""" - job = subprocess.Popen(cmdlist, stdout=subprocess.PIPE) - out = job.communicate()[0].decode("utf-8") - if job.returncode != 0: - sys.stderr.write(out + "\n") - raise GypError("Error %d running %s" % (job.returncode, cmdlist[0])) - return out.rstrip("\n") - - -def MergeGlobalXcodeSettingsToSpec(global_dict, spec): - """Merges the global xcode_settings dictionary into each configuration of the - target represented by spec. For keys that are both in the global and the local - xcode_settings dict, the local key gets precedence. - """ - # The xcode generator special-cases global xcode_settings and does something - # that amounts to merging in the global xcode_settings into each local - # xcode_settings dict. - global_xcode_settings = global_dict.get("xcode_settings", {}) - for config in spec["configurations"].values(): - if "xcode_settings" in config: - new_settings = global_xcode_settings.copy() - new_settings.update(config["xcode_settings"]) - config["xcode_settings"] = new_settings - - -def IsMacBundle(flavor, spec): - """Returns if |spec| should be treated as a bundle. - - Bundles are directories with a certain subdirectory structure, instead of - just a single file. Bundle rules do not produce a binary but also package - resources into that directory.""" - is_mac_bundle = ( - int(spec.get("mac_xctest_bundle", 0)) != 0 - or int(spec.get("mac_xcuitest_bundle", 0)) != 0 - or (int(spec.get("mac_bundle", 0)) != 0 and flavor == "mac") - ) - - if is_mac_bundle: - assert spec["type"] != "none", ( - 'mac_bundle targets cannot have type none (target "%s")' - % spec["target_name"] - ) - return is_mac_bundle - - -def GetMacBundleResources(product_dir, xcode_settings, resources): - """Yields (output, resource) pairs for every resource in |resources|. - Only call this for mac bundle targets. - - Args: - product_dir: Path to the directory containing the output bundle, - relative to the build directory. - xcode_settings: The XcodeSettings of the current target. - resources: A list of bundle resources, relative to the build directory. - """ - dest = os.path.join(product_dir, xcode_settings.GetBundleResourceFolder()) - for res in resources: - output = dest - - # The make generator doesn't support it, so forbid it everywhere - # to keep the generators more interchangeable. - assert " " not in res, "Spaces in resource filenames not supported (%s)" % res - - # Split into (path,file). - res_parts = os.path.split(res) - - # Now split the path into (prefix,maybe.lproj). - lproj_parts = os.path.split(res_parts[0]) - # If the resource lives in a .lproj bundle, add that to the destination. - if lproj_parts[1].endswith(".lproj"): - output = os.path.join(output, lproj_parts[1]) - - output = os.path.join(output, res_parts[1]) - # Compiled XIB files are referred to by .nib. - if output.endswith(".xib"): - output = os.path.splitext(output)[0] + ".nib" - # Compiled storyboard files are referred to by .storyboardc. - if output.endswith(".storyboard"): - output = os.path.splitext(output)[0] + ".storyboardc" - - yield output, res - - -def GetMacInfoPlist(product_dir, xcode_settings, gyp_path_to_build_path): - """Returns (info_plist, dest_plist, defines, extra_env), where: - * |info_plist| is the source plist path, relative to the - build directory, - * |dest_plist| is the destination plist path, relative to the - build directory, - * |defines| is a list of preprocessor defines (empty if the plist - shouldn't be preprocessed, - * |extra_env| is a dict of env variables that should be exported when - invoking |mac_tool copy-info-plist|. - - Only call this for mac bundle targets. - - Args: - product_dir: Path to the directory containing the output bundle, - relative to the build directory. - xcode_settings: The XcodeSettings of the current target. - gyp_to_build_path: A function that converts paths relative to the - current gyp file to paths relative to the build directory. - """ - info_plist = xcode_settings.GetPerTargetSetting("INFOPLIST_FILE") - if not info_plist: - return None, None, [], {} - - # The make generator doesn't support it, so forbid it everywhere - # to keep the generators more interchangeable. - assert " " not in info_plist, ( - "Spaces in Info.plist filenames not supported (%s)" % info_plist - ) - - info_plist = gyp_path_to_build_path(info_plist) - - # If explicitly set to preprocess the plist, invoke the C preprocessor and - # specify any defines as -D flags. - if ( - xcode_settings.GetPerTargetSetting("INFOPLIST_PREPROCESS", default="NO") - == "YES" - ): - # Create an intermediate file based on the path. - defines = shlex.split( - xcode_settings.GetPerTargetSetting( - "INFOPLIST_PREPROCESSOR_DEFINITIONS", default="" - ) - ) - else: - defines = [] - - dest_plist = os.path.join(product_dir, xcode_settings.GetBundlePlistPath()) - extra_env = xcode_settings.GetPerTargetSettings() - - return info_plist, dest_plist, defines, extra_env - - -def _GetXcodeEnv( - xcode_settings, built_products_dir, srcroot, configuration, additional_settings=None -): - """Return the environment variables that Xcode would set. See - http://developer.apple.com/library/mac/#documentation/DeveloperTools/Reference/XcodeBuildSettingRef/1-Build_Setting_Reference/build_setting_ref.html#//apple_ref/doc/uid/TP40003931-CH3-SW153 - for a full list. - - Args: - xcode_settings: An XcodeSettings object. If this is None, this function - returns an empty dict. - built_products_dir: Absolute path to the built products dir. - srcroot: Absolute path to the source root. - configuration: The build configuration name. - additional_settings: An optional dict with more values to add to the - result. - """ - - if not xcode_settings: - return {} - - # This function is considered a friend of XcodeSettings, so let it reach into - # its implementation details. - spec = xcode_settings.spec - - # These are filled in on an as-needed basis. - env = { - "BUILT_FRAMEWORKS_DIR": built_products_dir, - "BUILT_PRODUCTS_DIR": built_products_dir, - "CONFIGURATION": configuration, - "PRODUCT_NAME": xcode_settings.GetProductName(), - # For FULL_PRODUCT_NAME see: - # /Developer/Platforms/MacOSX.platform/Developer/Library/Xcode/Specifications/MacOSX\ Product\ Types.xcspec # noqa: E501 - "SRCROOT": srcroot, - "SOURCE_ROOT": "${SRCROOT}", - # This is not true for static libraries, but currently the env is only - # written for bundles: - "TARGET_BUILD_DIR": built_products_dir, - "TEMP_DIR": "${TMPDIR}", - "XCODE_VERSION_ACTUAL": XcodeVersion()[0], - } - if xcode_settings.GetPerConfigSetting("SDKROOT", configuration): - env["SDKROOT"] = xcode_settings._SdkPath(configuration) - else: - env["SDKROOT"] = "" - - if xcode_settings.mac_toolchain_dir: - env["DEVELOPER_DIR"] = xcode_settings.mac_toolchain_dir - - if spec["type"] in ( - "executable", - "static_library", - "shared_library", - "loadable_module", - ): - env["EXECUTABLE_NAME"] = xcode_settings.GetExecutableName() - env["EXECUTABLE_PATH"] = xcode_settings.GetExecutablePath() - env["FULL_PRODUCT_NAME"] = xcode_settings.GetFullProductName() - mach_o_type = xcode_settings.GetMachOType() - if mach_o_type: - env["MACH_O_TYPE"] = mach_o_type - env["PRODUCT_TYPE"] = xcode_settings.GetProductType() - if xcode_settings._IsBundle(): - # xcodeproj_file.py sets the same Xcode subfolder value for this as for - # FRAMEWORKS_FOLDER_PATH so Xcode builds will actually use FFP's value. - env["BUILT_FRAMEWORKS_DIR"] = os.path.join( - built_products_dir + os.sep + xcode_settings.GetBundleFrameworksFolderPath() - ) - env["CONTENTS_FOLDER_PATH"] = xcode_settings.GetBundleContentsFolderPath() - env["EXECUTABLE_FOLDER_PATH"] = xcode_settings.GetBundleExecutableFolderPath() - env["UNLOCALIZED_RESOURCES_FOLDER_PATH"] = ( - xcode_settings.GetBundleResourceFolder() - ) - env["JAVA_FOLDER_PATH"] = xcode_settings.GetBundleJavaFolderPath() - env["FRAMEWORKS_FOLDER_PATH"] = xcode_settings.GetBundleFrameworksFolderPath() - env["SHARED_FRAMEWORKS_FOLDER_PATH"] = ( - xcode_settings.GetBundleSharedFrameworksFolderPath() - ) - env["SHARED_SUPPORT_FOLDER_PATH"] = ( - xcode_settings.GetBundleSharedSupportFolderPath() - ) - env["PLUGINS_FOLDER_PATH"] = xcode_settings.GetBundlePlugInsFolderPath() - env["XPCSERVICES_FOLDER_PATH"] = xcode_settings.GetBundleXPCServicesFolderPath() - env["INFOPLIST_PATH"] = xcode_settings.GetBundlePlistPath() - env["WRAPPER_NAME"] = xcode_settings.GetWrapperName() - - if install_name := xcode_settings.GetInstallName(): - env["LD_DYLIB_INSTALL_NAME"] = install_name - if install_name_base := xcode_settings.GetInstallNameBase(): - env["DYLIB_INSTALL_NAME_BASE"] = install_name_base - xcode_version, _ = XcodeVersion() - if xcode_version >= "0500" and not env.get("SDKROOT"): - sdk_root = xcode_settings._SdkRoot(configuration) - if not sdk_root: - sdk_root = xcode_settings._XcodeSdkPath("") - if sdk_root is None: - sdk_root = "" - env["SDKROOT"] = sdk_root - - if not additional_settings: - additional_settings = {} - else: - # Flatten lists to strings. - for k in additional_settings: - if not isinstance(additional_settings[k], str): - additional_settings[k] = " ".join(additional_settings[k]) - additional_settings.update(env) - - for k in additional_settings: - additional_settings[k] = _NormalizeEnvVarReferences(additional_settings[k]) - - return additional_settings - - -def _NormalizeEnvVarReferences(str): - """Takes a string containing variable references in the form ${FOO}, $(FOO), - or $FOO, and returns a string with all variable references in the form ${FOO}. - """ - # $FOO -> ${FOO} - str = re.sub(r"\$([a-zA-Z_][a-zA-Z0-9_]*)", r"${\1}", str) - - # $(FOO) -> ${FOO} - matches = re.findall(r"(\$\(([a-zA-Z0-9\-_]+)\))", str) - for match in matches: - to_replace, variable = match - assert "$(" not in match, "$($(FOO)) variables not supported: " + match - str = str.replace(to_replace, "${" + variable + "}") - - return str - - -def ExpandEnvVars(string, expansions): - """Expands ${VARIABLES}, $(VARIABLES), and $VARIABLES in string per the - expansions list. If the variable expands to something that references - another variable, this variable is expanded as well if it's in env -- - until no variables present in env are left.""" - for k, v in reversed(expansions): - string = string.replace("${" + k + "}", v) - string = string.replace("$(" + k + ")", v) - string = string.replace("$" + k, v) - return string - - -def _TopologicallySortedEnvVarKeys(env): - """Takes a dict |env| whose values are strings that can refer to other keys, - for example env['foo'] = '$(bar) and $(baz)'. Returns a list L of all keys of - env such that key2 is after key1 in L if env[key2] refers to env[key1]. - - Throws an Exception in case of dependency cycles. - """ - # Since environment variables can refer to other variables, the evaluation - # order is important. Below is the logic to compute the dependency graph - # and sort it. - regex = re.compile(r"\$\{([a-zA-Z0-9\-_]+)\}") - - def GetEdges(node): - # Use a definition of edges such that user_of_variable -> used_variable. - # This happens to be easier in this case, since a variable's - # definition contains all variables it references in a single string. - # We can then reverse the result of the topological sort at the end. - # Since: reverse(topsort(DAG)) = topsort(reverse_edges(DAG)) - matches = {v for v in regex.findall(env[node]) if v in env} - for dependee in matches: - assert "${" not in dependee, "Nested variables not supported: " + dependee - return matches - - try: - # Topologically sort, and then reverse, because we used an edge definition - # that's inverted from the expected result of this function (see comment - # above). - order = gyp.common.TopologicallySorted(env.keys(), GetEdges) - order.reverse() - return order - except gyp.common.CycleError as e: - raise GypError( - "Xcode environment variables are cyclically dependent: " + str(e.nodes) - ) - - -def GetSortedXcodeEnv( - xcode_settings, built_products_dir, srcroot, configuration, additional_settings=None -): - env = _GetXcodeEnv( - xcode_settings, built_products_dir, srcroot, configuration, additional_settings - ) - return [(key, env[key]) for key in _TopologicallySortedEnvVarKeys(env)] - - -def GetSpecPostbuildCommands(spec, quiet=False): - """Returns the list of postbuilds explicitly defined on |spec|, in a form - executable by a shell.""" - postbuilds = [] - for postbuild in spec.get("postbuilds", []): - if not quiet: - postbuilds.append( - "echo POSTBUILD\\(%s\\) %s" - % (spec["target_name"], postbuild["postbuild_name"]) - ) - postbuilds.append(gyp.common.EncodePOSIXShellList(postbuild["action"])) - return postbuilds - - -def _HasIOSTarget(targets): - """Returns true if any target contains the iOS specific key - IPHONEOS_DEPLOYMENT_TARGET.""" - for target_dict in targets.values(): - for config in target_dict["configurations"].values(): - if config.get("xcode_settings", {}).get("IPHONEOS_DEPLOYMENT_TARGET"): - return True - return False - - -def _AddIOSDeviceConfigurations(targets): - """Clone all targets and append -iphoneos to the name. Configure these targets - to build for iOS devices and use correct architectures for those builds.""" - for target_dict in targets.values(): - toolset = target_dict["toolset"] - configs = target_dict["configurations"] - for config_name, simulator_config_dict in dict(configs).items(): - iphoneos_config_dict = copy.deepcopy(simulator_config_dict) - configs[config_name + "-iphoneos"] = iphoneos_config_dict - configs[config_name + "-iphonesimulator"] = simulator_config_dict - if toolset == "target": - simulator_config_dict["xcode_settings"]["SDKROOT"] = "iphonesimulator" - iphoneos_config_dict["xcode_settings"]["SDKROOT"] = "iphoneos" - return targets - - -def CloneConfigurationForDeviceAndEmulator(target_dicts): - """If |target_dicts| contains any iOS targets, automatically create -iphoneos - targets for iOS device builds.""" - if _HasIOSTarget(target_dicts): - return _AddIOSDeviceConfigurations(target_dicts) - return target_dicts diff --git a/tools/gyp/pylib/gyp/xcode_emulation_test.py b/tools/gyp/pylib/gyp/xcode_emulation_test.py deleted file mode 100644 index 03cbbaea846..00000000000 --- a/tools/gyp/pylib/gyp/xcode_emulation_test.py +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/env python3 - -"""Unit tests for the xcode_emulation.py file.""" - -import sys -import unittest - -from gyp.xcode_emulation import XcodeSettings - - -class TestXcodeSettings(unittest.TestCase): - def setUp(self): - if sys.platform != "darwin": - self.skipTest("This test only runs on macOS") - - def test_GetCflags(self): - target = { - "type": "static_library", - "configurations": { - "Release": {}, - }, - } - configuration_name = "Release" - xcode_settings = XcodeSettings(target) - cflags = xcode_settings.GetCflags(configuration_name, "arm64") - - # Do not quote `-arch arm64` with spaces in one string. - self.assertEqual( - cflags, - ["-fasm-blocks", "-mpascal-strings", "-Os", "-gdwarf-2", "-arch", "arm64"], - ) - - def GypToBuildPath(self, path): - return path - - def test_GetLdflags(self): - target = { - "type": "static_library", - "configurations": { - "Release": {}, - }, - } - configuration_name = "Release" - xcode_settings = XcodeSettings(target) - ldflags = xcode_settings.GetLdflags( - configuration_name, "PRODUCT_DIR", self.GypToBuildPath, "arm64" - ) - - # Do not quote `-arch arm64` with spaces in one string. - self.assertEqual(ldflags, ["-arch", "arm64", "-LPRODUCT_DIR"]) - - -if __name__ == "__main__": - unittest.main() diff --git a/tools/gyp/pylib/gyp/xcode_ninja.py b/tools/gyp/pylib/gyp/xcode_ninja.py deleted file mode 100644 index a133fdbe8b4..00000000000 --- a/tools/gyp/pylib/gyp/xcode_ninja.py +++ /dev/null @@ -1,301 +0,0 @@ -# Copyright (c) 2014 Google Inc. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Xcode-ninja wrapper project file generator. - -This updates the data structures passed to the Xcode gyp generator to build -with ninja instead. The Xcode project itself is transformed into a list of -executable targets, each with a build step to build with ninja, and a target -with every source and resource file. This appears to sidestep some of the -major performance headaches experienced using complex projects and large number -of targets within Xcode. -""" - -import errno -import os -import re -import xml.sax.saxutils - -import gyp.generator.ninja - - -def _WriteWorkspace(main_gyp, sources_gyp, params): - """Create a workspace to wrap main and sources gyp paths.""" - (build_file_root, _build_file_ext) = os.path.splitext(main_gyp) - workspace_path = build_file_root + ".xcworkspace" - options = params["options"] - if options.generator_output: - workspace_path = os.path.join(options.generator_output, workspace_path) - try: - os.makedirs(workspace_path) - except OSError as e: - if e.errno != errno.EEXIST: - raise - output_string = ( - '\n' + '\n' - ) - for gyp_name in [main_gyp, sources_gyp]: - name = os.path.splitext(os.path.basename(gyp_name))[0] + ".xcodeproj" - name = xml.sax.saxutils.quoteattr("group:" + name) - output_string += " \n" % name - output_string += "\n" - - workspace_file = os.path.join(workspace_path, "contents.xcworkspacedata") - - try: - with open(workspace_file) as input_file: - input_string = input_file.read() - if input_string == output_string: - return - except OSError: - # Ignore errors if the file doesn't exist. - pass - - with open(workspace_file, "w") as output_file: - output_file.write(output_string) - - -def _TargetFromSpec(old_spec, params): - """Create fake target for xcode-ninja wrapper.""" - # Determine ninja top level build dir (e.g. /path/to/out). - ninja_toplevel = None - jobs = 0 - if params: - options = params["options"] - ninja_toplevel = os.path.join( - options.toplevel_dir, gyp.generator.ninja.ComputeOutputDir(params) - ) - jobs = params.get("generator_flags", {}).get("xcode_ninja_jobs", 0) - - target_name = old_spec.get("target_name") - product_name = old_spec.get("product_name", target_name) - - ninja_target = {} - ninja_target["target_name"] = target_name - ninja_target["product_name"] = product_name - if product_extension := old_spec.get("product_extension"): - ninja_target["product_extension"] = product_extension - ninja_target["toolset"] = old_spec.get("toolset") - ninja_target["default_configuration"] = old_spec.get("default_configuration") - ninja_target["configurations"] = {} - - # Tell Xcode to look in |ninja_toplevel| for build products. - new_xcode_settings = {} - if ninja_toplevel: - new_xcode_settings["CONFIGURATION_BUILD_DIR"] = ( - "%s/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)" % ninja_toplevel - ) - - if "configurations" in old_spec: - for config in old_spec["configurations"]: - old_xcode_settings = old_spec["configurations"][config].get( - "xcode_settings", {} - ) - if "IPHONEOS_DEPLOYMENT_TARGET" in old_xcode_settings: - new_xcode_settings["CODE_SIGNING_REQUIRED"] = "NO" - new_xcode_settings["IPHONEOS_DEPLOYMENT_TARGET"] = old_xcode_settings[ - "IPHONEOS_DEPLOYMENT_TARGET" - ] - for key in ["BUNDLE_LOADER", "TEST_HOST"]: - if key in old_xcode_settings: - new_xcode_settings[key] = old_xcode_settings[key] - - ninja_target["configurations"][config] = {} - ninja_target["configurations"][config]["xcode_settings"] = ( - new_xcode_settings - ) - - ninja_target["mac_bundle"] = old_spec.get("mac_bundle", 0) - ninja_target["mac_xctest_bundle"] = old_spec.get("mac_xctest_bundle", 0) - ninja_target["ios_app_extension"] = old_spec.get("ios_app_extension", 0) - ninja_target["ios_watchkit_extension"] = old_spec.get("ios_watchkit_extension", 0) - ninja_target["ios_watchkit_app"] = old_spec.get("ios_watchkit_app", 0) - ninja_target["type"] = old_spec["type"] - if ninja_toplevel: - ninja_target["actions"] = [ - { - "action_name": "Compile and copy %s via ninja" % target_name, - "inputs": [], - "outputs": [], - "action": [ - "env", - "PATH=%s" % os.environ["PATH"], - "ninja", - "-C", - new_xcode_settings["CONFIGURATION_BUILD_DIR"], - target_name, - ], - "message": "Compile and copy %s via ninja" % target_name, - }, - ] - if jobs > 0: - ninja_target["actions"][0]["action"].extend(("-j", jobs)) - return ninja_target - - -def IsValidTargetForWrapper(target_extras, executable_target_pattern, spec): - """Limit targets for Xcode wrapper. - - Xcode sometimes performs poorly with too many targets, so only include - proper executable targets, with filters to customize. - Arguments: - target_extras: Regular expression to always add, matching any target. - executable_target_pattern: Regular expression limiting executable targets. - spec: Specifications for target. - """ - target_name = spec.get("target_name") - # Always include targets matching target_extras. - if target_extras is not None and re.search(target_extras, target_name): - return True - - # Otherwise just show executable targets and xc_tests. - if int(spec.get("mac_xctest_bundle", 0)) != 0 or ( - spec.get("type", "") == "executable" - and spec.get("product_extension", "") != "bundle" - ): - # If there is a filter and the target does not match, exclude the target. - if executable_target_pattern is not None: - if not re.search(executable_target_pattern, target_name): - return False - return True - return False - - -def CreateWrapper(target_list, target_dicts, data, params): - """Initialize targets for the ninja wrapper. - - This sets up the necessary variables in the targets to generate Xcode projects - that use ninja as an external builder. - Arguments: - target_list: List of target pairs: 'base/base.gyp:base'. - target_dicts: Dict of target properties keyed on target pair. - data: Dict of flattened build files keyed on gyp path. - params: Dict of global options for gyp. - """ - orig_gyp = params["build_files"][0] - for gyp_name, gyp_dict in data.items(): - if gyp_name == orig_gyp: - depth = gyp_dict["_DEPTH"] - - # Check for custom main gyp name, otherwise use the default CHROMIUM_GYP_FILE - # and prepend .ninja before the .gyp extension. - generator_flags = params.get("generator_flags", {}) - main_gyp = generator_flags.get("xcode_ninja_main_gyp", None) - if main_gyp is None: - (build_file_root, build_file_ext) = os.path.splitext(orig_gyp) - main_gyp = build_file_root + ".ninja" + build_file_ext - - # Create new |target_list|, |target_dicts| and |data| data structures. - new_target_list = [] - new_target_dicts = {} - new_data = {} - - # Set base keys needed for |data|. - new_data[main_gyp] = {} - new_data[main_gyp]["included_files"] = [] - new_data[main_gyp]["targets"] = [] - new_data[main_gyp]["xcode_settings"] = data[orig_gyp].get("xcode_settings", {}) - - # Normally the xcode-ninja generator includes only valid executable targets. - # If |xcode_ninja_executable_target_pattern| is set, that list is reduced to - # executable targets that match the pattern. (Default all) - executable_target_pattern = generator_flags.get( - "xcode_ninja_executable_target_pattern", None - ) - - # For including other non-executable targets, add the matching target name - # to the |xcode_ninja_target_pattern| regular expression. (Default none) - target_extras = generator_flags.get("xcode_ninja_target_pattern", None) - - for old_qualified_target in target_list: - spec = target_dicts[old_qualified_target] - if IsValidTargetForWrapper(target_extras, executable_target_pattern, spec): - # Add to new_target_list. - target_name = spec.get("target_name") - new_target_name = f"{main_gyp}:{target_name}#target" - new_target_list.append(new_target_name) - - # Add to new_target_dicts. - new_target_dicts[new_target_name] = _TargetFromSpec(spec, params) - - # Add to new_data. - for old_target in data[old_qualified_target.split(":")[0]]["targets"]: - if old_target["target_name"] == target_name: - new_data_target = {} - new_data_target["target_name"] = old_target["target_name"] - new_data_target["toolset"] = old_target["toolset"] - new_data[main_gyp]["targets"].append(new_data_target) - - # Create sources target. - sources_target_name = "sources_for_indexing" - sources_target = _TargetFromSpec( - { - "target_name": sources_target_name, - "toolset": "target", - "default_configuration": "Default", - "mac_bundle": "0", - "type": "executable", - }, - None, - ) - - # Tell Xcode to look everywhere for headers. - sources_target["configurations"] = {"Default": {"include_dirs": [depth]}} - - # Put excluded files into the sources target so they can be opened in Xcode. - skip_excluded_files = not generator_flags.get( - "xcode_ninja_list_excluded_files", True - ) - - sources = [] - for target, target_dict in target_dicts.items(): - base = os.path.dirname(target) - files = target_dict.get("sources", []) + target_dict.get( - "mac_bundle_resources", [] - ) - - if not skip_excluded_files: - files.extend( - target_dict.get("sources_excluded", []) - + target_dict.get("mac_bundle_resources_excluded", []) - ) - - for action in target_dict.get("actions", []): - files.extend(action.get("inputs", [])) - - if not skip_excluded_files: - files.extend(action.get("inputs_excluded", [])) - - # Remove files starting with $. These are mostly intermediate files for the - # build system. - files = [file for file in files if not file.startswith("$")] - - # Make sources relative to root build file. - relative_path = os.path.dirname(main_gyp) - sources += [ - os.path.relpath(os.path.join(base, file), relative_path) for file in files - ] - - sources_target["sources"] = sorted(set(sources)) - - # Put sources_to_index in it's own gyp. - sources_gyp = os.path.join(os.path.dirname(main_gyp), sources_target_name + ".gyp") - fully_qualified_target_name = f"{sources_gyp}:{sources_target_name}#target" - - # Add to new_target_list, new_target_dicts and new_data. - new_target_list.append(fully_qualified_target_name) - new_target_dicts[fully_qualified_target_name] = sources_target - new_data_target = {} - new_data_target["target_name"] = sources_target["target_name"] - new_data_target["_DEPTH"] = depth - new_data_target["toolset"] = "target" - new_data[sources_gyp] = {} - new_data[sources_gyp]["targets"] = [] - new_data[sources_gyp]["included_files"] = [] - new_data[sources_gyp]["xcode_settings"] = data[orig_gyp].get("xcode_settings", {}) - new_data[sources_gyp]["targets"].append(new_data_target) - - # Write workspace to file. - _WriteWorkspace(main_gyp, sources_gyp, params) - return (new_target_list, new_target_dicts, new_data) diff --git a/tools/gyp/pylib/gyp/xcodeproj_file.py b/tools/gyp/pylib/gyp/xcodeproj_file.py deleted file mode 100644 index 2004518dcbc..00000000000 --- a/tools/gyp/pylib/gyp/xcodeproj_file.py +++ /dev/null @@ -1,3180 +0,0 @@ -# Copyright (c) 2012 Google Inc. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Xcode project file generator. - -This module is both an Xcode project file generator and a documentation of the -Xcode project file format. Knowledge of the project file format was gained -based on extensive experience with Xcode, and by making changes to projects in -Xcode.app and observing the resultant changes in the associated project files. - -XCODE PROJECT FILES - -The generator targets the file format as written by Xcode 3.2 (specifically, -3.2.6), but past experience has taught that the format has not changed -significantly in the past several years, and future versions of Xcode are able -to read older project files. - -Xcode project files are "bundled": the project "file" from an end-user's -perspective is actually a directory with an ".xcodeproj" extension. The -project file from this module's perspective is actually a file inside this -directory, always named "project.pbxproj". This file contains a complete -description of the project and is all that is needed to use the xcodeproj. -Other files contained in the xcodeproj directory are simply used to store -per-user settings, such as the state of various UI elements in the Xcode -application. - -The project.pbxproj file is a property list, stored in a format almost -identical to the NeXTstep property list format. The file is able to carry -Unicode data, and is encoded in UTF-8. The root element in the property list -is a dictionary that contains several properties of minimal interest, and two -properties of immense interest. The most important property is a dictionary -named "objects". The entire structure of the project is represented by the -children of this property. The objects dictionary is keyed by unique 96-bit -values represented by 24 uppercase hexadecimal characters. Each value in the -objects dictionary is itself a dictionary, describing an individual object. - -Each object in the dictionary is a member of a class, which is identified by -the "isa" property of each object. A variety of classes are represented in a -project file. Objects can refer to other objects by ID, using the 24-character -hexadecimal object key. A project's objects form a tree, with a root object -of class PBXProject at the root. As an example, the PBXProject object serves -as parent to an XCConfigurationList object defining the build configurations -used in the project, a PBXGroup object serving as a container for all files -referenced in the project, and a list of target objects, each of which defines -a target in the project. There are several different types of target object, -such as PBXNativeTarget and PBXAggregateTarget. In this module, this -relationship is expressed by having each target type derive from an abstract -base named XCTarget. - -The project.pbxproj file's root dictionary also contains a property, sibling to -the "objects" dictionary, named "rootObject". The value of rootObject is a -24-character object key referring to the root PBXProject object in the -objects dictionary. - -In Xcode, every file used as input to a target or produced as a final product -of a target must appear somewhere in the hierarchy rooted at the PBXGroup -object referenced by the PBXProject's mainGroup property. A PBXGroup is -generally represented as a folder in the Xcode application. PBXGroups can -contain other PBXGroups as well as PBXFileReferences, which are pointers to -actual files. - -Each XCTarget contains a list of build phases, represented in this module by -the abstract base XCBuildPhase. Examples of concrete XCBuildPhase derivations -are PBXSourcesBuildPhase and PBXFrameworksBuildPhase, which correspond to the -"Compile Sources" and "Link Binary With Libraries" phases displayed in the -Xcode application. Files used as input to these phases (for example, source -files in the former case and libraries and frameworks in the latter) are -represented by PBXBuildFile objects, referenced by elements of "files" lists -in XCTarget objects. Each PBXBuildFile object refers to a PBXBuildFile -object as a "weak" reference: it does not "own" the PBXBuildFile, which is -owned by the root object's mainGroup or a descendant group. In most cases, the -layer of indirection between an XCBuildPhase and a PBXFileReference via a -PBXBuildFile appears extraneous, but there's actually one reason for this: -file-specific compiler flags are added to the PBXBuildFile object so as to -allow a single file to be a member of multiple targets while having distinct -compiler flags for each. These flags can be modified in the Xcode application -in the "Build" tab of a File Info window. - -When a project is open in the Xcode application, Xcode will rewrite it. As -such, this module is careful to adhere to the formatting used by Xcode, to -avoid insignificant changes appearing in the file when it is used in the -Xcode application. This will keep version control repositories happy, and -makes it possible to compare a project file used in Xcode to one generated by -this module to determine if any significant changes were made in the -application. - -Xcode has its own way of assigning 24-character identifiers to each object, -which is not duplicated here. Because the identifier only is only generated -once, when an object is created, and is then left unchanged, there is no need -to attempt to duplicate Xcode's behavior in this area. The generator is free -to select any identifier, even at random, to refer to the objects it creates, -and Xcode will retain those identifiers and use them when subsequently -rewriting the project file. However, the generator would choose new random -identifiers each time the project files are generated, leading to difficulties -comparing "used" project files to "pristine" ones produced by this module, -and causing the appearance of changes as every object identifier is changed -when updated projects are checked in to a version control repository. To -mitigate this problem, this module chooses identifiers in a more deterministic -way, by hashing a description of each object as well as its parent and ancestor -objects. This strategy should result in minimal "shift" in IDs as successive -generations of project files are produced. - -THIS MODULE - -This module introduces several classes, all derived from the XCObject class. -Nearly all of the "brains" are built into the XCObject class, which understands -how to create and modify objects, maintain the proper tree structure, compute -identifiers, and print objects. For the most part, classes derived from -XCObject need only provide a _schema class object, a dictionary that -expresses what properties objects of the class may contain. - -Given this structure, it's possible to build a minimal project file by creating -objects of the appropriate types and making the proper connections: - - config_list = XCConfigurationList() - group = PBXGroup() - project = PBXProject({'buildConfigurationList': config_list, - 'mainGroup': group}) - -With the project object set up, it can be added to an XCProjectFile object. -XCProjectFile is a pseudo-class in the sense that it is a concrete XCObject -subclass that does not actually correspond to a class type found in a project -file. Rather, it is used to represent the project file's root dictionary. -Printing an XCProjectFile will print the entire project file, including the -full "objects" dictionary. - - project_file = XCProjectFile({'rootObject': project}) - project_file.ComputeIDs() - project_file.Print() - -Xcode project files are always encoded in UTF-8. This module will accept -strings of either the str class or the unicode class. Strings of class str -are assumed to already be encoded in UTF-8. Obviously, if you're just using -ASCII, you won't encounter difficulties because ASCII is a UTF-8 subset. -Strings of class unicode are handled properly and encoded in UTF-8 when -a project file is output. -""" - -import hashlib -import posixpath -import re -import struct -import sys -from functools import cmp_to_key -from operator import attrgetter - -import gyp.common - - -def cmp(x, y): - return (x > y) - (x < y) - - -# See XCObject._EncodeString. This pattern is used to determine when a string -# can be printed unquoted. Strings that match this pattern may be printed -# unquoted. Strings that do not match must be quoted and may be further -# transformed to be properly encoded. Note that this expression matches the -# characters listed with "+", for 1 or more occurrences: if a string is empty, -# it must not match this pattern, because it needs to be encoded as "". -_unquoted = re.compile("^[A-Za-z0-9$./_]+$") - -# Strings that match this pattern are quoted regardless of what _unquoted says. -# Oddly, Xcode will quote any string with a run of three or more underscores. -_quoted = re.compile("___") - -# This pattern should match any character that needs to be escaped by -# XCObject._EncodeString. See that function. -_escaped = re.compile('[\\\\"]|[\x00-\x1f]') - - -# Used by SourceTreeAndPathFromPath -_path_leading_variable = re.compile(r"^\$\((.*?)\)(/(.*))?$") - - -def SourceTreeAndPathFromPath(input_path): - """Given input_path, returns a tuple with sourceTree and path values. - - Examples: - input_path (source_tree, output_path) - '$(VAR)/path' ('VAR', 'path') - '$(VAR)' ('VAR', None) - 'path' (None, 'path') - """ - - if source_group_match := _path_leading_variable.match(input_path): - source_tree = source_group_match.group(1) - output_path = source_group_match.group(3) # This may be None. - else: - source_tree = None - output_path = input_path - - return (source_tree, output_path) - - -def ConvertVariablesToShellSyntax(input_string): - return re.sub(r"\$\((.*?)\)", "${\\1}", input_string) - - -class XCObject: - """The abstract base of all class types used in Xcode project files. - - Class variables: - _schema: A dictionary defining the properties of this class. The keys to - _schema are string property keys as used in project files. Values - are a list of four or five elements: - [ is_list, property_type, is_strong, is_required, default ] - is_list: True if the property described is a list, as opposed - to a single element. - property_type: The type to use as the value of the property, - or if is_list is True, the type to use for each - element of the value's list. property_type must - be an XCObject subclass, or one of the built-in - types str, int, or dict. - is_strong: If property_type is an XCObject subclass, is_strong - is True to assert that this class "owns," or serves - as parent, to the property value (or, if is_list is - True, values). is_strong must be False if - property_type is not an XCObject subclass. - is_required: True if the property is required for the class. - Note that is_required being True does not preclude - an empty string ("", in the case of property_type - str) or list ([], in the case of is_list True) from - being set for the property. - default: Optional. If is_required is True, default may be set - to provide a default value for objects that do not supply - their own value. If is_required is True and default - is not provided, users of the class must supply their own - value for the property. - Note that although the values of the array are expressed in - boolean terms, subclasses provide values as integers to conserve - horizontal space. - _should_print_single_line: False in XCObject. Subclasses whose objects - should be written to the project file in the - alternate single-line format, such as - PBXFileReference and PBXBuildFile, should - set this to True. - _encode_transforms: Used by _EncodeString to encode unprintable characters. - The index into this list is the ordinal of the - character to transform; each value is a string - used to represent the character in the output. XCObject - provides an _encode_transforms list suitable for most - XCObject subclasses. - _alternate_encode_transforms: Provided for subclasses that wish to use - the alternate encoding rules. Xcode seems - to use these rules when printing objects in - single-line format. Subclasses that desire - this behavior should set _encode_transforms - to _alternate_encode_transforms. - _hashables: A list of XCObject subclasses that can be hashed by ComputeIDs - to construct this object's ID. Most classes that need custom - hashing behavior should do it by overriding Hashables, - but in some cases an object's parent may wish to push a - hashable value into its child, and it can do so by appending - to _hashables. - Attributes: - id: The object's identifier, a 24-character uppercase hexadecimal string. - Usually, objects being created should not set id until the entire - project file structure is built. At that point, UpdateIDs() should - be called on the root object to assign deterministic values for id to - each object in the tree. - parent: The object's parent. This is set by a parent XCObject when a child - object is added to it. - _properties: The object's property dictionary. An object's properties are - described by its class' _schema variable. - """ - - _schema = {} - _should_print_single_line = False - - # See _EncodeString. - _encode_transforms = [] - i = 0 - while i < ord(" "): - _encode_transforms.append("\\U%04x" % i) - i = i + 1 - _encode_transforms[7] = "\\a" - _encode_transforms[8] = "\\b" - _encode_transforms[9] = "\\t" - _encode_transforms[10] = "\\n" - _encode_transforms[11] = "\\v" - _encode_transforms[12] = "\\f" - _encode_transforms[13] = "\\n" - - _alternate_encode_transforms = list(_encode_transforms) - _alternate_encode_transforms[9] = chr(9) - _alternate_encode_transforms[10] = chr(10) - _alternate_encode_transforms[11] = chr(11) - - def __init__(self, properties=None, id=None, parent=None): - self.id = id - self.parent = parent - self._properties = {} - self._hashables = [] - self._SetDefaultsFromSchema() - self.UpdateProperties(properties) - - def __repr__(self): - try: - name = self.Name() - except NotImplementedError: - return f"<{self.__class__.__name__} at 0x{id(self):x}>" - return f"<{self.__class__.__name__} {name!r} at 0x{id(self):x}>" - - def Copy(self): - """Make a copy of this object. - - The new object will have its own copy of lists and dicts. Any XCObject - objects owned by this object (marked "strong") will be copied in the - new object, even those found in lists. If this object has any weak - references to other XCObjects, the same references are added to the new - object without making a copy. - """ - - that = self.__class__(id=self.id, parent=self.parent) - for key, value in self._properties.items(): - is_strong = self._schema[key][2] - - if isinstance(value, XCObject): - if is_strong: - new_value = value.Copy() - new_value.parent = that - that._properties[key] = new_value - else: - that._properties[key] = value - elif isinstance(value, (str, int)): - that._properties[key] = value - elif isinstance(value, list): - if is_strong: - # If is_strong is True, each element is an XCObject, so it's safe to - # call Copy. - that._properties[key] = [] - for item in value: - new_item = item.Copy() - new_item.parent = that - that._properties[key].append(new_item) - else: - that._properties[key] = value[:] - elif isinstance(value, dict): - # dicts are never strong. - if is_strong: - raise TypeError( - "Strong dict for key " + key + " in " + self.__class__.__name__ - ) - else: - that._properties[key] = value.copy() - else: - raise TypeError( - "Unexpected type " - + value.__class__.__name__ - + " for key " - + key - + " in " - + self.__class__.__name__ - ) - - return that - - def Name(self): - """Return the name corresponding to an object. - - Not all objects necessarily need to be nameable, and not all that do have - a "name" property. Override as needed. - """ - - # If the schema indicates that "name" is required, try to access the - # property even if it doesn't exist. This will result in a KeyError - # being raised for the property that should be present, which seems more - # appropriate than NotImplementedError in this case. - if "name" in self._properties or ( - "name" in self._schema and self._schema["name"][3] - ): - return self._properties["name"] - - raise NotImplementedError(self.__class__.__name__ + " must implement Name") - - def Comment(self): - """Return a comment string for the object. - - Most objects just use their name as the comment, but PBXProject uses - different values. - - The returned comment is not escaped and does not have any comment marker - strings applied to it. - """ - - return self.Name() - - def Hashables(self): - hashables = [self.__class__.__name__] - - if (name := self.Name()) is not None: - hashables.append(name) - - hashables.extend(self._hashables) - - return hashables - - def HashablesForChild(self): - return None - - def ComputeIDs(self, recursive=True, overwrite=True, seed_hash=None): - """Set "id" properties deterministically. - - An object's "id" property is set based on a hash of its class type and - name, as well as the class type and name of all ancestor objects. As - such, it is only advisable to call ComputeIDs once an entire project file - tree is built. - - If recursive is True, recurse into all descendant objects and update their - hashes. - - If overwrite is True, any existing value set in the "id" property will be - replaced. - """ - - def _HashUpdate(hash, data): - """Update hash with data's length and contents. - - If the hash were updated only with the value of data, it would be - possible for clowns to induce collisions by manipulating the names of - their objects. By adding the length, it's exceedingly less likely that - ID collisions will be encountered, intentionally or not. - """ - - hash.update(struct.pack(">i", len(data))) - if isinstance(data, str): - data = data.encode("utf-8") - hash.update(data) - - if seed_hash is None: - seed_hash = hashlib.sha256() - - hash = seed_hash.copy() - - hashables = self.Hashables() - assert len(hashables) > 0 - for hashable in hashables: - _HashUpdate(hash, hashable) - - if recursive: - hashables_for_child = self.HashablesForChild() - if hashables_for_child is None: - child_hash = hash - else: - assert len(hashables_for_child) > 0 - child_hash = seed_hash.copy() - for hashable in hashables_for_child: - _HashUpdate(child_hash, hashable) - - for child in self.Children(): - child.ComputeIDs(recursive, overwrite, child_hash) - - if overwrite or self.id is None: - # Xcode IDs are only 96 bits (24 hex characters), but a SHA-1 digest is - # is 160 bits. Instead of throwing out 64 bits of the digest, xor them - # into the portion that gets used. - assert hash.digest_size % 4 == 0 - digest_int_count = hash.digest_size // 4 - digest_ints = struct.unpack(">" + "I" * digest_int_count, hash.digest()) - id_ints = [0, 0, 0] - for index in range(digest_int_count): - id_ints[index % 3] ^= digest_ints[index] - self.id = "%08X%08X%08X" % tuple(id_ints) - - def EnsureNoIDCollisions(self): - """Verifies that no two objects have the same ID. Checks all descendants.""" - - ids = {} - descendants = self.Descendants() - for descendant in descendants: - if descendant.id in ids: - other = ids[descendant.id] - raise KeyError( - 'Duplicate ID %s, objects "%s" and "%s" in "%s"' - % ( - descendant.id, - str(descendant._properties), - str(other._properties), - self._properties["rootObject"].Name(), - ) - ) - ids[descendant.id] = descendant - - def Children(self): - """Returns a list of all of this object's owned (strong) children.""" - - children = [] - for property, attributes in self._schema.items(): - (is_list, _property_type, is_strong) = attributes[0:3] - if is_strong and property in self._properties: - if not is_list: - children.append(self._properties[property]) - else: - children.extend(self._properties[property]) - return children - - def Descendants(self): - """Returns a list of all of this object's descendants, including this - object. - """ - - children = self.Children() - descendants = [self] - for child in children: - descendants.extend(child.Descendants()) - return descendants - - def PBXProjectAncestor(self): - # The base case for recursion is defined at PBXProject.PBXProjectAncestor. - if self.parent: - return self.parent.PBXProjectAncestor() - return None - - def _EncodeComment(self, comment): - """Encodes a comment to be placed in the project file output, mimicking - Xcode behavior. - """ - - # This mimics Xcode behavior by wrapping the comment in "/*" and "*/". If - # the string already contains a "*/", it is turned into "(*)/". This keeps - # the file writer from outputting something that would be treated as the - # end of a comment in the middle of something intended to be entirely a - # comment. - - return "/* " + comment.replace("*/", "(*)/") + " */" - - def _EncodeTransform(self, match): - # This function works closely with _EncodeString. It will only be called - # by re.sub with match.group(0) containing a character matched by the - # the _escaped expression. - char = match.group(0) - - # Backslashes (\) and quotation marks (") are always replaced with a - # backslash-escaped version of the same. Everything else gets its - # replacement from the class' _encode_transforms array. - if char == "\\": - return "\\\\" - if char == '"': - return '\\"' - return self._encode_transforms[ord(char)] - - def _EncodeString(self, value): - """Encodes a string to be placed in the project file output, mimicking - Xcode behavior. - """ - - # Use quotation marks when any character outside of the range A-Z, a-z, 0-9, - # $ (dollar sign), . (period), and _ (underscore) is present. Also use - # quotation marks to represent empty strings. - # - # Escape " (double-quote) and \ (backslash) by preceding them with a - # backslash. - # - # Some characters below the printable ASCII range are encoded specially: - # 7 ^G BEL is encoded as "\a" - # 8 ^H BS is encoded as "\b" - # 11 ^K VT is encoded as "\v" - # 12 ^L NP is encoded as "\f" - # 127 ^? DEL is passed through as-is without escaping - # - In PBXFileReference and PBXBuildFile objects: - # 9 ^I HT is passed through as-is without escaping - # 10 ^J NL is passed through as-is without escaping - # 13 ^M CR is passed through as-is without escaping - # - In other objects: - # 9 ^I HT is encoded as "\t" - # 10 ^J NL is encoded as "\n" - # 13 ^M CR is encoded as "\n" rendering it indistinguishable from - # 10 ^J NL - # All other characters within the ASCII control character range (0 through - # 31 inclusive) are encoded as "\U001f" referring to the Unicode code point - # in hexadecimal. For example, character 14 (^N SO) is encoded as "\U000e". - # Characters above the ASCII range are passed through to the output encoded - # as UTF-8 without any escaping. These mappings are contained in the - # class' _encode_transforms list. - - if _unquoted.search(value) and not _quoted.search(value): - return value - - return '"' + _escaped.sub(self._EncodeTransform, value) + '"' - - def _XCPrint(self, file, tabs, line): - file.write("\t" * tabs + line) - - def _XCPrintableValue(self, tabs, value, flatten_list=False): - """Returns a representation of value that may be printed in a project file, - mimicking Xcode's behavior. - - _XCPrintableValue can handle str and int values, XCObjects (which are - made printable by returning their id property), and list and dict objects - composed of any of the above types. When printing a list or dict, and - _should_print_single_line is False, the tabs parameter is used to determine - how much to indent the lines corresponding to the items in the list or - dict. - - If flatten_list is True, single-element lists will be transformed into - strings. - """ - - printable = "" - comment = None - - if self._should_print_single_line: - sep = " " - element_tabs = "" - end_tabs = "" - else: - sep = "\n" - element_tabs = "\t" * (tabs + 1) - end_tabs = "\t" * tabs - - if isinstance(value, XCObject): - printable += value.id - comment = value.Comment() - elif isinstance(value, str): - printable += self._EncodeString(value) - elif isinstance(value, str): - printable += self._EncodeString(value.encode("utf-8")) - elif isinstance(value, int): - printable += str(value) - elif isinstance(value, list): - if flatten_list and len(value) <= 1: - if len(value) == 0: - printable += self._EncodeString("") - else: - printable += self._EncodeString(value[0]) - else: - printable = "(" + sep - for item in value: - printable += ( - element_tabs - + self._XCPrintableValue(tabs + 1, item, flatten_list) - + "," - + sep - ) - printable += end_tabs + ")" - elif isinstance(value, dict): - printable = "{" + sep - for item_key, item_value in sorted(value.items()): - printable += ( - element_tabs - + self._XCPrintableValue(tabs + 1, item_key, flatten_list) - + " = " - + self._XCPrintableValue(tabs + 1, item_value, flatten_list) - + ";" - + sep - ) - printable += end_tabs + "}" - else: - raise TypeError("Can't make " + value.__class__.__name__ + " printable") - - if comment: - printable += " " + self._EncodeComment(comment) - - return printable - - def _XCKVPrint(self, file, tabs, key, value): - """Prints a key and value, members of an XCObject's _properties dictionary, - to file. - - tabs is an int identifying the indentation level. If the class' - _should_print_single_line variable is True, tabs is ignored and the - key-value pair will be followed by a space instead of a newline. - """ - - if self._should_print_single_line: - printable = "" - after_kv = " " - else: - printable = "\t" * tabs - after_kv = "\n" - - # Xcode usually prints remoteGlobalIDString values in PBXContainerItemProxy - # objects without comments. Sometimes it prints them with comments, but - # the majority of the time, it doesn't. To avoid unnecessary changes to - # the project file after Xcode opens it, don't write comments for - # remoteGlobalIDString. This is a sucky hack and it would certainly be - # cleaner to extend the schema to indicate whether or not a comment should - # be printed, but since this is the only case where the problem occurs and - # Xcode itself can't seem to make up its mind, the hack will suffice. - # - # Also see PBXContainerItemProxy._schema['remoteGlobalIDString']. - if key == "remoteGlobalIDString" and isinstance(self, PBXContainerItemProxy): - value_to_print = value.id - else: - value_to_print = value - - # PBXBuildFile's settings property is represented in the output as a dict, - # but a hack here has it represented as a string. Arrange to strip off the - # quotes so that it shows up in the output as expected. - if key == "settings" and isinstance(self, PBXBuildFile): - strip_value_quotes = True - else: - strip_value_quotes = False - - # In another one-off, let's set flatten_list on buildSettings properties - # of XCBuildConfiguration objects, because that's how Xcode treats them. - if key == "buildSettings" and isinstance(self, XCBuildConfiguration): - flatten_list = True - else: - flatten_list = False - - try: - printable_key = self._XCPrintableValue(tabs, key, flatten_list) - printable_value = self._XCPrintableValue(tabs, value_to_print, flatten_list) - if ( - strip_value_quotes - and len(printable_value) > 1 - and printable_value[0] == '"' - and printable_value[-1] == '"' - ): - printable_value = printable_value[1:-1] - printable += printable_key + " = " + printable_value + ";" + after_kv - except TypeError as e: - gyp.common.ExceptionAppend(e, 'while printing key "%s"' % key) - raise - - self._XCPrint(file, 0, printable) - - def Print(self, file=sys.stdout): - """Prints a reprentation of this object to file, adhering to Xcode output - formatting. - """ - - self.VerifyHasRequiredProperties() - - if self._should_print_single_line: - # When printing an object in a single line, Xcode doesn't put any space - # between the beginning of a dictionary (or presumably a list) and the - # first contained item, so you wind up with snippets like - # ...CDEF = {isa = PBXFileReference; fileRef = 0123... - # If it were me, I would have put a space in there after the opening - # curly, but I guess this is just another one of those inconsistencies - # between how Xcode prints PBXFileReference and PBXBuildFile objects as - # compared to other objects. Mimic Xcode's behavior here by using an - # empty string for sep. - sep = "" - end_tabs = 0 - else: - sep = "\n" - end_tabs = 2 - - # Start the object. For example, '\t\tPBXProject = {\n'. - self._XCPrint(file, 2, self._XCPrintableValue(2, self) + " = {" + sep) - - # "isa" isn't in the _properties dictionary, it's an intrinsic property - # of the class which the object belongs to. Xcode always outputs "isa" - # as the first element of an object dictionary. - self._XCKVPrint(file, 3, "isa", self.__class__.__name__) - - # The remaining elements of an object dictionary are sorted alphabetically. - for property, value in sorted(self._properties.items()): - self._XCKVPrint(file, 3, property, value) - - # End the object. - self._XCPrint(file, end_tabs, "};\n") - - def UpdateProperties(self, properties, do_copy=False): - """Merge the supplied properties into the _properties dictionary. - - The input properties must adhere to the class schema or a KeyError or - TypeError exception will be raised. If adding an object of an XCObject - subclass and the schema indicates a strong relationship, the object's - parent will be set to this object. - - If do_copy is True, then lists, dicts, strong-owned XCObjects, and - strong-owned XCObjects in lists will be copied instead of having their - references added. - """ - - if properties is None: - return - - for property, value in properties.items(): - # Make sure the property is in the schema. - if property not in self._schema: - raise KeyError(property + " not in " + self.__class__.__name__) - - # Make sure the property conforms to the schema. - (is_list, property_type, is_strong) = self._schema[property][0:3] - if is_list: - if not isinstance(value, list): - raise TypeError( - property - + " of " - + self.__class__.__name__ - + " must be list, not " - + value.__class__.__name__ - ) - for item in value: - if not isinstance(item, property_type) and not ( - isinstance(item, str) and isinstance(property_type, str) - ): - # Accept unicode where str is specified. str is treated as - # UTF-8-encoded. - raise TypeError( - "item of " - + property - + " of " - + self.__class__.__name__ - + " must be " - + property_type.__name__ - + ", not " - + item.__class__.__name__ - ) - elif not isinstance(value, property_type) and not ( - isinstance(value, str) and isinstance(property_type, str) - ): - # Accept unicode where str is specified. str is treated as - # UTF-8-encoded. - raise TypeError( - property - + " of " - + self.__class__.__name__ - + " must be " - + property_type.__name__ - + ", not " - + value.__class__.__name__ - ) - - # Checks passed, perform the assignment. - if do_copy: - if isinstance(value, XCObject): - if is_strong: - self._properties[property] = value.Copy() - else: - self._properties[property] = value - elif isinstance(value, (str, int)): - self._properties[property] = value - elif isinstance(value, list): - if is_strong: - # If is_strong is True, each element is an XCObject, - # so it's safe to call Copy. - self._properties[property] = [] - for item in value: - self._properties[property].append(item.Copy()) - else: - self._properties[property] = value[:] - elif isinstance(value, dict): - self._properties[property] = value.copy() - else: - raise TypeError( - "Don't know how to copy a " - + value.__class__.__name__ - + " object for " - + property - + " in " - + self.__class__.__name__ - ) - else: - self._properties[property] = value - - # Set up the child's back-reference to this object. Don't use |value| - # any more because it may not be right if do_copy is true. - if is_strong: - if not is_list: - self._properties[property].parent = self - else: - for item in self._properties[property]: - item.parent = self - - def HasProperty(self, key): - return key in self._properties - - def GetProperty(self, key): - return self._properties[key] - - def SetProperty(self, key, value): - self.UpdateProperties({key: value}) - - def DelProperty(self, key): - if key in self._properties: - del self._properties[key] - - def AppendProperty(self, key, value): - # TODO(mark): Support ExtendProperty too (and make this call that)? - - # Schema validation. - if key not in self._schema: - raise KeyError(key + " not in " + self.__class__.__name__) - - (is_list, property_type, is_strong) = self._schema[key][0:3] - if not is_list: - raise TypeError(key + " of " + self.__class__.__name__ + " must be list") - if not isinstance(value, property_type): - raise TypeError( - "item of " - + key - + " of " - + self.__class__.__name__ - + " must be " - + property_type.__name__ - + ", not " - + value.__class__.__name__ - ) - - # If the property doesn't exist yet, create a new empty list to receive the - # item. - self._properties[key] = self._properties.get(key, []) - - # Set up the ownership link. - if is_strong: - value.parent = self - - # Store the item. - self._properties[key].append(value) - - def VerifyHasRequiredProperties(self): - """Ensure that all properties identified as required by the schema are - set. - """ - - # TODO(mark): A stronger verification mechanism is needed. Some - # subclasses need to perform validation beyond what the schema can enforce. - for property, attributes in self._schema.items(): - (_is_list, _property_type, _is_strong, is_required) = attributes[0:4] - if is_required and property not in self._properties: - raise KeyError(self.__class__.__name__ + " requires " + property) - - def _SetDefaultsFromSchema(self): - """Assign object default values according to the schema. This will not - overwrite properties that have already been set.""" - - defaults = {} - for property, attributes in self._schema.items(): - (_is_list, _property_type, _is_strong, is_required) = attributes[0:4] - if ( - is_required - and len(attributes) >= 5 - and property not in self._properties - ): - default = attributes[4] - - defaults[property] = default - - if len(defaults) > 0: - # Use do_copy=True so that each new object gets its own copy of strong - # objects, lists, and dicts. - self.UpdateProperties(defaults, do_copy=True) - - -class XCHierarchicalElement(XCObject): - """Abstract base for PBXGroup and PBXFileReference. Not represented in a - project file.""" - - # TODO(mark): Do name and path belong here? Probably so. - # If path is set and name is not, name may have a default value. Name will - # be set to the basename of path, if the basename of path is different from - # the full value of path. If path is already just a leaf name, name will - # not be set. - _schema = XCObject._schema.copy() - _schema.update( - { - "comments": [0, str, 0, 0], - "fileEncoding": [0, str, 0, 0], - "includeInIndex": [0, int, 0, 0], - "indentWidth": [0, int, 0, 0], - "lineEnding": [0, int, 0, 0], - "sourceTree": [0, str, 0, 1, ""], - "tabWidth": [0, int, 0, 0], - "usesTabs": [0, int, 0, 0], - "wrapsLines": [0, int, 0, 0], - } - ) - - def __init__(self, properties=None, id=None, parent=None): - # super - XCObject.__init__(self, properties, id, parent) - if "path" in self._properties and "name" not in self._properties: - path = self._properties["path"] - name = posixpath.basename(path) - if name not in ("", path): - self.SetProperty("name", name) - - if "path" in self._properties and ( - "sourceTree" not in self._properties - or self._properties["sourceTree"] == "" - ): - # If the pathname begins with an Xcode variable like "$(SDKROOT)/", take - # the variable out and make the path be relative to that variable by - # assigning the variable name as the sourceTree. - (source_tree, path) = SourceTreeAndPathFromPath(self._properties["path"]) - if source_tree is not None: - self._properties["sourceTree"] = source_tree - if path is not None: - self._properties["path"] = path - if ( - source_tree is not None - and path is None - and "name" not in self._properties - ): - # The path was of the form "$(SDKROOT)" with no path following it. - # This object is now relative to that variable, so it has no path - # attribute of its own. It does, however, keep a name. - del self._properties["path"] - self._properties["name"] = source_tree - - def Name(self): - if "name" in self._properties: - return self._properties["name"] - elif "path" in self._properties: - return self._properties["path"] - else: - # This happens in the case of the root PBXGroup. - return None - - def Hashables(self): - """Custom hashables for XCHierarchicalElements. - - XCHierarchicalElements are special. Generally, their hashes shouldn't - change if the paths don't change. The normal XCObject implementation of - Hashables adds a hashable for each object, which means that if - the hierarchical structure changes (possibly due to changes caused when - TakeOverOnlyChild runs and encounters slight changes in the hierarchy), - the hashes will change. For example, if a project file initially contains - a/b/f1 and a/b becomes collapsed into a/b, f1 will have a single parent - a/b. If someone later adds a/f2 to the project file, a/b can no longer be - collapsed, and f1 winds up with parent b and grandparent a. That would - be sufficient to change f1's hash. - - To counteract this problem, hashables for all XCHierarchicalElements except - for the main group (which has neither a name nor a path) are taken to be - just the set of path components. Because hashables are inherited from - parents, this provides assurance that a/b/f1 has the same set of hashables - whether its parent is b or a/b. - - The main group is a special case. As it is permitted to have no name or - path, it is permitted to use the standard XCObject hash mechanism. This - is not considered a problem because there can be only one main group. - """ - - if self == self.PBXProjectAncestor()._properties["mainGroup"]: - # super - return XCObject.Hashables(self) - - hashables = [] - - # Put the name in first, ensuring that if TakeOverOnlyChild collapses - # children into a top-level group like "Source", the name always goes - # into the list of hashables without interfering with path components. - if "name" in self._properties: - # Make it less likely for people to manipulate hashes by following the - # pattern of always pushing an object type value onto the list first. - hashables.append(self.__class__.__name__ + ".name") - hashables.append(self._properties["name"]) - - # NOTE: This still has the problem that if an absolute path is encountered, - # including paths with a sourceTree, they'll still inherit their parents' - # hashables, even though the paths aren't relative to their parents. This - # is not expected to be much of a problem in practice. - if (path := self.PathFromSourceTreeAndPath()) is not None: - components = path.split(posixpath.sep) - for component in components: - hashables.append(self.__class__.__name__ + ".path") - hashables.append(component) - - hashables.extend(self._hashables) - - return hashables - - def Compare(self, other): - # Allow comparison of these types. PBXGroup has the highest sort rank; - # PBXVariantGroup is treated as equal to PBXFileReference. - valid_class_types = { - PBXFileReference: "file", - PBXGroup: "group", - PBXVariantGroup: "file", - } - self_type = valid_class_types[self.__class__] - other_type = valid_class_types[other.__class__] - - if self_type == other_type: - # If the two objects are of the same sort rank, compare their names. - return cmp(self.Name(), other.Name()) - - # Otherwise, sort groups before everything else. - if self_type == "group": - return -1 - return 1 - - def CompareRootGroup(self, other): - # This function should be used only to compare direct children of the - # containing PBXProject's mainGroup. These groups should appear in the - # listed order. - # TODO(mark): "Build" is used by gyp.generator.xcode, perhaps the - # generator should have a way of influencing this list rather than having - # to hardcode for the generator here. - order = [ - "Source", - "Intermediates", - "Projects", - "Frameworks", - "Products", - "Build", - ] - - # If the groups aren't in the listed order, do a name comparison. - # Otherwise, groups in the listed order should come before those that - # aren't. - self_name = self.Name() - other_name = other.Name() - self_in = isinstance(self, PBXGroup) and self_name in order - other_in = isinstance(self, PBXGroup) and other_name in order - if not self_in and not other_in: - return self.Compare(other) - if self_name in order and other_name not in order: - return -1 - if other_name in order and self_name not in order: - return 1 - - # If both groups are in the listed order, go by the defined order. - self_index = order.index(self_name) - other_index = order.index(other_name) - if self_index < other_index: - return -1 - if self_index > other_index: - return 1 - return 0 - - def PathFromSourceTreeAndPath(self): - # Turn the object's sourceTree and path properties into a single flat - # string of a form comparable to the path parameter. If there's a - # sourceTree property other than "", wrap it in $(...) for the - # comparison. - components = [] - if self._properties["sourceTree"] != "": - components.append("$(" + self._properties["sourceTree"] + ")") - if "path" in self._properties: - components.append(self._properties["path"]) - - if len(components) > 0: - return posixpath.join(*components) - - return None - - def FullPath(self): - # Returns a full path to self relative to the project file, or relative - # to some other source tree. Start with self, and walk up the chain of - # parents prepending their paths, if any, until no more parents are - # available (project-relative path) or until a path relative to some - # source tree is found. - xche = self - path = None - while isinstance(xche, XCHierarchicalElement) and ( - path is None or (not path.startswith("/") and not path.startswith("$")) - ): - this_path = xche.PathFromSourceTreeAndPath() - if this_path is not None and path is not None: - path = posixpath.join(this_path, path) - elif this_path is not None: - path = this_path - xche = xche.parent - - return path - - -class PBXGroup(XCHierarchicalElement): - """ - Attributes: - _children_by_path: Maps pathnames of children of this PBXGroup to the - actual child XCHierarchicalElement objects. - _variant_children_by_name_and_path: Maps (name, path) tuples of - PBXVariantGroup children to the actual child PBXVariantGroup objects. - """ - - _schema = XCHierarchicalElement._schema.copy() - _schema.update( - { - "children": [1, XCHierarchicalElement, 1, 1, []], - "name": [0, str, 0, 0], - "path": [0, str, 0, 0], - } - ) - - def __init__(self, properties=None, id=None, parent=None): - # super - XCHierarchicalElement.__init__(self, properties, id, parent) - self._children_by_path = {} - self._variant_children_by_name_and_path = {} - for child in self._properties.get("children", []): - self._AddChildToDicts(child) - - def Hashables(self): - # super - hashables = XCHierarchicalElement.Hashables(self) - - # It is not sufficient to just rely on name and parent to build a unique - # hashable : a node could have two child PBXGroup sharing a common name. - # To add entropy the hashable is enhanced with the names of all its - # children. - for child in self._properties.get("children", []): - child_name = child.Name() - if child_name is not None: - hashables.append(child_name) - - return hashables - - def HashablesForChild(self): - # To avoid a circular reference the hashables used to compute a child id do - # not include the child names. - return XCHierarchicalElement.Hashables(self) - - def _AddChildToDicts(self, child): - # Sets up this PBXGroup object's dicts to reference the child properly. - child_path = child.PathFromSourceTreeAndPath() - if child_path: - if child_path in self._children_by_path: - raise ValueError("Found multiple children with path " + child_path) - self._children_by_path[child_path] = child - - if isinstance(child, PBXVariantGroup): - child_name = child._properties.get("name", None) - key = (child_name, child_path) - if key in self._variant_children_by_name_and_path: - raise ValueError( - "Found multiple PBXVariantGroup children with " - + "name " - + str(child_name) - + " and path " - + str(child_path) - ) - self._variant_children_by_name_and_path[key] = child - - def AppendChild(self, child): - # Callers should use this instead of calling - # AppendProperty('children', child) directly because this function - # maintains the group's dicts. - self.AppendProperty("children", child) - self._AddChildToDicts(child) - - def GetChildByName(self, name): - # This is not currently optimized with a dict as GetChildByPath is because - # it has few callers. Most callers probably want GetChildByPath. This - # function is only useful to get children that have names but no paths, - # which is rare. The children of the main group ("Source", "Products", - # etc.) is pretty much the only case where this likely to come up. - # - # TODO(mark): Maybe this should raise an error if more than one child is - # present with the same name. - if "children" not in self._properties: - return None - - for child in self._properties["children"]: - if child.Name() == name: - return child - - return None - - def GetChildByPath(self, path): - if not path: - return None - - if path in self._children_by_path: - return self._children_by_path[path] - - return None - - def GetChildByRemoteObject(self, remote_object): - # This method is a little bit esoteric. Given a remote_object, which - # should be a PBXFileReference in another project file, this method will - # return this group's PBXReferenceProxy object serving as a local proxy - # for the remote PBXFileReference. - # - # This function might benefit from a dict optimization as GetChildByPath - # for some workloads, but profiling shows that it's not currently a - # problem. - if "children" not in self._properties: - return None - - for child in self._properties["children"]: - if not isinstance(child, PBXReferenceProxy): - continue - - container_proxy = child._properties["remoteRef"] - if container_proxy._properties["remoteGlobalIDString"] == remote_object: - return child - - return None - - def AddOrGetFileByPath(self, path, hierarchical): - """Returns an existing or new file reference corresponding to path. - - If hierarchical is True, this method will create or use the necessary - hierarchical group structure corresponding to path. Otherwise, it will - look in and create an item in the current group only. - - If an existing matching reference is found, it is returned, otherwise, a - new one will be created, added to the correct group, and returned. - - If path identifies a directory by virtue of carrying a trailing slash, - this method returns a PBXFileReference of "folder" type. If path - identifies a variant, by virtue of it identifying a file inside a directory - with an ".lproj" extension, this method returns a PBXVariantGroup - containing the variant named by path, and possibly other variants. For - all other paths, a "normal" PBXFileReference will be returned. - """ - - # Adding or getting a directory? Directories end with a trailing slash. - is_dir = False - if path.endswith("/"): - is_dir = True - path = posixpath.normpath(path) - if is_dir: - path = path + "/" - - # Adding or getting a variant? Variants are files inside directories - # with an ".lproj" extension. Xcode uses variants for localization. For - # a variant path/to/Language.lproj/MainMenu.nib, put a variant group named - # MainMenu.nib inside path/to, and give it a variant named Language. In - # this example, grandparent would be set to path/to and parent_root would - # be set to Language. - variant_name = None - parent = posixpath.dirname(path) - grandparent = posixpath.dirname(parent) - parent_basename = posixpath.basename(parent) - (parent_root, parent_ext) = posixpath.splitext(parent_basename) - if parent_ext == ".lproj": - variant_name = parent_root - if grandparent == "": - grandparent = None - - # Putting a directory inside a variant group is not currently supported. - assert not is_dir or variant_name is None - - path_split = path.split(posixpath.sep) - if ( - len(path_split) == 1 - or ((is_dir or variant_name is not None) and len(path_split) == 2) - or not hierarchical - ): - # The PBXFileReference or PBXVariantGroup will be added to or gotten from - # this PBXGroup, no recursion necessary. - if variant_name is None: - # Add or get a PBXFileReference. - file_ref = self.GetChildByPath(path) - if file_ref is not None: - assert file_ref.__class__ == PBXFileReference - else: - file_ref = PBXFileReference({"path": path}) - self.AppendChild(file_ref) - else: - # Add or get a PBXVariantGroup. The variant group name is the same - # as the basename (MainMenu.nib in the example above). grandparent - # specifies the path to the variant group itself, and path_split[-2:] - # is the path of the specific variant relative to its group. - variant_group_name = posixpath.basename(path) - variant_group_ref = self.AddOrGetVariantGroupByNameAndPath( - variant_group_name, grandparent - ) - variant_path = posixpath.sep.join(path_split[-2:]) - variant_ref = variant_group_ref.GetChildByPath(variant_path) - if variant_ref is not None: - assert variant_ref.__class__ == PBXFileReference - else: - variant_ref = PBXFileReference( - {"name": variant_name, "path": variant_path} - ) - variant_group_ref.AppendChild(variant_ref) - # The caller is interested in the variant group, not the specific - # variant file. - file_ref = variant_group_ref - return file_ref - else: - # Hierarchical recursion. Add or get a PBXGroup corresponding to the - # outermost path component, and then recurse into it, chopping off that - # path component. - next_dir = path_split[0] - group_ref = self.GetChildByPath(next_dir) - if group_ref is not None: - assert group_ref.__class__ == PBXGroup - else: - group_ref = PBXGroup({"path": next_dir}) - self.AppendChild(group_ref) - return group_ref.AddOrGetFileByPath( - posixpath.sep.join(path_split[1:]), hierarchical - ) - - def AddOrGetVariantGroupByNameAndPath(self, name, path): - """Returns an existing or new PBXVariantGroup for name and path. - - If a PBXVariantGroup identified by the name and path arguments is already - present as a child of this object, it is returned. Otherwise, a new - PBXVariantGroup with the correct properties is created, added as a child, - and returned. - - This method will generally be called by AddOrGetFileByPath, which knows - when to create a variant group based on the structure of the pathnames - passed to it. - """ - - key = (name, path) - if key in self._variant_children_by_name_and_path: - variant_group_ref = self._variant_children_by_name_and_path[key] - assert variant_group_ref.__class__ == PBXVariantGroup - return variant_group_ref - - variant_group_properties = {"name": name} - if path is not None: - variant_group_properties["path"] = path - variant_group_ref = PBXVariantGroup(variant_group_properties) - self.AppendChild(variant_group_ref) - - return variant_group_ref - - def TakeOverOnlyChild(self, recurse=False): - """If this PBXGroup has only one child and it's also a PBXGroup, take - it over by making all of its children this object's children. - - This function will continue to take over only children when those children - are groups. If there are three PBXGroups representing a, b, and c, with - c inside b and b inside a, and a and b have no other children, this will - result in a taking over both b and c, forming a PBXGroup for a/b/c. - - If recurse is True, this function will recurse into children and ask them - to collapse themselves by taking over only children as well. Assuming - an example hierarchy with files at a/b/c/d1, a/b/c/d2, and a/b/c/d3/e/f - (d1, d2, and f are files, the rest are groups), recursion will result in - a group for a/b/c containing a group for d3/e. - """ - - # At this stage, check that child class types are PBXGroup exactly, - # instead of using isinstance. The only subclass of PBXGroup, - # PBXVariantGroup, should not participate in reparenting in the same way: - # reparenting by merging different object types would be wrong. - while ( - len(self._properties["children"]) == 1 - and self._properties["children"][0].__class__ == PBXGroup - ): - # Loop to take over the innermost only-child group possible. - - child = self._properties["children"][0] - - # Assume the child's properties, including its children. Save a copy - # of this object's old properties, because they'll still be needed. - # This object retains its existing id and parent attributes. - old_properties = self._properties - self._properties = child._properties - self._children_by_path = child._children_by_path - - if ( - "sourceTree" not in self._properties - or self._properties["sourceTree"] == "" - ): - # The child was relative to its parent. Fix up the path. Note that - # children with a sourceTree other than "" are not relative to - # their parents, so no path fix-up is needed in that case. - if "path" in old_properties: - if "path" in self._properties: - # Both the original parent and child have paths set. - self._properties["path"] = posixpath.join( - old_properties["path"], self._properties["path"] - ) - else: - # Only the original parent has a path, use it. - self._properties["path"] = old_properties["path"] - if "sourceTree" in old_properties: - # The original parent had a sourceTree set, use it. - self._properties["sourceTree"] = old_properties["sourceTree"] - - # If the original parent had a name set, keep using it. If the original - # parent didn't have a name but the child did, let the child's name - # live on. If the name attribute seems unnecessary now, get rid of it. - if "name" in old_properties and old_properties["name"] not in ( - None, - self.Name(), - ): - self._properties["name"] = old_properties["name"] - if ( - "name" in self._properties - and "path" in self._properties - and self._properties["name"] == self._properties["path"] - ): - del self._properties["name"] - - # Notify all children of their new parent. - for child in self._properties["children"]: - child.parent = self - - # If asked to recurse, recurse. - if recurse: - for child in self._properties["children"]: - if child.__class__ == PBXGroup: - child.TakeOverOnlyChild(recurse) - - def SortGroup(self): - self._properties["children"] = sorted( - self._properties["children"], key=cmp_to_key(lambda x, y: x.Compare(y)) - ) - - # Recurse. - for child in self._properties["children"]: - if isinstance(child, PBXGroup): - child.SortGroup() - - -class XCFileLikeElement(XCHierarchicalElement): - # Abstract base for objects that can be used as the fileRef property of - # PBXBuildFile. - - def PathHashables(self): - # A PBXBuildFile that refers to this object will call this method to - # obtain additional hashables specific to this XCFileLikeElement. Don't - # just use this object's hashables, they're not specific and unique enough - # on their own (without access to the parent hashables.) Instead, provide - # hashables that identify this object by path by getting its hashables as - # well as the hashables of ancestor XCHierarchicalElement objects. - - hashables = [] - xche = self - while isinstance(xche, XCHierarchicalElement): - xche_hashables = xche.Hashables() - for index, xche_hashable in enumerate(xche_hashables): - hashables.insert(index, xche_hashable) - xche = xche.parent - return hashables - - -class XCContainerPortal(XCObject): - # Abstract base for objects that can be used as the containerPortal property - # of PBXContainerItemProxy. - pass - - -class XCRemoteObject(XCObject): - # Abstract base for objects that can be used as the remoteGlobalIDString - # property of PBXContainerItemProxy. - pass - - -class PBXFileReference(XCFileLikeElement, XCContainerPortal, XCRemoteObject): - _schema = XCFileLikeElement._schema.copy() - _schema.update( - { - "explicitFileType": [0, str, 0, 0], - "lastKnownFileType": [0, str, 0, 0], - "name": [0, str, 0, 0], - "path": [0, str, 0, 1], - } - ) - - # Weird output rules for PBXFileReference. - _should_print_single_line = True - # super - _encode_transforms = XCFileLikeElement._alternate_encode_transforms - - def __init__(self, properties=None, id=None, parent=None): - # super - XCFileLikeElement.__init__(self, properties, id, parent) - if "path" in self._properties and self._properties["path"].endswith("/"): - self._properties["path"] = self._properties["path"][:-1] - is_dir = True - else: - is_dir = False - - if ( - "path" in self._properties - and "lastKnownFileType" not in self._properties - and "explicitFileType" not in self._properties - ): - # TODO(mark): This is the replacement for a replacement for a quick hack. - # It is no longer incredibly sucky, but this list needs to be extended. - extension_map = { - "a": "archive.ar", - "app": "wrapper.application", - "bdic": "file", - "bundle": "wrapper.cfbundle", - "c": "sourcecode.c.c", - "cc": "sourcecode.cpp.cpp", - "cpp": "sourcecode.cpp.cpp", - "css": "text.css", - "cxx": "sourcecode.cpp.cpp", - "dart": "sourcecode", - "dylib": "compiled.mach-o.dylib", - "framework": "wrapper.framework", - "gyp": "sourcecode", - "gypi": "sourcecode", - "h": "sourcecode.c.h", - "hxx": "sourcecode.cpp.h", - "icns": "image.icns", - "java": "sourcecode.java", - "js": "sourcecode.javascript", - "kext": "wrapper.kext", - "m": "sourcecode.c.objc", - "mm": "sourcecode.cpp.objcpp", - "nib": "wrapper.nib", - "o": "compiled.mach-o.objfile", - "pdf": "image.pdf", - "pl": "text.script.perl", - "plist": "text.plist.xml", - "pm": "text.script.perl", - "png": "image.png", - "py": "text.script.python", - "r": "sourcecode.rez", - "rez": "sourcecode.rez", - "s": "sourcecode.asm", - "storyboard": "file.storyboard", - "strings": "text.plist.strings", - "swift": "sourcecode.swift", - "ttf": "file", - "xcassets": "folder.assetcatalog", - "xcconfig": "text.xcconfig", - "xcdatamodel": "wrapper.xcdatamodel", - "xcdatamodeld": "wrapper.xcdatamodeld", - "xib": "file.xib", - "y": "sourcecode.yacc", - } - - prop_map = { - "dart": "explicitFileType", - "gyp": "explicitFileType", - "gypi": "explicitFileType", - } - - if is_dir: - file_type = "folder" - prop_name = "lastKnownFileType" - else: - basename = posixpath.basename(self._properties["path"]) - (_root, ext) = posixpath.splitext(basename) - # Check the map using a lowercase extension. - # TODO(mark): Maybe it should try with the original case first and fall - # back to lowercase, in case there are any instances where case - # matters. There currently aren't. - if ext != "": - ext = ext[1:].lower() - - # TODO(mark): "text" is the default value, but "file" is appropriate - # for unrecognized files not containing text. Xcode seems to choose - # based on content. - file_type = extension_map.get(ext, "text") - prop_name = prop_map.get(ext, "lastKnownFileType") - - self._properties[prop_name] = file_type - - -class PBXVariantGroup(PBXGroup, XCFileLikeElement): - """PBXVariantGroup is used by Xcode to represent localizations.""" - - # No additions to the schema relative to PBXGroup. - - -# PBXReferenceProxy is also an XCFileLikeElement subclass. It is defined below -# because it uses PBXContainerItemProxy, defined below. - - -class XCBuildConfiguration(XCObject): - _schema = XCObject._schema.copy() - _schema.update( - { - "baseConfigurationReference": [0, PBXFileReference, 0, 0], - "buildSettings": [0, dict, 0, 1, {}], - "name": [0, str, 0, 1], - } - ) - - def HasBuildSetting(self, key): - return key in self._properties["buildSettings"] - - def GetBuildSetting(self, key): - return self._properties["buildSettings"][key] - - def SetBuildSetting(self, key, value): - # TODO(mark): If a list, copy? - self._properties["buildSettings"][key] = value - - def AppendBuildSetting(self, key, value): - if key not in self._properties["buildSettings"]: - self._properties["buildSettings"][key] = [] - self._properties["buildSettings"][key].append(value) - - def DelBuildSetting(self, key): - if key in self._properties["buildSettings"]: - del self._properties["buildSettings"][key] - - def SetBaseConfiguration(self, value): - self._properties["baseConfigurationReference"] = value - - -class XCConfigurationList(XCObject): - # _configs is the default list of configurations. - _configs = [ - XCBuildConfiguration({"name": "Debug"}), - XCBuildConfiguration({"name": "Release"}), - ] - - _schema = XCObject._schema.copy() - _schema.update( - { - "buildConfigurations": [1, XCBuildConfiguration, 1, 1, _configs], - "defaultConfigurationIsVisible": [0, int, 0, 1, 1], - "defaultConfigurationName": [0, str, 0, 1, "Release"], - } - ) - - def Name(self): - return ( - "Build configuration list for " - + self.parent.__class__.__name__ - + ' "' - + self.parent.Name() - + '"' - ) - - def ConfigurationNamed(self, name): - """Convenience accessor to obtain an XCBuildConfiguration by name.""" - for configuration in self._properties["buildConfigurations"]: - if configuration._properties["name"] == name: - return configuration - - raise KeyError(name) - - def DefaultConfiguration(self): - """Convenience accessor to obtain the default XCBuildConfiguration.""" - return self.ConfigurationNamed(self._properties["defaultConfigurationName"]) - - def HasBuildSetting(self, key): - """Determines the state of a build setting in all XCBuildConfiguration - child objects. - - If all child objects have key in their build settings, and the value is the - same in all child objects, returns 1. - - If no child objects have the key in their build settings, returns 0. - - If some, but not all, child objects have the key in their build settings, - or if any children have different values for the key, returns -1. - """ - - has = None - value = None - for configuration in self._properties["buildConfigurations"]: - configuration_has = configuration.HasBuildSetting(key) - if has is None: - has = configuration_has - elif has != configuration_has: - return -1 - - if configuration_has: - configuration_value = configuration.GetBuildSetting(key) - if value is None: - value = configuration_value - elif value != configuration_value: - return -1 - - if not has: - return 0 - - return 1 - - def GetBuildSetting(self, key): - """Gets the build setting for key. - - All child XCConfiguration objects must have the same value set for the - setting, or a ValueError will be raised. - """ - - # TODO(mark): This is wrong for build settings that are lists. The list - # contents should be compared (and a list copy returned?) - - value = None - for configuration in self._properties["buildConfigurations"]: - configuration_value = configuration.GetBuildSetting(key) - if value is None: - value = configuration_value - elif value != configuration_value: - raise ValueError("Variant values for " + key) - - return value - - def SetBuildSetting(self, key, value): - """Sets the build setting for key to value in all child - XCBuildConfiguration objects. - """ - - for configuration in self._properties["buildConfigurations"]: - configuration.SetBuildSetting(key, value) - - def AppendBuildSetting(self, key, value): - """Appends value to the build setting for key, which is treated as a list, - in all child XCBuildConfiguration objects. - """ - - for configuration in self._properties["buildConfigurations"]: - configuration.AppendBuildSetting(key, value) - - def DelBuildSetting(self, key): - """Deletes the build setting key from all child XCBuildConfiguration - objects. - """ - - for configuration in self._properties["buildConfigurations"]: - configuration.DelBuildSetting(key) - - def SetBaseConfiguration(self, value): - """Sets the build configuration in all child XCBuildConfiguration objects.""" - - for configuration in self._properties["buildConfigurations"]: - configuration.SetBaseConfiguration(value) - - -class PBXBuildFile(XCObject): - _schema = XCObject._schema.copy() - _schema.update( - { - "fileRef": [0, XCFileLikeElement, 0, 1], - "settings": [0, str, 0, 0], # hack, it's a dict - } - ) - - # Weird output rules for PBXBuildFile. - _should_print_single_line = True - _encode_transforms = XCObject._alternate_encode_transforms - - def Name(self): - # Example: "main.cc in Sources" - return self._properties["fileRef"].Name() + " in " + self.parent.Name() - - def Hashables(self): - # super - hashables = XCObject.Hashables(self) - - # It is not sufficient to just rely on Name() to get the - # XCFileLikeElement's name, because that is not a complete pathname. - # PathHashables returns hashables unique enough that no two - # PBXBuildFiles should wind up with the same set of hashables, unless - # someone adds the same file multiple times to the same target. That - # would be considered invalid anyway. - hashables.extend(self._properties["fileRef"].PathHashables()) - - return hashables - - -class XCBuildPhase(XCObject): - """Abstract base for build phase classes. Not represented in a project - file. - - Attributes: - _files_by_path: A dict mapping each path of a child in the files list by - path (keys) to the corresponding PBXBuildFile children (values). - _files_by_xcfilelikeelement: A dict mapping each XCFileLikeElement (keys) - to the corresponding PBXBuildFile children (values). - """ - - # TODO(mark): Some build phase types, like PBXShellScriptBuildPhase, don't - # actually have a "files" list. XCBuildPhase should not have "files" but - # another abstract subclass of it should provide this, and concrete build - # phase types that do have "files" lists should be derived from that new - # abstract subclass. XCBuildPhase should only provide buildActionMask and - # runOnlyForDeploymentPostprocessing, and not files or the various - # file-related methods and attributes. - - _schema = XCObject._schema.copy() - _schema.update( - { - "buildActionMask": [0, int, 0, 1, 0x7FFFFFFF], - "files": [1, PBXBuildFile, 1, 1, []], - "runOnlyForDeploymentPostprocessing": [0, int, 0, 1, 0], - } - ) - - def __init__(self, properties=None, id=None, parent=None): - # super - XCObject.__init__(self, properties, id, parent) - - self._files_by_path = {} - self._files_by_xcfilelikeelement = {} - for pbxbuildfile in self._properties.get("files", []): - self._AddBuildFileToDicts(pbxbuildfile) - - def FileGroup(self, path): - # Subclasses must override this by returning a two-element tuple. The - # first item in the tuple should be the PBXGroup to which "path" should be - # added, either as a child or deeper descendant. The second item should - # be a boolean indicating whether files should be added into hierarchical - # groups or one single flat group. - raise NotImplementedError(self.__class__.__name__ + " must implement FileGroup") - - def _AddPathToDict(self, pbxbuildfile, path): - """Adds path to the dict tracking paths belonging to this build phase. - - If the path is already a member of this build phase, raises an exception. - """ - - if path in self._files_by_path: - raise ValueError("Found multiple build files with path " + path) - self._files_by_path[path] = pbxbuildfile - - def _AddBuildFileToDicts(self, pbxbuildfile, path=None): - """Maintains the _files_by_path and _files_by_xcfilelikeelement dicts. - - If path is specified, then it is the path that is being added to the - phase, and pbxbuildfile must contain either a PBXFileReference directly - referencing that path, or it must contain a PBXVariantGroup that itself - contains a PBXFileReference referencing the path. - - If path is not specified, either the PBXFileReference's path or the paths - of all children of the PBXVariantGroup are taken as being added to the - phase. - - If the path is already present in the phase, raises an exception. - - If the PBXFileReference or PBXVariantGroup referenced by pbxbuildfile - are already present in the phase, referenced by a different PBXBuildFile - object, raises an exception. This does not raise an exception when - a PBXFileReference or PBXVariantGroup reappear and are referenced by the - same PBXBuildFile that has already introduced them, because in the case - of PBXVariantGroup objects, they may correspond to multiple paths that are - not all added simultaneously. When this situation occurs, the path needs - to be added to _files_by_path, but nothing needs to change in - _files_by_xcfilelikeelement, and the caller should have avoided adding - the PBXBuildFile if it is already present in the list of children. - """ - - xcfilelikeelement = pbxbuildfile._properties["fileRef"] - - paths = [] - if path is not None: - # It's best when the caller provides the path. - if isinstance(xcfilelikeelement, PBXVariantGroup): - paths.append(path) - # If the caller didn't provide a path, there can be either multiple - # paths (PBXVariantGroup) or one. - elif isinstance(xcfilelikeelement, PBXVariantGroup): - for variant in xcfilelikeelement._properties["children"]: - paths.append(variant.FullPath()) - else: - paths.append(xcfilelikeelement.FullPath()) - - # Add the paths first, because if something's going to raise, the - # messages provided by _AddPathToDict are more useful owing to its - # having access to a real pathname and not just an object's Name(). - for a_path in paths: - self._AddPathToDict(pbxbuildfile, a_path) - - # If another PBXBuildFile references this XCFileLikeElement, there's a - # problem. - if ( - xcfilelikeelement in self._files_by_xcfilelikeelement - and self._files_by_xcfilelikeelement[xcfilelikeelement] != pbxbuildfile - ): - raise ValueError( - "Found multiple build files for " + xcfilelikeelement.Name() - ) - self._files_by_xcfilelikeelement[xcfilelikeelement] = pbxbuildfile - - def AppendBuildFile(self, pbxbuildfile, path=None): - # Callers should use this instead of calling - # AppendProperty('files', pbxbuildfile) directly because this function - # maintains the object's dicts. Better yet, callers can just call AddFile - # with a pathname and not worry about building their own PBXBuildFile - # objects. - self.AppendProperty("files", pbxbuildfile) - self._AddBuildFileToDicts(pbxbuildfile, path) - - def AddFile(self, path, settings=None): - (file_group, hierarchical) = self.FileGroup(path) - file_ref = file_group.AddOrGetFileByPath(path, hierarchical) - - if file_ref in self._files_by_xcfilelikeelement and isinstance( - file_ref, PBXVariantGroup - ): - # There's already a PBXBuildFile in this phase corresponding to the - # PBXVariantGroup. path just provides a new variant that belongs to - # the group. Add the path to the dict. - pbxbuildfile = self._files_by_xcfilelikeelement[file_ref] - self._AddBuildFileToDicts(pbxbuildfile, path) - else: - # Add a new PBXBuildFile to get file_ref into the phase. - if settings is None: - pbxbuildfile = PBXBuildFile({"fileRef": file_ref}) - else: - pbxbuildfile = PBXBuildFile({"fileRef": file_ref, "settings": settings}) - self.AppendBuildFile(pbxbuildfile, path) - - -class PBXHeadersBuildPhase(XCBuildPhase): - # No additions to the schema relative to XCBuildPhase. - - def Name(self): - return "Headers" - - def FileGroup(self, path): - return self.PBXProjectAncestor().RootGroupForPath(path) - - -class PBXResourcesBuildPhase(XCBuildPhase): - # No additions to the schema relative to XCBuildPhase. - - def Name(self): - return "Resources" - - def FileGroup(self, path): - return self.PBXProjectAncestor().RootGroupForPath(path) - - -class PBXSourcesBuildPhase(XCBuildPhase): - # No additions to the schema relative to XCBuildPhase. - - def Name(self): - return "Sources" - - def FileGroup(self, path): - return self.PBXProjectAncestor().RootGroupForPath(path) - - -class PBXFrameworksBuildPhase(XCBuildPhase): - # No additions to the schema relative to XCBuildPhase. - - def Name(self): - return "Frameworks" - - def FileGroup(self, path): - (_root, ext) = posixpath.splitext(path) - if ext != "": - ext = ext[1:].lower() - if ext == "o": - # .o files are added to Xcode Frameworks phases, but conceptually aren't - # frameworks, they're more like sources or intermediates. Redirect them - # to show up in one of those other groups. - return self.PBXProjectAncestor().RootGroupForPath(path) - else: - return (self.PBXProjectAncestor().FrameworksGroup(), False) - - -class PBXShellScriptBuildPhase(XCBuildPhase): - _schema = XCBuildPhase._schema.copy() - _schema.update( - { - "inputPaths": [1, str, 0, 1, []], - "name": [0, str, 0, 0], - "outputPaths": [1, str, 0, 1, []], - "shellPath": [0, str, 0, 1, "/bin/sh"], - "shellScript": [0, str, 0, 1], - "showEnvVarsInLog": [0, int, 0, 0], - } - ) - - def Name(self): - if "name" in self._properties: - return self._properties["name"] - - return "ShellScript" - - -class PBXCopyFilesBuildPhase(XCBuildPhase): - _schema = XCBuildPhase._schema.copy() - _schema.update( - { - "dstPath": [0, str, 0, 1], - "dstSubfolderSpec": [0, int, 0, 1], - "name": [0, str, 0, 0], - } - ) - - # path_tree_re matches "$(DIR)/path", "$(DIR)/$(DIR2)/path" or just "$(DIR)". - # Match group 1 is "DIR", group 3 is "path" or "$(DIR2") or "$(DIR2)/path" - # or None. If group 3 is "path", group 4 will be None otherwise group 4 is - # "DIR2" and group 6 is "path". - path_tree_re = re.compile(r"^\$\((.*?)\)(/(\$\((.*?)\)(/(.*)|)|(.*)|)|)$") - - # path_tree_{first,second}_to_subfolder map names of Xcode variables to the - # associated dstSubfolderSpec property value used in a PBXCopyFilesBuildPhase - # object. - path_tree_first_to_subfolder = { - # Types that can be chosen via the Xcode UI. - "BUILT_PRODUCTS_DIR": 16, # Products Directory - "BUILT_FRAMEWORKS_DIR": 10, # Not an official Xcode macro. - # Existed before support for the - # names below was added. Maps to - # "Frameworks". - } - - path_tree_second_to_subfolder = { - "WRAPPER_NAME": 1, # Wrapper - # Although Xcode's friendly name is "Executables", the destination - # is demonstrably the value of the build setting - # EXECUTABLE_FOLDER_PATH not EXECUTABLES_FOLDER_PATH. - "EXECUTABLE_FOLDER_PATH": 6, # Executables. - "UNLOCALIZED_RESOURCES_FOLDER_PATH": 7, # Resources - "JAVA_FOLDER_PATH": 15, # Java Resources - "FRAMEWORKS_FOLDER_PATH": 10, # Frameworks - "SHARED_FRAMEWORKS_FOLDER_PATH": 11, # Shared Frameworks - "SHARED_SUPPORT_FOLDER_PATH": 12, # Shared Support - "PLUGINS_FOLDER_PATH": 13, # PlugIns - # For XPC Services, Xcode sets both dstPath and dstSubfolderSpec. - # Note that it re-uses the BUILT_PRODUCTS_DIR value for - # dstSubfolderSpec. dstPath is set below. - "XPCSERVICES_FOLDER_PATH": 16, # XPC Services. - } - - def Name(self): - if "name" in self._properties: - return self._properties["name"] - - return "CopyFiles" - - def FileGroup(self, path): - return self.PBXProjectAncestor().RootGroupForPath(path) - - def SetDestination(self, path): - """Set the dstSubfolderSpec and dstPath properties from path. - - path may be specified in the same notation used for XCHierarchicalElements, - specifically, "$(DIR)/path". - """ - - if path_tree_match := self.path_tree_re.search(path): - path_tree = path_tree_match.group(1) - if path_tree in self.path_tree_first_to_subfolder: - subfolder = self.path_tree_first_to_subfolder[path_tree] - relative_path = path_tree_match.group(3) - if relative_path is None: - relative_path = "" - - if subfolder == 16 and path_tree_match.group(4) is not None: - # BUILT_PRODUCTS_DIR (16) is the first element in a path whose - # second element is possibly one of the variable names in - # path_tree_second_to_subfolder. Xcode sets the values of all these - # variables to relative paths so .gyp files must prefix them with - # BUILT_PRODUCTS_DIR, e.g. - # $(BUILT_PRODUCTS_DIR)/$(PLUGINS_FOLDER_PATH). Then - # xcode_emulation.py can export these variables with the same values - # as Xcode yet make & ninja files can determine the absolute path - # to the target. Xcode uses the dstSubfolderSpec value set here - # to determine the full path. - # - # An alternative of xcode_emulation.py setting the values to - # absolute paths when exporting these variables has been - # ruled out because then the values would be different - # depending on the build tool. - # - # Another alternative is to invent new names for the variables used - # to match to the subfolder indices in the second table. .gyp files - # then will not need to prepend $(BUILT_PRODUCTS_DIR) because - # xcode_emulation.py can set the values of those variables to - # the absolute paths when exporting. This is possibly the thinking - # behind BUILT_FRAMEWORKS_DIR which is used in exactly this manner. - # - # Requiring prepending BUILT_PRODUCTS_DIR has been chosen because - # this same way could be used to specify destinations in .gyp files - # that pre-date this addition to GYP. However they would only work - # with the Xcode generator. - # The previous version of xcode_emulation.py - # does not export these variables. Such files will get the benefit - # of the Xcode UI showing the proper destination name simply by - # regenerating the projects with this version of GYP. - path_tree = path_tree_match.group(4) - relative_path = path_tree_match.group(6) - separator = "/" - - if path_tree in self.path_tree_second_to_subfolder: - subfolder = self.path_tree_second_to_subfolder[path_tree] - if relative_path is None: - relative_path = "" - separator = "" - if path_tree == "XPCSERVICES_FOLDER_PATH": - relative_path = ( - "$(CONTENTS_FOLDER_PATH)/XPCServices" - + separator - + relative_path - ) - else: - # subfolder = 16 from above - # The second element of the path is an unrecognized variable. - # Include it and any remaining elements in relative_path. - relative_path = path_tree_match.group(3) - - else: - # The path starts with an unrecognized Xcode variable - # name like $(SRCROOT). Xcode will still handle this - # as an "absolute path" that starts with the variable. - subfolder = 0 - relative_path = path - elif path.startswith("/"): - # Special case. Absolute paths are in dstSubfolderSpec 0. - subfolder = 0 - relative_path = path[1:] - else: - raise ValueError(f"Can't use path {path} in a {self.__class__.__name__}") - - self._properties["dstPath"] = relative_path - self._properties["dstSubfolderSpec"] = subfolder - - -class PBXBuildRule(XCObject): - _schema = XCObject._schema.copy() - _schema.update( - { - "compilerSpec": [0, str, 0, 1], - "filePatterns": [0, str, 0, 0], - "fileType": [0, str, 0, 1], - "isEditable": [0, int, 0, 1, 1], - "outputFiles": [1, str, 0, 1, []], - "script": [0, str, 0, 0], - } - ) - - def Name(self): - # Not very inspired, but it's what Xcode uses. - return self.__class__.__name__ - - def Hashables(self): - # super - hashables = XCObject.Hashables(self) - - # Use the hashables of the weak objects that this object refers to. - hashables.append(self._properties["fileType"]) - if "filePatterns" in self._properties: - hashables.append(self._properties["filePatterns"]) - return hashables - - -class PBXContainerItemProxy(XCObject): - # When referencing an item in this project file, containerPortal is the - # PBXProject root object of this project file. When referencing an item in - # another project file, containerPortal is a PBXFileReference identifying - # the other project file. - # - # When serving as a proxy to an XCTarget (in this project file or another), - # proxyType is 1. When serving as a proxy to a PBXFileReference (in another - # project file), proxyType is 2. Type 2 is used for references to the - # producs of the other project file's targets. - # - # Xcode is weird about remoteGlobalIDString. Usually, it's printed without - # a comment, indicating that it's tracked internally simply as a string, but - # sometimes it's printed with a comment (usually when the object is initially - # created), indicating that it's tracked as a project file object at least - # sometimes. This module always tracks it as an object, but contains a hack - # to prevent it from printing the comment in the project file output. See - # _XCKVPrint. - _schema = XCObject._schema.copy() - _schema.update( - { - "containerPortal": [0, XCContainerPortal, 0, 1], - "proxyType": [0, int, 0, 1], - "remoteGlobalIDString": [0, XCRemoteObject, 0, 1], - "remoteInfo": [0, str, 0, 1], - } - ) - - def __repr__(self): - props = self._properties - name = "{}.gyp:{}".format(props["containerPortal"].Name(), props["remoteInfo"]) - return f"<{self.__class__.__name__} {name!r} at 0x{id(self):x}>" - - def Name(self): - # Admittedly not the best name, but it's what Xcode uses. - return self.__class__.__name__ - - def Hashables(self): - # super - hashables = XCObject.Hashables(self) - - # Use the hashables of the weak objects that this object refers to. - hashables.extend(self._properties["containerPortal"].Hashables()) - hashables.extend(self._properties["remoteGlobalIDString"].Hashables()) - return hashables - - -class PBXTargetDependency(XCObject): - # The "target" property accepts an XCTarget object, and obviously not - # NoneType. But XCTarget is defined below, so it can't be put into the - # schema yet. The definition of PBXTargetDependency can't be moved below - # XCTarget because XCTarget's own schema references PBXTargetDependency. - # Python doesn't deal well with this circular relationship, and doesn't have - # a real way to do forward declarations. To work around, the type of - # the "target" property is reset below, after XCTarget is defined. - # - # At least one of "name" and "target" is required. - _schema = XCObject._schema.copy() - _schema.update( - { - "name": [0, str, 0, 0], - "target": [0, None.__class__, 0, 0], - "targetProxy": [0, PBXContainerItemProxy, 1, 1], - } - ) - - def __repr__(self): - name = self._properties.get("name") or self._properties["target"].Name() - return f"<{self.__class__.__name__} {name!r} at 0x{id(self):x}>" - - def Name(self): - # Admittedly not the best name, but it's what Xcode uses. - return self.__class__.__name__ - - def Hashables(self): - # super - hashables = XCObject.Hashables(self) - - # Use the hashables of the weak objects that this object refers to. - hashables.extend(self._properties["targetProxy"].Hashables()) - return hashables - - -class PBXReferenceProxy(XCFileLikeElement): - _schema = XCFileLikeElement._schema.copy() - _schema.update( - { - "fileType": [0, str, 0, 1], - "path": [0, str, 0, 1], - "remoteRef": [0, PBXContainerItemProxy, 1, 1], - } - ) - - -class XCTarget(XCRemoteObject): - # An XCTarget is really just an XCObject, the XCRemoteObject thing is just - # to allow PBXProject to be used in the remoteGlobalIDString property of - # PBXContainerItemProxy. - # - # Setting a "name" property at instantiation may also affect "productName", - # which may in turn affect the "PRODUCT_NAME" build setting in children of - # "buildConfigurationList". See __init__ below. - _schema = XCRemoteObject._schema.copy() - _schema.update( - { - "buildConfigurationList": [ - 0, - XCConfigurationList, - 1, - 1, - XCConfigurationList(), - ], - "buildPhases": [1, XCBuildPhase, 1, 1, []], - "dependencies": [1, PBXTargetDependency, 1, 1, []], - "name": [0, str, 0, 1], - "productName": [0, str, 0, 1], - } - ) - - def __init__( - self, - properties=None, - id=None, - parent=None, - force_outdir=None, - force_prefix=None, - force_extension=None, - ): - # super - XCRemoteObject.__init__(self, properties, id, parent) - - # Set up additional defaults not expressed in the schema. If a "name" - # property was supplied, set "productName" if it is not present. Also set - # the "PRODUCT_NAME" build setting in each configuration, but only if - # the setting is not present in any build configuration. - if "name" in self._properties and "productName" not in self._properties: - self.SetProperty("productName", self._properties["name"]) - - if "productName" in self._properties: - if "buildConfigurationList" in self._properties: - configs = self._properties["buildConfigurationList"] - if configs.HasBuildSetting("PRODUCT_NAME") == 0: - configs.SetBuildSetting( - "PRODUCT_NAME", self._properties["productName"] - ) - - def AddDependency(self, other): - pbxproject = self.PBXProjectAncestor() - other_pbxproject = other.PBXProjectAncestor() - if pbxproject == other_pbxproject: - # Add a dependency to another target in the same project file. - container = PBXContainerItemProxy( - { - "containerPortal": pbxproject, - "proxyType": 1, - "remoteGlobalIDString": other, - "remoteInfo": other.Name(), - } - ) - dependency = PBXTargetDependency( - {"target": other, "targetProxy": container} - ) - self.AppendProperty("dependencies", dependency) - else: - # Add a dependency to a target in a different project file. - other_project_ref = pbxproject.AddOrGetProjectReference(other_pbxproject)[1] - container = PBXContainerItemProxy( - { - "containerPortal": other_project_ref, - "proxyType": 1, - "remoteGlobalIDString": other, - "remoteInfo": other.Name(), - } - ) - dependency = PBXTargetDependency( - {"name": other.Name(), "targetProxy": container} - ) - self.AppendProperty("dependencies", dependency) - - # Proxy all of these through to the build configuration list. - - def ConfigurationNamed(self, name): - return self._properties["buildConfigurationList"].ConfigurationNamed(name) - - def DefaultConfiguration(self): - return self._properties["buildConfigurationList"].DefaultConfiguration() - - def HasBuildSetting(self, key): - return self._properties["buildConfigurationList"].HasBuildSetting(key) - - def GetBuildSetting(self, key): - return self._properties["buildConfigurationList"].GetBuildSetting(key) - - def SetBuildSetting(self, key, value): - return self._properties["buildConfigurationList"].SetBuildSetting(key, value) - - def AppendBuildSetting(self, key, value): - return self._properties["buildConfigurationList"].AppendBuildSetting(key, value) - - def DelBuildSetting(self, key): - return self._properties["buildConfigurationList"].DelBuildSetting(key) - - -# Redefine the type of the "target" property. See PBXTargetDependency._schema -# above. -PBXTargetDependency._schema["target"][1] = XCTarget - - -class PBXNativeTarget(XCTarget): - # buildPhases is overridden in the schema to be able to set defaults. - # - # NOTE: Contrary to most objects, it is advisable to set parent when - # constructing PBXNativeTarget. A parent of an XCTarget must be a PBXProject - # object. A parent reference is required for a PBXNativeTarget during - # construction to be able to set up the target defaults for productReference, - # because a PBXBuildFile object must be created for the target and it must - # be added to the PBXProject's mainGroup hierarchy. - _schema = XCTarget._schema.copy() - _schema.update( - { - "buildPhases": [ - 1, - XCBuildPhase, - 1, - 1, - [PBXSourcesBuildPhase(), PBXFrameworksBuildPhase()], - ], - "buildRules": [1, PBXBuildRule, 1, 1, []], - "productReference": [0, PBXFileReference, 0, 1], - "productType": [0, str, 0, 1], - } - ) - - # Mapping from Xcode product-types to settings. The settings are: - # filetype : used for explicitFileType in the project file - # prefix : the prefix for the file name - # suffix : the suffix for the file name - _product_filetypes = { - "com.apple.product-type.application": ["wrapper.application", "", ".app"], - "com.apple.product-type.application.watchapp": [ - "wrapper.application", - "", - ".app", - ], - "com.apple.product-type.watchkit-extension": [ - "wrapper.app-extension", - "", - ".appex", - ], - "com.apple.product-type.app-extension": ["wrapper.app-extension", "", ".appex"], - "com.apple.product-type.bundle": ["wrapper.cfbundle", "", ".bundle"], - "com.apple.product-type.framework": ["wrapper.framework", "", ".framework"], - "com.apple.product-type.library.dynamic": [ - "compiled.mach-o.dylib", - "lib", - ".dylib", - ], - "com.apple.product-type.library.static": ["archive.ar", "lib", ".a"], - "com.apple.product-type.tool": ["compiled.mach-o.executable", "", ""], - "com.apple.product-type.bundle.unit-test": ["wrapper.cfbundle", "", ".xctest"], - "com.apple.product-type.bundle.ui-testing": ["wrapper.cfbundle", "", ".xctest"], - "com.googlecode.gyp.xcode.bundle": ["compiled.mach-o.dylib", "", ".so"], - "com.apple.product-type.kernel-extension": ["wrapper.kext", "", ".kext"], - } - - def __init__( - self, - properties=None, - id=None, - parent=None, - force_outdir=None, - force_prefix=None, - force_extension=None, - ): - # super - XCTarget.__init__(self, properties, id, parent) - - if ( - "productName" in self._properties - and "productType" in self._properties - and "productReference" not in self._properties - and self._properties["productType"] in self._product_filetypes - ): - products_group = None - pbxproject = self.PBXProjectAncestor() - if pbxproject is not None: - products_group = pbxproject.ProductsGroup() - - if products_group is not None: - (filetype, prefix, suffix) = self._product_filetypes[ - self._properties["productType"] - ] - # Xcode does not have a distinct type for loadable modules that are - # pure BSD targets (not in a bundle wrapper). GYP allows such modules - # to be specified by setting a target type to loadable_module without - # having mac_bundle set. These are mapped to the pseudo-product type - # com.googlecode.gyp.xcode.bundle. - # - # By picking up this special type and converting it to a dynamic - # library (com.apple.product-type.library.dynamic) with fix-ups, - # single-file loadable modules can be produced. - # - # MACH_O_TYPE is changed to mh_bundle to produce the proper file type - # (as opposed to mh_dylib). In order for linking to succeed, - # DYLIB_CURRENT_VERSION and DYLIB_COMPATIBILITY_VERSION must be - # cleared. They are meaningless for type mh_bundle. - # - # Finally, the .so extension is forcibly applied over the default - # (.dylib), unless another forced extension is already selected. - # .dylib is plainly wrong, and .bundle is used by loadable_modules in - # bundle wrappers (com.apple.product-type.bundle). .so seems an odd - # choice because it's used as the extension on many other systems that - # don't distinguish between linkable shared libraries and non-linkable - # loadable modules, but there's precedent: Python loadable modules on - # Mac OS X use an .so extension. - if self._properties["productType"] == "com.googlecode.gyp.xcode.bundle": - self._properties["productType"] = ( - "com.apple.product-type.library.dynamic" - ) - self.SetBuildSetting("MACH_O_TYPE", "mh_bundle") - self.SetBuildSetting("DYLIB_CURRENT_VERSION", "") - self.SetBuildSetting("DYLIB_COMPATIBILITY_VERSION", "") - if force_extension is None: - force_extension = suffix[1:] - - if ( - self._properties["productType"] - in { - "com.apple.product-type-bundle.unit.test", - "com.apple.product-type-bundle.ui-testing", - } - ) and force_extension is None: - force_extension = suffix[1:] - - if force_extension is not None: - # If it's a wrapper (bundle), set WRAPPER_EXTENSION. - # Extension override. - suffix = "." + force_extension - if filetype.startswith("wrapper."): - self.SetBuildSetting("WRAPPER_EXTENSION", force_extension) - else: - self.SetBuildSetting("EXECUTABLE_EXTENSION", force_extension) - - if filetype.startswith("compiled.mach-o.executable"): - product_name = self._properties["productName"] - product_name += suffix - suffix = "" - self.SetProperty("productName", product_name) - self.SetBuildSetting("PRODUCT_NAME", product_name) - - # Xcode handles most prefixes based on the target type, however there - # are exceptions. If a "BSD Dynamic Library" target is added in the - # Xcode UI, Xcode sets EXECUTABLE_PREFIX. This check duplicates that - # behavior. - if force_prefix is not None: - prefix = force_prefix - if filetype.startswith("wrapper."): - self.SetBuildSetting("WRAPPER_PREFIX", prefix) - else: - self.SetBuildSetting("EXECUTABLE_PREFIX", prefix) - - if force_outdir is not None: - self.SetBuildSetting("TARGET_BUILD_DIR", force_outdir) - - # TODO(tvl): Remove the below hack. - # http://code.google.com/p/gyp/issues/detail?id=122 - - # Some targets include the prefix in the target_name. These targets - # really should just add a product_name setting that doesn't include - # the prefix. For example: - # target_name = 'libevent', product_name = 'event' - # This check cleans up for them. - product_name = self._properties["productName"] - prefix_len = len(prefix) - if prefix_len and (product_name[:prefix_len] == prefix): - product_name = product_name[prefix_len:] - self.SetProperty("productName", product_name) - self.SetBuildSetting("PRODUCT_NAME", product_name) - - ref_props = { - "explicitFileType": filetype, - "includeInIndex": 0, - "path": prefix + product_name + suffix, - "sourceTree": "BUILT_PRODUCTS_DIR", - } - file_ref = PBXFileReference(ref_props) - products_group.AppendChild(file_ref) - self.SetProperty("productReference", file_ref) - - def GetBuildPhaseByType(self, type): - if "buildPhases" not in self._properties: - return None - - the_phase = None - for phase in self._properties["buildPhases"]: - if isinstance(phase, type): - # Some phases may be present in multiples in a well-formed project file, - # but phases like PBXSourcesBuildPhase may only be present singly, and - # this function is intended as an aid to GetBuildPhaseByType. Loop - # over the entire list of phases and assert if more than one of the - # desired type is found. - assert the_phase is None - the_phase = phase - - return the_phase - - def HeadersPhase(self): - headers_phase = self.GetBuildPhaseByType(PBXHeadersBuildPhase) - if headers_phase is None: - headers_phase = PBXHeadersBuildPhase() - - # The headers phase should come before the resources, sources, and - # frameworks phases, if any. - insert_at = len(self._properties["buildPhases"]) - for index, phase in enumerate(self._properties["buildPhases"]): - if isinstance( - phase, - ( - PBXResourcesBuildPhase, - PBXSourcesBuildPhase, - PBXFrameworksBuildPhase, - ), - ): - insert_at = index - break - - self._properties["buildPhases"].insert(insert_at, headers_phase) - headers_phase.parent = self - - return headers_phase - - def ResourcesPhase(self): - resources_phase = self.GetBuildPhaseByType(PBXResourcesBuildPhase) - if resources_phase is None: - resources_phase = PBXResourcesBuildPhase() - - # The resources phase should come before the sources and frameworks - # phases, if any. - insert_at = len(self._properties["buildPhases"]) - for index, phase in enumerate(self._properties["buildPhases"]): - if isinstance(phase, (PBXSourcesBuildPhase, PBXFrameworksBuildPhase)): - insert_at = index - break - - self._properties["buildPhases"].insert(insert_at, resources_phase) - resources_phase.parent = self - - return resources_phase - - def SourcesPhase(self): - sources_phase = self.GetBuildPhaseByType(PBXSourcesBuildPhase) - if sources_phase is None: - sources_phase = PBXSourcesBuildPhase() - self.AppendProperty("buildPhases", sources_phase) - - return sources_phase - - def FrameworksPhase(self): - frameworks_phase = self.GetBuildPhaseByType(PBXFrameworksBuildPhase) - if frameworks_phase is None: - frameworks_phase = PBXFrameworksBuildPhase() - self.AppendProperty("buildPhases", frameworks_phase) - - return frameworks_phase - - def AddDependency(self, other): - # super - XCTarget.AddDependency(self, other) - - static_library_type = "com.apple.product-type.library.static" - shared_library_type = "com.apple.product-type.library.dynamic" - framework_type = "com.apple.product-type.framework" - if ( - isinstance(other, PBXNativeTarget) - and "productType" in self._properties - and self._properties["productType"] != static_library_type - and "productType" in other._properties - and ( - other._properties["productType"] == static_library_type - or ( - ( - other._properties["productType"] - in {shared_library_type, framework_type} - ) - and ( - (not other.HasBuildSetting("MACH_O_TYPE")) - or other.GetBuildSetting("MACH_O_TYPE") != "mh_bundle" - ) - ) - ) - ): - file_ref = other.GetProperty("productReference") - - pbxproject = self.PBXProjectAncestor() - other_pbxproject = other.PBXProjectAncestor() - if pbxproject != other_pbxproject: - other_project_product_group = pbxproject.AddOrGetProjectReference( - other_pbxproject - )[0] - file_ref = other_project_product_group.GetChildByRemoteObject(file_ref) - - self.FrameworksPhase().AppendProperty( - "files", PBXBuildFile({"fileRef": file_ref}) - ) - - -class PBXAggregateTarget(XCTarget): - pass - - -class PBXProject(XCContainerPortal): - # A PBXProject is really just an XCObject, the XCContainerPortal thing is - # just to allow PBXProject to be used in the containerPortal property of - # PBXContainerItemProxy. - """ - - Attributes: - path: "sample.xcodeproj". TODO(mark) Document me! - _other_pbxprojects: A dictionary, keyed by other PBXProject objects. Each - value is a reference to the dict in the - projectReferences list associated with the keyed - PBXProject. - """ - - _schema = XCContainerPortal._schema.copy() - _schema.update( - { - "attributes": [0, dict, 0, 0], - "buildConfigurationList": [ - 0, - XCConfigurationList, - 1, - 1, - XCConfigurationList(), - ], - "compatibilityVersion": [0, str, 0, 1, "Xcode 3.2"], - "hasScannedForEncodings": [0, int, 0, 1, 1], - "mainGroup": [0, PBXGroup, 1, 1, PBXGroup()], - "projectDirPath": [0, str, 0, 1, ""], - "projectReferences": [1, dict, 0, 0], - "projectRoot": [0, str, 0, 1, ""], - "targets": [1, XCTarget, 1, 1, []], - } - ) - - def __init__(self, properties=None, id=None, parent=None, path=None): - self.path = path - self._other_pbxprojects = {} - # super - XCContainerPortal.__init__(self, properties, id, parent) - - def Name(self): - name = self.path - if name[-10:] == ".xcodeproj": - name = name[:-10] - return posixpath.basename(name) - - def Path(self): - return self.path - - def Comment(self): - return "Project object" - - def Children(self): - # super - children = XCContainerPortal.Children(self) - - # Add children that the schema doesn't know about. Maybe there's a more - # elegant way around this, but this is the only case where we need to own - # objects in a dictionary (that is itself in a list), and three lines for - # a one-off isn't that big a deal. - if "projectReferences" in self._properties: - for reference in self._properties["projectReferences"]: - children.append(reference["ProductGroup"]) - - return children - - def PBXProjectAncestor(self): - return self - - def _GroupByName(self, name): - if "mainGroup" not in self._properties: - self.SetProperty("mainGroup", PBXGroup()) - - main_group = self._properties["mainGroup"] - group = main_group.GetChildByName(name) - if group is None: - group = PBXGroup({"name": name}) - main_group.AppendChild(group) - - return group - - # SourceGroup and ProductsGroup are created by default in Xcode's own - # templates. - def SourceGroup(self): - return self._GroupByName("Source") - - def ProductsGroup(self): - return self._GroupByName("Products") - - # IntermediatesGroup is used to collect source-like files that are generated - # by rules or script phases and are placed in intermediate directories such - # as DerivedSources. - def IntermediatesGroup(self): - return self._GroupByName("Intermediates") - - # FrameworksGroup and ProjectsGroup are top-level groups used to collect - # frameworks and projects. - def FrameworksGroup(self): - return self._GroupByName("Frameworks") - - def ProjectsGroup(self): - return self._GroupByName("Projects") - - def RootGroupForPath(self, path): - """Returns a PBXGroup child of this object to which path should be added. - - This method is intended to choose between SourceGroup and - IntermediatesGroup on the basis of whether path is present in a source - directory or an intermediates directory. For the purposes of this - determination, any path located within a derived file directory such as - PROJECT_DERIVED_FILE_DIR is treated as being in an intermediates - directory. - - The returned value is a two-element tuple. The first element is the - PBXGroup, and the second element specifies whether that group should be - organized hierarchically (True) or as a single flat list (False). - """ - - # TODO(mark): make this a class variable and bind to self on call? - # Also, this list is nowhere near exhaustive. - # INTERMEDIATE_DIR and SHARED_INTERMEDIATE_DIR are used by - # gyp.generator.xcode. There should probably be some way for that module - # to push the names in, rather than having to hard-code them here. - source_tree_groups = { - "DERIVED_FILE_DIR": (self.IntermediatesGroup, True), - "INTERMEDIATE_DIR": (self.IntermediatesGroup, True), - "PROJECT_DERIVED_FILE_DIR": (self.IntermediatesGroup, True), - "SHARED_INTERMEDIATE_DIR": (self.IntermediatesGroup, True), - } - - (source_tree, path) = SourceTreeAndPathFromPath(path) - if source_tree is not None and source_tree in source_tree_groups: - (group_func, hierarchical) = source_tree_groups[source_tree] - group = group_func() - return (group, hierarchical) - - # TODO(mark): make additional choices based on file extension. - - return (self.SourceGroup(), True) - - def AddOrGetFileInRootGroup(self, path): - """Returns a PBXFileReference corresponding to path in the correct group - according to RootGroupForPath's heuristics. - - If an existing PBXFileReference for path exists, it will be returned. - Otherwise, one will be created and returned. - """ - - (group, hierarchical) = self.RootGroupForPath(path) - return group.AddOrGetFileByPath(path, hierarchical) - - def RootGroupsTakeOverOnlyChildren(self, recurse=False): - """Calls TakeOverOnlyChild for all groups in the main group.""" - - for group in self._properties["mainGroup"]._properties["children"]: - if isinstance(group, PBXGroup): - group.TakeOverOnlyChild(recurse) - - def SortGroups(self): - # Sort the children of the mainGroup (like "Source" and "Products") - # according to their defined order. - self._properties["mainGroup"]._properties["children"] = sorted( - self._properties["mainGroup"]._properties["children"], - key=cmp_to_key(lambda x, y: x.CompareRootGroup(y)), - ) - - # Sort everything else by putting group before files, and going - # alphabetically by name within sections of groups and files. SortGroup - # is recursive. - for group in self._properties["mainGroup"]._properties["children"]: - if not isinstance(group, PBXGroup): - continue - - if group.Name() == "Products": - # The Products group is a special case. Instead of sorting - # alphabetically, sort things in the order of the targets that - # produce the products. To do this, just build up a new list of - # products based on the targets. - products = [] - for target in self._properties["targets"]: - if not isinstance(target, PBXNativeTarget): - continue - product = target._properties["productReference"] - # Make sure that the product is already in the products group. - assert product in group._properties["children"] - products.append(product) - - # Make sure that this process doesn't miss anything that was already - # in the products group. - assert len(products) == len(group._properties["children"]) - group._properties["children"] = products - else: - group.SortGroup() - - def AddOrGetProjectReference(self, other_pbxproject): - """Add a reference to another project file (via PBXProject object) to this - one. - - Returns [ProductGroup, ProjectRef]. ProductGroup is a PBXGroup object in - this project file that contains a PBXReferenceProxy object for each - product of each PBXNativeTarget in the other project file. ProjectRef is - a PBXFileReference to the other project file. - - If this project file already references the other project file, the - existing ProductGroup and ProjectRef are returned. The ProductGroup will - still be updated if necessary. - """ - - if "projectReferences" not in self._properties: - self._properties["projectReferences"] = [] - - product_group = None - project_ref = None - - if other_pbxproject not in self._other_pbxprojects: - # This project file isn't yet linked to the other one. Establish the - # link. - product_group = PBXGroup({"name": "Products"}) - - # ProductGroup is strong. - product_group.parent = self - - # There's nothing unique about this PBXGroup, and if left alone, it will - # wind up with the same set of hashables as all other PBXGroup objects - # owned by the projectReferences list. Add the hashables of the - # remote PBXProject that it's related to. - product_group._hashables.extend(other_pbxproject.Hashables()) - - # The other project reports its path as relative to the same directory - # that this project's path is relative to. The other project's path - # is not necessarily already relative to this project. Figure out the - # pathname that this project needs to use to refer to the other one. - this_path = posixpath.dirname(self.Path()) - projectDirPath = self.GetProperty("projectDirPath") - if projectDirPath: - if posixpath.isabs(projectDirPath[0]): - this_path = projectDirPath - else: - this_path = posixpath.join(this_path, projectDirPath) - other_path = gyp.common.RelativePath(other_pbxproject.Path(), this_path) - - # ProjectRef is weak (it's owned by the mainGroup hierarchy). - project_ref = PBXFileReference( - { - "lastKnownFileType": "wrapper.pb-project", - "path": other_path, - "sourceTree": "SOURCE_ROOT", - } - ) - self.ProjectsGroup().AppendChild(project_ref) - - ref_dict = {"ProductGroup": product_group, "ProjectRef": project_ref} - self._other_pbxprojects[other_pbxproject] = ref_dict - self.AppendProperty("projectReferences", ref_dict) - - # Xcode seems to sort this list case-insensitively - self._properties["projectReferences"] = sorted( - self._properties["projectReferences"], - key=lambda x: x["ProjectRef"].Name().lower(), - ) - else: - # The link already exists. Pull out the relevant data. - project_ref_dict = self._other_pbxprojects[other_pbxproject] - product_group = project_ref_dict["ProductGroup"] - project_ref = project_ref_dict["ProjectRef"] - - self._SetUpProductReferences(other_pbxproject, product_group, project_ref) - - inherit_unique_symroot = self._AllSymrootsUnique(other_pbxproject, False) - targets = other_pbxproject.GetProperty("targets") - if all(self._AllSymrootsUnique(t, inherit_unique_symroot) for t in targets): - dir_path = project_ref._properties["path"] - product_group._hashables.extend(dir_path) - - return [product_group, project_ref] - - def _AllSymrootsUnique(self, target, inherit_unique_symroot): - # Returns True if all configurations have a unique 'SYMROOT' attribute. - # The value of inherit_unique_symroot decides, if a configuration is assumed - # to inherit a unique 'SYMROOT' attribute from its parent, if it doesn't - # define an explicit value for 'SYMROOT'. - symroots = self._DefinedSymroots(target) - for s in self._DefinedSymroots(target): - if (s is not None and not self._IsUniqueSymrootForTarget(s)) or ( - s is None and not inherit_unique_symroot - ): - return False - return True if symroots else inherit_unique_symroot - - def _DefinedSymroots(self, target): - # Returns all values for the 'SYMROOT' attribute defined in all - # configurations for this target. If any configuration doesn't define the - # 'SYMROOT' attribute, None is added to the returned set. If all - # configurations don't define the 'SYMROOT' attribute, an empty set is - # returned. - config_list = target.GetProperty("buildConfigurationList") - symroots = set() - for config in config_list.GetProperty("buildConfigurations"): - setting = config.GetProperty("buildSettings") - if "SYMROOT" in setting: - symroots.add(setting["SYMROOT"]) - else: - symroots.add(None) - if len(symroots) == 1 and None in symroots: - return set() - return symroots - - def _IsUniqueSymrootForTarget(self, symroot): - # This method returns True if all configurations in target contain a - # 'SYMROOT' attribute that is unique for the given target. A value is - # unique, if the Xcode macro '$SRCROOT' appears in it in any form. - uniquifier = ["$SRCROOT", "$(SRCROOT)"] - if any(x in symroot for x in uniquifier): - return True - return False - - def _SetUpProductReferences(self, other_pbxproject, product_group, project_ref): - # TODO(mark): This only adds references to products in other_pbxproject - # when they don't exist in this pbxproject. Perhaps it should also - # remove references from this pbxproject that are no longer present in - # other_pbxproject. Perhaps it should update various properties if they - # change. - for target in other_pbxproject._properties["targets"]: - if not isinstance(target, PBXNativeTarget): - continue - - other_fileref = target._properties["productReference"] - if product_group.GetChildByRemoteObject(other_fileref) is None: - # Xcode sets remoteInfo to the name of the target and not the name - # of its product, despite this proxy being a reference to the product. - container_item = PBXContainerItemProxy( - { - "containerPortal": project_ref, - "proxyType": 2, - "remoteGlobalIDString": other_fileref, - "remoteInfo": target.Name(), - } - ) - # TODO(mark): Does sourceTree get copied straight over from the other - # project? Can the other project ever have lastKnownFileType here - # instead of explicitFileType? (Use it if so?) Can path ever be - # unset? (I don't think so.) Can other_fileref have name set, and - # does it impact the PBXReferenceProxy if so? These are the questions - # that perhaps will be answered one day. - reference_proxy = PBXReferenceProxy( - { - "fileType": other_fileref._properties["explicitFileType"], - "path": other_fileref._properties["path"], - "sourceTree": other_fileref._properties["sourceTree"], - "remoteRef": container_item, - } - ) - - product_group.AppendChild(reference_proxy) - - def SortRemoteProductReferences(self): - # For each remote project file, sort the associated ProductGroup in the - # same order that the targets are sorted in the remote project file. This - # is the sort order used by Xcode. - - def CompareProducts(x, y, remote_products): - # x and y are PBXReferenceProxy objects. Go through their associated - # PBXContainerItem to get the remote PBXFileReference, which will be - # present in the remote_products list. - x_remote = x._properties["remoteRef"]._properties["remoteGlobalIDString"] - y_remote = y._properties["remoteRef"]._properties["remoteGlobalIDString"] - x_index = remote_products.index(x_remote) - y_index = remote_products.index(y_remote) - - # Use the order of each remote PBXFileReference in remote_products to - # determine the sort order. - return cmp(x_index, y_index) - - for other_pbxproject, ref_dict in self._other_pbxprojects.items(): - # Build up a list of products in the remote project file, ordered the - # same as the targets that produce them. - remote_products = [] - for target in other_pbxproject._properties["targets"]: - if not isinstance(target, PBXNativeTarget): - continue - remote_products.append(target._properties["productReference"]) - - # Sort the PBXReferenceProxy children according to the list of remote - # products. - product_group = ref_dict["ProductGroup"] - product_group._properties["children"] = sorted( - product_group._properties["children"], - key=cmp_to_key( - lambda x, y, rp=remote_products: CompareProducts(x, y, rp) - ), - ) - - -class XCProjectFile(XCObject): - _schema = XCObject._schema.copy() - _schema.update( - { - "archiveVersion": [0, int, 0, 1, 1], - "classes": [0, dict, 0, 1, {}], - "objectVersion": [0, int, 0, 1, 46], - "rootObject": [0, PBXProject, 1, 1], - } - ) - - def ComputeIDs(self, recursive=True, overwrite=True, hash=None): - # Although XCProjectFile is implemented here as an XCObject, it's not a - # proper object in the Xcode sense, and it certainly doesn't have its own - # ID. Pass through an attempt to update IDs to the real root object. - if recursive: - self._properties["rootObject"].ComputeIDs(recursive, overwrite, hash) - - def Print(self, file=sys.stdout): - self.VerifyHasRequiredProperties() - - # Add the special "objects" property, which will be caught and handled - # separately during printing. This structure allows a fairly standard - # loop do the normal printing. - self._properties["objects"] = {} - self._XCPrint(file, 0, "// !$*UTF8*$!\n") - if self._should_print_single_line: - self._XCPrint(file, 0, "{ ") - else: - self._XCPrint(file, 0, "{\n") - for property, value in sorted(self._properties.items()): - if property == "objects": - self._PrintObjects(file) - else: - self._XCKVPrint(file, 1, property, value) - self._XCPrint(file, 0, "}\n") - del self._properties["objects"] - - def _PrintObjects(self, file): - if self._should_print_single_line: - self._XCPrint(file, 0, "objects = {") - else: - self._XCPrint(file, 1, "objects = {\n") - - objects_by_class = {} - for object in self.Descendants(): - if object == self: - continue - class_name = object.__class__.__name__ - if class_name not in objects_by_class: - objects_by_class[class_name] = [] - objects_by_class[class_name].append(object) - - for class_name in sorted(objects_by_class): - self._XCPrint(file, 0, "\n") - self._XCPrint(file, 0, "/* Begin " + class_name + " section */\n") - for object in sorted(objects_by_class[class_name], key=attrgetter("id")): - object.Print(file) - self._XCPrint(file, 0, "/* End " + class_name + " section */\n") - - if self._should_print_single_line: - self._XCPrint(file, 0, "}; ") - else: - self._XCPrint(file, 1, "};\n") diff --git a/tools/gyp/pylib/gyp/xml_fix.py b/tools/gyp/pylib/gyp/xml_fix.py deleted file mode 100644 index d7e3b5a9560..00000000000 --- a/tools/gyp/pylib/gyp/xml_fix.py +++ /dev/null @@ -1,64 +0,0 @@ -# Copyright (c) 2011 Google Inc. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Applies a fix to CR LF TAB handling in xml.dom. - -Fixes this: http://code.google.com/p/chromium/issues/detail?id=76293 -Working around this: http://bugs.python.org/issue5752 -TODO(bradnelson): Consider dropping this when we drop XP support. -""" - -import xml.dom.minidom - - -def _Replacement_write_data(writer, data, is_attrib=False): - """Writes datachars to writer.""" - data = data.replace("&", "&").replace("<", "<") - data = data.replace('"', """).replace(">", ">") - if is_attrib: - data = data.replace("\r", " ").replace("\n", " ").replace("\t", " ") - writer.write(data) - - -def _Replacement_writexml(self, writer, indent="", addindent="", newl=""): - # indent = current indentation - # addindent = indentation to add to higher levels - # newl = newline string - writer.write(indent + "<" + self.tagName) - - attrs = self._get_attributes() - a_names = sorted(attrs.keys()) - - for a_name in a_names: - writer.write(' %s="' % a_name) - _Replacement_write_data(writer, attrs[a_name].value, is_attrib=True) - writer.write('"') - if self.childNodes: - writer.write(">%s" % newl) - for node in self.childNodes: - node.writexml(writer, indent + addindent, addindent, newl) - writer.write(f"{indent}{newl}") - else: - writer.write("/>%s" % newl) - - -class XmlFix: - """Object to manage temporary patching of xml.dom.minidom.""" - - def __init__(self): - # Preserve current xml.dom.minidom functions. - self.write_data = xml.dom.minidom._write_data - self.writexml = xml.dom.minidom.Element.writexml - # Inject replacement versions of a function and a method. - xml.dom.minidom._write_data = _Replacement_write_data - xml.dom.minidom.Element.writexml = _Replacement_writexml - - def Cleanup(self): - if self.write_data: - xml.dom.minidom._write_data = self.write_data - xml.dom.minidom.Element.writexml = self.writexml - self.write_data = None - - def __del__(self): - self.Cleanup() diff --git a/tools/gyp/pylib/packaging/LICENSE b/tools/gyp/pylib/packaging/LICENSE deleted file mode 100644 index 6f62d44e4ef..00000000000 --- a/tools/gyp/pylib/packaging/LICENSE +++ /dev/null @@ -1,3 +0,0 @@ -This software is made available under the terms of *either* of the licenses -found in LICENSE.APACHE or LICENSE.BSD. Contributions to this software is made -under the terms of *both* these licenses. diff --git a/tools/gyp/pylib/packaging/LICENSE.APACHE b/tools/gyp/pylib/packaging/LICENSE.APACHE deleted file mode 100644 index f433b1a53f5..00000000000 --- a/tools/gyp/pylib/packaging/LICENSE.APACHE +++ /dev/null @@ -1,177 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS diff --git a/tools/gyp/pylib/packaging/LICENSE.BSD b/tools/gyp/pylib/packaging/LICENSE.BSD deleted file mode 100644 index 42ce7b75c92..00000000000 --- a/tools/gyp/pylib/packaging/LICENSE.BSD +++ /dev/null @@ -1,23 +0,0 @@ -Copyright (c) Donald Stufft and individual contributors. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/tools/gyp/pylib/packaging/__init__.py b/tools/gyp/pylib/packaging/__init__.py deleted file mode 100644 index 5fd91838316..00000000000 --- a/tools/gyp/pylib/packaging/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. - -__title__ = "packaging" -__summary__ = "Core utilities for Python packages" -__uri__ = "https://github.com/pypa/packaging" - -__version__ = "23.3.dev0" - -__author__ = "Donald Stufft and individual contributors" -__email__ = "donald@stufft.io" - -__license__ = "BSD-2-Clause or Apache-2.0" -__copyright__ = "2014 %s" % __author__ diff --git a/tools/gyp/pylib/packaging/_elffile.py b/tools/gyp/pylib/packaging/_elffile.py deleted file mode 100644 index cb33e10556b..00000000000 --- a/tools/gyp/pylib/packaging/_elffile.py +++ /dev/null @@ -1,107 +0,0 @@ -""" -ELF file parser. - -This provides a class ``ELFFile`` that parses an ELF executable in a similar -interface to ``ZipFile``. Only the read interface is implemented. - -Based on: https://gist.github.com/lyssdod/f51579ae8d93c8657a5564aefc2ffbca -ELF header: https://refspecs.linuxfoundation.org/elf/gabi4+/ch4.eheader.html -""" - -import enum -import os -import struct -from typing import IO, Optional, Tuple - - -class ELFInvalid(ValueError): - pass - - -class EIClass(enum.IntEnum): - C32 = 1 - C64 = 2 - - -class EIData(enum.IntEnum): - Lsb = 1 - Msb = 2 - - -class EMachine(enum.IntEnum): - I386 = 3 - S390 = 22 - Arm = 40 - X8664 = 62 - AArc64 = 183 - - -class ELFFile: - """ - Representation of an ELF executable. - """ - - def __init__(self, f: IO[bytes]) -> None: - self._f = f - - try: - ident = self._read("16B") - except struct.error: - raise ELFInvalid("unable to parse identification") - if (magic := bytes(ident[:4])) != b"\x7fELF": - raise ELFInvalid(f"invalid magic: {magic!r}") - - self.capacity = ident[4] # Format for program header (bitness). - self.encoding = ident[5] # Data structure encoding (endianness). - - try: - # e_fmt: Format for program header. - # p_fmt: Format for section header. - # p_idx: Indexes to find p_type, p_offset, and p_filesz. - e_fmt, self._p_fmt, self._p_idx = { - (1, 1): ("HHIIIIIHHH", ">IIIIIIII", (0, 1, 4)), # 32-bit MSB. - (2, 1): ("HHIQQQIHHH", ">IIQQQQQQ", (0, 2, 5)), # 64-bit MSB. - }[(self.capacity, self.encoding)] - except KeyError: - raise ELFInvalid( - f"unrecognized capacity ({self.capacity}) or " - f"encoding ({self.encoding})" - ) - - try: - ( - _, - self.machine, # Architecture type. - _, - _, - self._e_phoff, # Offset of program header. - _, - self.flags, # Processor-specific flags. - _, - self._e_phentsize, # Size of section. - self._e_phnum, # Number of sections. - ) = self._read(e_fmt) - except struct.error as e: - raise ELFInvalid("unable to parse machine and section information") from e - - def _read(self, fmt: str) -> Tuple[int, ...]: - return struct.unpack(fmt, self._f.read(struct.calcsize(fmt))) - - @property - def interpreter(self) -> Optional[str]: - """ - The path recorded in the ``PT_INTERP`` section header. - """ - for index in range(self._e_phnum): - self._f.seek(self._e_phoff + self._e_phentsize * index) - try: - data = self._read(self._p_fmt) - except struct.error: - continue - if data[self._p_idx[0]] != 3: # Not PT_INTERP. - continue - self._f.seek(data[self._p_idx[1]]) - return os.fsdecode(self._f.read(data[self._p_idx[2]])).strip("\0") - return None diff --git a/tools/gyp/pylib/packaging/_manylinux.py b/tools/gyp/pylib/packaging/_manylinux.py deleted file mode 100644 index 3705d50db91..00000000000 --- a/tools/gyp/pylib/packaging/_manylinux.py +++ /dev/null @@ -1,252 +0,0 @@ -import collections -import contextlib -import functools -import os -import re -import sys -import warnings -from typing import Dict, Generator, Iterator, NamedTuple, Optional, Sequence, Tuple - -from ._elffile import EIClass, EIData, ELFFile, EMachine - -EF_ARM_ABIMASK = 0xFF000000 -EF_ARM_ABI_VER5 = 0x05000000 -EF_ARM_ABI_FLOAT_HARD = 0x00000400 - - -# `os.PathLike` not a generic type until Python 3.9, so sticking with `str` -# as the type for `path` until then. -@contextlib.contextmanager -def _parse_elf(path: str) -> Generator[Optional[ELFFile], None, None]: - try: - with open(path, "rb") as f: - yield ELFFile(f) - except (OSError, TypeError, ValueError): - yield None - - -def _is_linux_armhf(executable: str) -> bool: - # hard-float ABI can be detected from the ELF header of the running - # process - # https://static.docs.arm.com/ihi0044/g/aaelf32.pdf - with _parse_elf(executable) as f: - return ( - f is not None - and f.capacity == EIClass.C32 - and f.encoding == EIData.Lsb - and f.machine == EMachine.Arm - and f.flags & EF_ARM_ABIMASK == EF_ARM_ABI_VER5 - and f.flags & EF_ARM_ABI_FLOAT_HARD == EF_ARM_ABI_FLOAT_HARD - ) - - -def _is_linux_i686(executable: str) -> bool: - with _parse_elf(executable) as f: - return ( - f is not None - and f.capacity == EIClass.C32 - and f.encoding == EIData.Lsb - and f.machine == EMachine.I386 - ) - - -def _have_compatible_abi(executable: str, archs: Sequence[str]) -> bool: - if "armv7l" in archs: - return _is_linux_armhf(executable) - if "i686" in archs: - return _is_linux_i686(executable) - allowed_archs = {"x86_64", "aarch64", "ppc64", "ppc64le", "s390x", "loongarch64"} - return any(arch in allowed_archs for arch in archs) - - -# If glibc ever changes its major version, we need to know what the last -# minor version was, so we can build the complete list of all versions. -# For now, guess what the highest minor version might be, assume it will -# be 50 for testing. Once this actually happens, update the dictionary -# with the actual value. -_LAST_GLIBC_MINOR: Dict[int, int] = collections.defaultdict(lambda: 50) - - -class _GLibCVersion(NamedTuple): - major: int - minor: int - - -def _glibc_version_string_confstr() -> Optional[str]: - """ - Primary implementation of glibc_version_string using os.confstr. - """ - # os.confstr is quite a bit faster than ctypes.DLL. It's also less likely - # to be broken or missing. This strategy is used in the standard library - # platform module. - # https://github.com/python/cpython/blob/fcf1d003bf4f0100c/Lib/platform.py#L175-L183 - try: - # Should be a string like "glibc 2.17". - version_string: str = getattr(os, "confstr")("CS_GNU_LIBC_VERSION") - assert version_string is not None - _, version = version_string.rsplit() - except (AssertionError, AttributeError, OSError, ValueError): - # os.confstr() or CS_GNU_LIBC_VERSION not available (or a bad value)... - return None - return version - - -def _glibc_version_string_ctypes() -> Optional[str]: - """ - Fallback implementation of glibc_version_string using ctypes. - """ - try: - import ctypes - except ImportError: - return None - - # ctypes.CDLL(None) internally calls dlopen(NULL), and as the dlopen - # manpage says, "If filename is NULL, then the returned handle is for the - # main program". This way we can let the linker do the work to figure out - # which libc our process is actually using. - # - # We must also handle the special case where the executable is not a - # dynamically linked executable. This can occur when using musl libc, - # for example. In this situation, dlopen() will error, leading to an - # OSError. Interestingly, at least in the case of musl, there is no - # errno set on the OSError. The single string argument used to construct - # OSError comes from libc itself and is therefore not portable to - # hard code here. In any case, failure to call dlopen() means we - # can proceed, so we bail on our attempt. - try: - process_namespace = ctypes.CDLL(None) - except OSError: - return None - - try: - gnu_get_libc_version = process_namespace.gnu_get_libc_version - except AttributeError: - # Symbol doesn't exist -> therefore, we are not linked to - # glibc. - return None - - # Call gnu_get_libc_version, which returns a string like "2.5" - gnu_get_libc_version.restype = ctypes.c_char_p - version_str: str = gnu_get_libc_version() - # py2 / py3 compatibility: - if not isinstance(version_str, str): - version_str = version_str.decode("ascii") - - return version_str - - -def _glibc_version_string() -> Optional[str]: - """Returns glibc version string, or None if not using glibc.""" - return _glibc_version_string_confstr() or _glibc_version_string_ctypes() - - -def _parse_glibc_version(version_str: str) -> Tuple[int, int]: - """Parse glibc version. - - We use a regexp instead of str.split because we want to discard any - random junk that might come after the minor version -- this might happen - in patched/forked versions of glibc (e.g. Linaro's version of glibc - uses version strings like "2.20-2014.11"). See gh-3588. - """ - m = re.match(r"(?P[0-9]+)\.(?P[0-9]+)", version_str) - if not m: - warnings.warn( - f"Expected glibc version with 2 components major.minor," - f" got: {version_str}", - RuntimeWarning, - ) - return -1, -1 - return int(m.group("major")), int(m.group("minor")) - - -@functools.lru_cache() -def _get_glibc_version() -> Tuple[int, int]: - version_str = _glibc_version_string() - if version_str is None: - return (-1, -1) - return _parse_glibc_version(version_str) - - -# From PEP 513, PEP 600 -def _is_compatible(arch: str, version: _GLibCVersion) -> bool: - sys_glibc = _get_glibc_version() - if sys_glibc < version: - return False - # Check for presence of _manylinux module. - try: - import _manylinux # noqa - except ImportError: - return True - if hasattr(_manylinux, "manylinux_compatible"): - result = _manylinux.manylinux_compatible(version[0], version[1], arch) - if result is not None: - return bool(result) - return True - if version == _GLibCVersion(2, 5): - if hasattr(_manylinux, "manylinux1_compatible"): - return bool(_manylinux.manylinux1_compatible) - if version == _GLibCVersion(2, 12): - if hasattr(_manylinux, "manylinux2010_compatible"): - return bool(_manylinux.manylinux2010_compatible) - if version == _GLibCVersion(2, 17): - if hasattr(_manylinux, "manylinux2014_compatible"): - return bool(_manylinux.manylinux2014_compatible) - return True - - -_LEGACY_MANYLINUX_MAP = { - # CentOS 7 w/ glibc 2.17 (PEP 599) - (2, 17): "manylinux2014", - # CentOS 6 w/ glibc 2.12 (PEP 571) - (2, 12): "manylinux2010", - # CentOS 5 w/ glibc 2.5 (PEP 513) - (2, 5): "manylinux1", -} - - -def platform_tags(archs: Sequence[str]) -> Iterator[str]: - """Generate manylinux tags compatible to the current platform. - - :param archs: Sequence of compatible architectures. - The first one shall be the closest to the actual architecture and be the part of - platform tag after the ``linux_`` prefix, e.g. ``x86_64``. - The ``linux_`` prefix is assumed as a prerequisite for the current platform to - be manylinux-compatible. - - :returns: An iterator of compatible manylinux tags. - """ - if not _have_compatible_abi(sys.executable, archs): - return - # Oldest glibc to be supported regardless of architecture is (2, 17). - too_old_glibc2 = _GLibCVersion(2, 16) - if set(archs) & {"x86_64", "i686"}: - # On x86/i686 also oldest glibc to be supported is (2, 5). - too_old_glibc2 = _GLibCVersion(2, 4) - current_glibc = _GLibCVersion(*_get_glibc_version()) - glibc_max_list = [current_glibc] - # We can assume compatibility across glibc major versions. - # https://sourceware.org/bugzilla/show_bug.cgi?id=24636 - # - # Build a list of maximum glibc versions so that we can - # output the canonical list of all glibc from current_glibc - # down to too_old_glibc2, including all intermediary versions. - for glibc_major in range(current_glibc.major - 1, 1, -1): - glibc_minor = _LAST_GLIBC_MINOR[glibc_major] - glibc_max_list.append(_GLibCVersion(glibc_major, glibc_minor)) - for arch in archs: - for glibc_max in glibc_max_list: - if glibc_max.major == too_old_glibc2.major: - min_minor = too_old_glibc2.minor - else: - # For other glibc major versions oldest supported is (x, 0). - min_minor = -1 - for glibc_minor in range(glibc_max.minor, min_minor, -1): - glibc_version = _GLibCVersion(glibc_max.major, glibc_minor) - tag = "manylinux_{}_{}".format(*glibc_version) - if _is_compatible(arch, glibc_version): - yield f"{tag}_{arch}" - # Handle the legacy manylinux1, manylinux2010, manylinux2014 tags. - if glibc_version in _LEGACY_MANYLINUX_MAP: - legacy_tag = _LEGACY_MANYLINUX_MAP[glibc_version] - if _is_compatible(arch, glibc_version): - yield f"{legacy_tag}_{arch}" diff --git a/tools/gyp/pylib/packaging/_musllinux.py b/tools/gyp/pylib/packaging/_musllinux.py deleted file mode 100644 index 86419df9d70..00000000000 --- a/tools/gyp/pylib/packaging/_musllinux.py +++ /dev/null @@ -1,83 +0,0 @@ -"""PEP 656 support. - -This module implements logic to detect if the currently running Python is -linked against musl, and what musl version is used. -""" - -import functools -import re -import subprocess -import sys -from typing import Iterator, NamedTuple, Optional, Sequence - -from ._elffile import ELFFile - - -class _MuslVersion(NamedTuple): - major: int - minor: int - - -def _parse_musl_version(output: str) -> Optional[_MuslVersion]: - lines = [n for n in (n.strip() for n in output.splitlines()) if n] - if len(lines) < 2 or lines[0][:4] != "musl": - return None - m = re.match(r"Version (\d+)\.(\d+)", lines[1]) - if not m: - return None - return _MuslVersion(major=int(m.group(1)), minor=int(m.group(2))) - - -@functools.lru_cache() -def _get_musl_version(executable: str) -> Optional[_MuslVersion]: - """Detect currently-running musl runtime version. - - This is done by checking the specified executable's dynamic linking - information, and invoking the loader to parse its output for a version - string. If the loader is musl, the output would be something like:: - - musl libc (x86_64) - Version 1.2.2 - Dynamic Program Loader - """ - try: - with open(executable, "rb") as f: - ld = ELFFile(f).interpreter - except (OSError, TypeError, ValueError): - return None - if ld is None or "musl" not in ld: - return None - proc = subprocess.run([ld], stderr=subprocess.PIPE, text=True) - return _parse_musl_version(proc.stderr) - - -def platform_tags(archs: Sequence[str]) -> Iterator[str]: - """Generate musllinux tags compatible to the current platform. - - :param archs: Sequence of compatible architectures. - The first one shall be the closest to the actual architecture and be the part of - platform tag after the ``linux_`` prefix, e.g. ``x86_64``. - The ``linux_`` prefix is assumed as a prerequisite for the current platform to - be musllinux-compatible. - - :returns: An iterator of compatible musllinux tags. - """ - sys_musl = _get_musl_version(sys.executable) - if sys_musl is None: # Python not dynamically linked against musl. - return - for arch in archs: - for minor in range(sys_musl.minor, -1, -1): - yield f"musllinux_{sys_musl.major}_{minor}_{arch}" - - -if __name__ == "__main__": # pragma: no cover - import sysconfig - - plat = sysconfig.get_platform() - assert plat.startswith("linux-"), "not linux" - - print("plat:", plat) - print("musl:", _get_musl_version(sys.executable)) - print("tags:", end=" ") - for t in platform_tags(re.sub(r"[.-]", "_", plat.split("-", 1)[-1])): - print(t, end="\n ") diff --git a/tools/gyp/pylib/packaging/_parser.py b/tools/gyp/pylib/packaging/_parser.py deleted file mode 100644 index 4576981c2dd..00000000000 --- a/tools/gyp/pylib/packaging/_parser.py +++ /dev/null @@ -1,359 +0,0 @@ -"""Handwritten parser of dependency specifiers. - -The docstring for each __parse_* function contains ENBF-inspired grammar representing -the implementation. -""" - -import ast -from typing import Any, List, NamedTuple, Optional, Tuple, Union - -from ._tokenizer import DEFAULT_RULES, Tokenizer - - -class Node: - def __init__(self, value: str) -> None: - self.value = value - - def __str__(self) -> str: - return self.value - - def __repr__(self) -> str: - return f"<{self.__class__.__name__}('{self}')>" - - def serialize(self) -> str: - raise NotImplementedError - - -class Variable(Node): - def serialize(self) -> str: - return str(self) - - -class Value(Node): - def serialize(self) -> str: - return f'"{self}"' - - -class Op(Node): - def serialize(self) -> str: - return str(self) - - -MarkerVar = Union[Variable, Value] -MarkerItem = Tuple[MarkerVar, Op, MarkerVar] -# MarkerAtom = Union[MarkerItem, List["MarkerAtom"]] -# MarkerList = List[Union["MarkerList", MarkerAtom, str]] -# mypy does not support recursive type definition -# https://github.com/python/mypy/issues/731 -MarkerAtom = Any -MarkerList = List[Any] - - -class ParsedRequirement(NamedTuple): - name: str - url: str - extras: List[str] - specifier: str - marker: Optional[MarkerList] - - -# -------------------------------------------------------------------------------------- -# Recursive descent parser for dependency specifier -# -------------------------------------------------------------------------------------- -def parse_requirement(source: str) -> ParsedRequirement: - return _parse_requirement(Tokenizer(source, rules=DEFAULT_RULES)) - - -def _parse_requirement(tokenizer: Tokenizer) -> ParsedRequirement: - """ - requirement = WS? IDENTIFIER WS? extras WS? requirement_details - """ - tokenizer.consume("WS") - - name_token = tokenizer.expect( - "IDENTIFIER", expected="package name at the start of dependency specifier" - ) - name = name_token.text - tokenizer.consume("WS") - - extras = _parse_extras(tokenizer) - tokenizer.consume("WS") - - url, specifier, marker = _parse_requirement_details(tokenizer) - tokenizer.expect("END", expected="end of dependency specifier") - - return ParsedRequirement(name, url, extras, specifier, marker) - - -def _parse_requirement_details( - tokenizer: Tokenizer, -) -> Tuple[str, str, Optional[MarkerList]]: - """ - requirement_details = AT URL (WS requirement_marker?)? - | specifier WS? (requirement_marker)? - """ - - specifier = "" - url = "" - marker = None - - if tokenizer.check("AT"): - tokenizer.read() - tokenizer.consume("WS") - - url_start = tokenizer.position - url = tokenizer.expect("URL", expected="URL after @").text - if tokenizer.check("END", peek=True): - return (url, specifier, marker) - - tokenizer.expect("WS", expected="whitespace after URL") - - # The input might end after whitespace. - if tokenizer.check("END", peek=True): - return (url, specifier, marker) - - marker = _parse_requirement_marker( - tokenizer, span_start=url_start, after="URL and whitespace" - ) - else: - specifier_start = tokenizer.position - specifier = _parse_specifier(tokenizer) - tokenizer.consume("WS") - - if tokenizer.check("END", peek=True): - return (url, specifier, marker) - - marker = _parse_requirement_marker( - tokenizer, - span_start=specifier_start, - after=( - "version specifier" - if specifier - else "name and no valid version specifier" - ), - ) - - return (url, specifier, marker) - - -def _parse_requirement_marker( - tokenizer: Tokenizer, *, span_start: int, after: str -) -> MarkerList: - """ - requirement_marker = SEMICOLON marker WS? - """ - - if not tokenizer.check("SEMICOLON"): - tokenizer.raise_syntax_error( - f"Expected end or semicolon (after {after})", - span_start=span_start, - ) - tokenizer.read() - - marker = _parse_marker(tokenizer) - tokenizer.consume("WS") - - return marker - - -def _parse_extras(tokenizer: Tokenizer) -> List[str]: - """ - extras = (LEFT_BRACKET wsp* extras_list? wsp* RIGHT_BRACKET)? - """ - if not tokenizer.check("LEFT_BRACKET", peek=True): - return [] - - with tokenizer.enclosing_tokens( - "LEFT_BRACKET", - "RIGHT_BRACKET", - around="extras", - ): - tokenizer.consume("WS") - extras = _parse_extras_list(tokenizer) - tokenizer.consume("WS") - - return extras - - -def _parse_extras_list(tokenizer: Tokenizer) -> List[str]: - """ - extras_list = identifier (wsp* ',' wsp* identifier)* - """ - extras: List[str] = [] - - if not tokenizer.check("IDENTIFIER"): - return extras - - extras.append(tokenizer.read().text) - - while True: - tokenizer.consume("WS") - if tokenizer.check("IDENTIFIER", peek=True): - tokenizer.raise_syntax_error("Expected comma between extra names") - elif not tokenizer.check("COMMA"): - break - - tokenizer.read() - tokenizer.consume("WS") - - extra_token = tokenizer.expect("IDENTIFIER", expected="extra name after comma") - extras.append(extra_token.text) - - return extras - - -def _parse_specifier(tokenizer: Tokenizer) -> str: - """ - specifier = LEFT_PARENTHESIS WS? version_many WS? RIGHT_PARENTHESIS - | WS? version_many WS? - """ - with tokenizer.enclosing_tokens( - "LEFT_PARENTHESIS", - "RIGHT_PARENTHESIS", - around="version specifier", - ): - tokenizer.consume("WS") - parsed_specifiers = _parse_version_many(tokenizer) - tokenizer.consume("WS") - - return parsed_specifiers - - -def _parse_version_many(tokenizer: Tokenizer) -> str: - """ - version_many = (SPECIFIER (WS? COMMA WS? SPECIFIER)*)? - """ - parsed_specifiers = "" - while tokenizer.check("SPECIFIER"): - span_start = tokenizer.position - parsed_specifiers += tokenizer.read().text - if tokenizer.check("VERSION_PREFIX_TRAIL", peek=True): - tokenizer.raise_syntax_error( - ".* suffix can only be used with `==` or `!=` operators", - span_start=span_start, - span_end=tokenizer.position + 1, - ) - if tokenizer.check("VERSION_LOCAL_LABEL_TRAIL", peek=True): - tokenizer.raise_syntax_error( - "Local version label can only be used with `==` or `!=` operators", - span_start=span_start, - span_end=tokenizer.position, - ) - tokenizer.consume("WS") - if not tokenizer.check("COMMA"): - break - parsed_specifiers += tokenizer.read().text - tokenizer.consume("WS") - - return parsed_specifiers - - -# -------------------------------------------------------------------------------------- -# Recursive descent parser for marker expression -# -------------------------------------------------------------------------------------- -def parse_marker(source: str) -> MarkerList: - return _parse_full_marker(Tokenizer(source, rules=DEFAULT_RULES)) - - -def _parse_full_marker(tokenizer: Tokenizer) -> MarkerList: - retval = _parse_marker(tokenizer) - tokenizer.expect("END", expected="end of marker expression") - return retval - - -def _parse_marker(tokenizer: Tokenizer) -> MarkerList: - """ - marker = marker_atom (BOOLOP marker_atom)+ - """ - expression = [_parse_marker_atom(tokenizer)] - while tokenizer.check("BOOLOP"): - token = tokenizer.read() - expr_right = _parse_marker_atom(tokenizer) - expression.extend((token.text, expr_right)) - return expression - - -def _parse_marker_atom(tokenizer: Tokenizer) -> MarkerAtom: - """ - marker_atom = WS? LEFT_PARENTHESIS WS? marker WS? RIGHT_PARENTHESIS WS? - | WS? marker_item WS? - """ - - tokenizer.consume("WS") - if tokenizer.check("LEFT_PARENTHESIS", peek=True): - with tokenizer.enclosing_tokens( - "LEFT_PARENTHESIS", - "RIGHT_PARENTHESIS", - around="marker expression", - ): - tokenizer.consume("WS") - marker: MarkerAtom = _parse_marker(tokenizer) - tokenizer.consume("WS") - else: - marker = _parse_marker_item(tokenizer) - tokenizer.consume("WS") - return marker - - -def _parse_marker_item(tokenizer: Tokenizer) -> MarkerItem: - """ - marker_item = WS? marker_var WS? marker_op WS? marker_var WS? - """ - tokenizer.consume("WS") - marker_var_left = _parse_marker_var(tokenizer) - tokenizer.consume("WS") - marker_op = _parse_marker_op(tokenizer) - tokenizer.consume("WS") - marker_var_right = _parse_marker_var(tokenizer) - tokenizer.consume("WS") - return (marker_var_left, marker_op, marker_var_right) - - -def _parse_marker_var(tokenizer: Tokenizer) -> MarkerVar: - """ - marker_var = VARIABLE | QUOTED_STRING - """ - if tokenizer.check("VARIABLE"): - return process_env_var(tokenizer.read().text.replace(".", "_")) - elif tokenizer.check("QUOTED_STRING"): - return process_python_str(tokenizer.read().text) - else: - tokenizer.raise_syntax_error( - message="Expected a marker variable or quoted string" - ) - - -def process_env_var(env_var: str) -> Variable: - if ( - env_var == "platform_python_implementation" - or env_var == "python_implementation" - ): - return Variable("platform_python_implementation") - else: - return Variable(env_var) - - -def process_python_str(python_str: str) -> Value: - value = ast.literal_eval(python_str) - return Value(str(value)) - - -def _parse_marker_op(tokenizer: Tokenizer) -> Op: - """ - marker_op = IN | NOT IN | OP - """ - if tokenizer.check("IN"): - tokenizer.read() - return Op("in") - elif tokenizer.check("NOT"): - tokenizer.read() - tokenizer.expect("WS", expected="whitespace after 'not'") - tokenizer.expect("IN", expected="'in' after 'not'") - return Op("not in") - elif tokenizer.check("OP"): - return Op(tokenizer.read().text) - else: - return tokenizer.raise_syntax_error( - "Expected marker operator, one of " - "<=, <, !=, ==, >=, >, ~=, ===, in, not in" - ) diff --git a/tools/gyp/pylib/packaging/_structures.py b/tools/gyp/pylib/packaging/_structures.py deleted file mode 100644 index 90a6465f968..00000000000 --- a/tools/gyp/pylib/packaging/_structures.py +++ /dev/null @@ -1,61 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. - - -class InfinityType: - def __repr__(self) -> str: - return "Infinity" - - def __hash__(self) -> int: - return hash(repr(self)) - - def __lt__(self, other: object) -> bool: - return False - - def __le__(self, other: object) -> bool: - return False - - def __eq__(self, other: object) -> bool: - return isinstance(other, self.__class__) - - def __gt__(self, other: object) -> bool: - return True - - def __ge__(self, other: object) -> bool: - return True - - def __neg__(self: object) -> "NegativeInfinityType": - return NegativeInfinity - - -Infinity = InfinityType() - - -class NegativeInfinityType: - def __repr__(self) -> str: - return "-Infinity" - - def __hash__(self) -> int: - return hash(repr(self)) - - def __lt__(self, other: object) -> bool: - return True - - def __le__(self, other: object) -> bool: - return True - - def __eq__(self, other: object) -> bool: - return isinstance(other, self.__class__) - - def __gt__(self, other: object) -> bool: - return False - - def __ge__(self, other: object) -> bool: - return False - - def __neg__(self: object) -> InfinityType: - return Infinity - - -NegativeInfinity = NegativeInfinityType() diff --git a/tools/gyp/pylib/packaging/_tokenizer.py b/tools/gyp/pylib/packaging/_tokenizer.py deleted file mode 100644 index dd0d648d49a..00000000000 --- a/tools/gyp/pylib/packaging/_tokenizer.py +++ /dev/null @@ -1,192 +0,0 @@ -import contextlib -import re -from dataclasses import dataclass -from typing import Dict, Iterator, NoReturn, Optional, Tuple, Union - -from .specifiers import Specifier - - -@dataclass -class Token: - name: str - text: str - position: int - - -class ParserSyntaxError(Exception): - """The provided source text could not be parsed correctly.""" - - def __init__( - self, - message: str, - *, - source: str, - span: Tuple[int, int], - ) -> None: - self.span = span - self.message = message - self.source = source - - super().__init__() - - def __str__(self) -> str: - marker = " " * self.span[0] + "~" * (self.span[1] - self.span[0]) + "^" - return "\n ".join([self.message, self.source, marker]) - - -DEFAULT_RULES: "Dict[str, Union[str, re.Pattern[str]]]" = { - "LEFT_PARENTHESIS": r"\(", - "RIGHT_PARENTHESIS": r"\)", - "LEFT_BRACKET": r"\[", - "RIGHT_BRACKET": r"\]", - "SEMICOLON": r";", - "COMMA": r",", - "QUOTED_STRING": re.compile( - r""" - ( - ('[^']*') - | - ("[^"]*") - ) - """, - re.VERBOSE, - ), - "OP": r"(===|==|~=|!=|<=|>=|<|>)", - "BOOLOP": r"\b(or|and)\b", - "IN": r"\bin\b", - "NOT": r"\bnot\b", - "VARIABLE": re.compile( - r""" - \b( - python_version - |python_full_version - |os[._]name - |sys[._]platform - |platform_(release|system) - |platform[._](version|machine|python_implementation) - |python_implementation - |implementation_(name|version) - |extra - )\b - """, - re.VERBOSE, - ), - "SPECIFIER": re.compile( - Specifier._operator_regex_str + Specifier._version_regex_str, - re.VERBOSE | re.IGNORECASE, - ), - "AT": r"\@", - "URL": r"[^ \t]+", - "IDENTIFIER": r"\b[a-zA-Z0-9][a-zA-Z0-9._-]*\b", - "VERSION_PREFIX_TRAIL": r"\.\*", - "VERSION_LOCAL_LABEL_TRAIL": r"\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*", - "WS": r"[ \t]+", - "END": r"$", -} - - -class Tokenizer: - """Context-sensitive token parsing. - - Provides methods to examine the input stream to check whether the next token - matches. - """ - - def __init__( - self, - source: str, - *, - rules: "Dict[str, Union[str, re.Pattern[str]]]", - ) -> None: - self.source = source - self.rules: Dict[str, re.Pattern[str]] = { - name: re.compile(pattern) for name, pattern in rules.items() - } - self.next_token: Optional[Token] = None - self.position = 0 - - def consume(self, name: str) -> None: - """Move beyond provided token name, if at current position.""" - if self.check(name): - self.read() - - def check(self, name: str, *, peek: bool = False) -> bool: - """Check whether the next token has the provided name. - - By default, if the check succeeds, the token *must* be read before - another check. If `peek` is set to `True`, the token is not loaded and - would need to be checked again. - """ - assert ( - self.next_token is None - ), f"Cannot check for {name!r}, already have {self.next_token!r}" - assert name in self.rules, f"Unknown token name: {name!r}" - - expression = self.rules[name] - - match = expression.match(self.source, self.position) - if match is None: - return False - if not peek: - self.next_token = Token(name, match[0], self.position) - return True - - def expect(self, name: str, *, expected: str) -> Token: - """Expect a certain token name next, failing with a syntax error otherwise. - - The token is *not* read. - """ - if not self.check(name): - raise self.raise_syntax_error(f"Expected {expected}") - return self.read() - - def read(self) -> Token: - """Consume the next token and return it.""" - token = self.next_token - assert token is not None - - self.position += len(token.text) - self.next_token = None - - return token - - def raise_syntax_error( - self, - message: str, - *, - span_start: Optional[int] = None, - span_end: Optional[int] = None, - ) -> NoReturn: - """Raise ParserSyntaxError at the given position.""" - span = ( - self.position if span_start is None else span_start, - self.position if span_end is None else span_end, - ) - raise ParserSyntaxError( - message, - source=self.source, - span=span, - ) - - @contextlib.contextmanager - def enclosing_tokens( - self, open_token: str, close_token: str, *, around: str - ) -> Iterator[None]: - if self.check(open_token): - open_position = self.position - self.read() - else: - open_position = None - - yield - - if open_position is None: - return - - if not self.check(close_token): - self.raise_syntax_error( - f"Expected matching {close_token} for {open_token}, after {around}", - span_start=open_position, - ) - - self.read() diff --git a/tools/gyp/pylib/packaging/markers.py b/tools/gyp/pylib/packaging/markers.py deleted file mode 100644 index 7e4d150208e..00000000000 --- a/tools/gyp/pylib/packaging/markers.py +++ /dev/null @@ -1,251 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. - -import operator -import os -import platform -import sys -from typing import Any, Callable, Dict, List, Optional, Tuple, Union - -from ._parser import ( - MarkerAtom, - MarkerList, - Op, - Value, - Variable, - parse_marker as _parse_marker, -) -from ._tokenizer import ParserSyntaxError -from .specifiers import InvalidSpecifier, Specifier -from .utils import canonicalize_name - -__all__ = [ - "InvalidMarker", - "UndefinedComparison", - "UndefinedEnvironmentName", - "Marker", - "default_environment", -] - -Operator = Callable[[str, str], bool] - - -class InvalidMarker(ValueError): - """ - An invalid marker was found, users should refer to PEP 508. - """ - - -class UndefinedComparison(ValueError): - """ - An invalid operation was attempted on a value that doesn't support it. - """ - - -class UndefinedEnvironmentName(ValueError): - """ - A name was attempted to be used that does not exist inside of the - environment. - """ - - -def _normalize_extra_values(results: Any) -> Any: - """ - Normalize extra values. - """ - if isinstance(results[0], tuple): - lhs, op, rhs = results[0] - if isinstance(lhs, Variable) and lhs.value == "extra": - normalized_extra = canonicalize_name(rhs.value) - rhs = Value(normalized_extra) - elif isinstance(rhs, Variable) and rhs.value == "extra": - normalized_extra = canonicalize_name(lhs.value) - lhs = Value(normalized_extra) - results[0] = lhs, op, rhs - return results - - -def _format_marker( - marker: Union[List[str], MarkerAtom, str], first: Optional[bool] = True -) -> str: - - assert isinstance(marker, (list, tuple, str)) - - # Sometimes we have a structure like [[...]] which is a single item list - # where the single item is itself it's own list. In that case we want skip - # the rest of this function so that we don't get extraneous () on the - # outside. - if ( - isinstance(marker, list) - and len(marker) == 1 - and isinstance(marker[0], (list, tuple)) - ): - return _format_marker(marker[0]) - - if isinstance(marker, list): - inner = (_format_marker(m, first=False) for m in marker) - if first: - return " ".join(inner) - else: - return "(" + " ".join(inner) + ")" - elif isinstance(marker, tuple): - return " ".join([m.serialize() for m in marker]) - else: - return marker - - -_operators: Dict[str, Operator] = { - "in": lambda lhs, rhs: lhs in rhs, - "not in": lambda lhs, rhs: lhs not in rhs, - "<": operator.lt, - "<=": operator.le, - "==": operator.eq, - "!=": operator.ne, - ">=": operator.ge, - ">": operator.gt, -} - - -def _eval_op(lhs: str, op: Op, rhs: str) -> bool: - try: - spec = Specifier("".join([op.serialize(), rhs])) - except InvalidSpecifier: - pass - else: - return spec.contains(lhs, prereleases=True) - - oper: Optional[Operator] = _operators.get(op.serialize()) - if oper is None: - raise UndefinedComparison(f"Undefined {op!r} on {lhs!r} and {rhs!r}.") - - return oper(lhs, rhs) - - -def _normalize(*values: str, key: str) -> Tuple[str, ...]: - # PEP 685 – Comparison of extra names for optional distribution dependencies - # https://peps.python.org/pep-0685/ - # > When comparing extra names, tools MUST normalize the names being - # > compared using the semantics outlined in PEP 503 for names - if key == "extra": - return tuple(canonicalize_name(v) for v in values) - - # other environment markers don't have such standards - return values - - -def _evaluate_markers(markers: MarkerList, environment: Dict[str, str]) -> bool: - groups: List[List[bool]] = [[]] - - for marker in markers: - assert isinstance(marker, (list, tuple, str)) - - if isinstance(marker, list): - groups[-1].append(_evaluate_markers(marker, environment)) - elif isinstance(marker, tuple): - lhs, op, rhs = marker - - if isinstance(lhs, Variable): - environment_key = lhs.value - lhs_value = environment[environment_key] - rhs_value = rhs.value - else: - lhs_value = lhs.value - environment_key = rhs.value - rhs_value = environment[environment_key] - - lhs_value, rhs_value = _normalize(lhs_value, rhs_value, key=environment_key) - groups[-1].append(_eval_op(lhs_value, op, rhs_value)) - else: - assert marker in ["and", "or"] - if marker == "or": - groups.append([]) - - return any(all(item) for item in groups) - - -def format_full_version(info: "sys._version_info") -> str: - version = "{0.major}.{0.minor}.{0.micro}".format(info) - if (kind := info.releaselevel) != "final": - version += kind[0] + str(info.serial) - return version - - -def default_environment() -> Dict[str, str]: - iver = format_full_version(sys.implementation.version) - implementation_name = sys.implementation.name - return { - "implementation_name": implementation_name, - "implementation_version": iver, - "os_name": os.name, - "platform_machine": platform.machine(), - "platform_release": platform.release(), - "platform_system": platform.system(), - "platform_version": platform.version(), - "python_full_version": platform.python_version(), - "platform_python_implementation": platform.python_implementation(), - "python_version": ".".join(platform.python_version_tuple()[:2]), - "sys_platform": sys.platform, - } - - -class Marker: - def __init__(self, marker: str) -> None: - # Note: We create a Marker object without calling this constructor in - # packaging.requirements.Requirement. If any additional logic is - # added here, make sure to mirror/adapt Requirement. - try: - self._markers = _normalize_extra_values(_parse_marker(marker)) - # The attribute `_markers` can be described in terms of a recursive type: - # MarkerList = List[Union[Tuple[Node, ...], str, MarkerList]] - # - # For example, the following expression: - # python_version > "3.6" or (python_version == "3.6" and os_name == "unix") - # - # is parsed into: - # [ - # (, ')>, ), - # 'and', - # [ - # (, , ), - # 'or', - # (, , ) - # ] - # ] - except ParserSyntaxError as e: - raise InvalidMarker(str(e)) from e - - def __str__(self) -> str: - return _format_marker(self._markers) - - def __repr__(self) -> str: - return f"" - - def __hash__(self) -> int: - return hash((self.__class__.__name__, str(self))) - - def __eq__(self, other: Any) -> bool: - if not isinstance(other, Marker): - return NotImplemented - - return str(self) == str(other) - - def evaluate(self, environment: Optional[Dict[str, str]] = None) -> bool: - """Evaluate a marker. - - Return the boolean from evaluating the given marker against the - environment. environment is an optional argument to override all or - part of the determined environment. - - The environment is determined from the current Python process. - """ - current_environment = default_environment() - current_environment["extra"] = "" - if environment is not None: - current_environment.update(environment) - # The API used to allow setting extra to None. We need to handle this - # case for backwards compatibility. - if current_environment["extra"] is None: - current_environment["extra"] = "" - - return _evaluate_markers(self._markers, current_environment) diff --git a/tools/gyp/pylib/packaging/metadata.py b/tools/gyp/pylib/packaging/metadata.py deleted file mode 100644 index 38fa645b4c9..00000000000 --- a/tools/gyp/pylib/packaging/metadata.py +++ /dev/null @@ -1,807 +0,0 @@ -import email.feedparser -import email.header -import email.message -import email.parser -import email.policy -import sys -import typing -from typing import ( - Any, - Callable, - Dict, - Generic, - List, - Optional, - Tuple, - Type, - Union, - cast, -) - -from . import requirements, specifiers, utils, version as version_module - -T = typing.TypeVar("T") -from typing import Literal, TypedDict - -try: - ExceptionGroup # Added in Python 3.11+ -except NameError: # pragma: no cover - - class ExceptionGroup(Exception): # noqa: N818 - """A minimal implementation of :external:exc:`ExceptionGroup` from Python 3.11. - - If :external:exc:`ExceptionGroup` is already defined by Python itself, - that version is used instead. - """ - - message: str - exceptions: List[Exception] - - def __init__(self, message: str, exceptions: List[Exception]) -> None: - self.message = message - self.exceptions = exceptions - - def __repr__(self) -> str: - return f"{self.__class__.__name__}({self.message!r}, {self.exceptions!r})" - -else: # pragma: no cover - ExceptionGroup = ExceptionGroup - - -class InvalidMetadata(ValueError): - """A metadata field contains invalid data.""" - - field: str - """The name of the field that contains invalid data.""" - - def __init__(self, field: str, message: str) -> None: - self.field = field - super().__init__(message) - - -# The RawMetadata class attempts to make as few assumptions about the underlying -# serialization formats as possible. The idea is that as long as a serialization -# formats offer some very basic primitives in *some* way then we can support -# serializing to and from that format. -class RawMetadata(TypedDict, total=False): - """A dictionary of raw core metadata. - - Each field in core metadata maps to a key of this dictionary (when data is - provided). The key is lower-case and underscores are used instead of dashes - compared to the equivalent core metadata field. Any core metadata field that - can be specified multiple times or can hold multiple values in a single - field have a key with a plural name. See :class:`Metadata` whose attributes - match the keys of this dictionary. - - Core metadata fields that can be specified multiple times are stored as a - list or dict depending on which is appropriate for the field. Any fields - which hold multiple values in a single field are stored as a list. - - """ - - # Metadata 1.0 - PEP 241 - metadata_version: str - name: str - version: str - platforms: List[str] - summary: str - description: str - keywords: List[str] - home_page: str - author: str - author_email: str - license: str - - # Metadata 1.1 - PEP 314 - supported_platforms: List[str] - download_url: str - classifiers: List[str] - requires: List[str] - provides: List[str] - obsoletes: List[str] - - # Metadata 1.2 - PEP 345 - maintainer: str - maintainer_email: str - requires_dist: List[str] - provides_dist: List[str] - obsoletes_dist: List[str] - requires_python: str - requires_external: List[str] - project_urls: Dict[str, str] - - # Metadata 2.0 - # PEP 426 attempted to completely revamp the metadata format - # but got stuck without ever being able to build consensus on - # it and ultimately ended up withdrawn. - # - # However, a number of tools had started emitting METADATA with - # `2.0` Metadata-Version, so for historical reasons, this version - # was skipped. - - # Metadata 2.1 - PEP 566 - description_content_type: str - provides_extra: List[str] - - # Metadata 2.2 - PEP 643 - dynamic: List[str] - - # Metadata 2.3 - PEP 685 - # No new fields were added in PEP 685, just some edge case were - # tightened up to provide better interoperability. - - -_STRING_FIELDS = { - "author", - "author_email", - "description", - "description_content_type", - "download_url", - "home_page", - "license", - "maintainer", - "maintainer_email", - "metadata_version", - "name", - "requires_python", - "summary", - "version", -} - -_LIST_FIELDS = { - "classifiers", - "dynamic", - "obsoletes", - "obsoletes_dist", - "platforms", - "provides", - "provides_dist", - "provides_extra", - "requires", - "requires_dist", - "requires_external", - "supported_platforms", -} - -_DICT_FIELDS = { - "project_urls", -} - - -def _parse_keywords(data: str) -> List[str]: - """Split a string of comma-separate keyboards into a list of keywords.""" - return [k.strip() for k in data.split(",")] - - -def _parse_project_urls(data: List[str]) -> Dict[str, str]: - """Parse a list of label/URL string pairings separated by a comma.""" - urls = {} - for pair in data: - # Our logic is slightly tricky here as we want to try and do - # *something* reasonable with malformed data. - # - # The main thing that we have to worry about, is data that does - # not have a ',' at all to split the label from the Value. There - # isn't a singular right answer here, and we will fail validation - # later on (if the caller is validating) so it doesn't *really* - # matter, but since the missing value has to be an empty str - # and our return value is dict[str, str], if we let the key - # be the missing value, then they'd have multiple '' values that - # overwrite each other in a accumulating dict. - # - # The other potential issue is that it's possible to have the - # same label multiple times in the metadata, with no solid "right" - # answer with what to do in that case. As such, we'll do the only - # thing we can, which is treat the field as unparsable and add it - # to our list of unparsed fields. - parts = [p.strip() for p in pair.split(",", 1)] - parts.extend([""] * (max(0, 2 - len(parts)))) # Ensure 2 items - - # TODO: The spec doesn't say anything about if the keys should be - # considered case sensitive or not... logically they should - # be case-preserving and case-insensitive, but doing that - # would open up more cases where we might have duplicate - # entries. - label, url = parts - if label in urls: - # The label already exists in our set of urls, so this field - # is unparsable, and we can just add the whole thing to our - # unparsable data and stop processing it. - raise KeyError("duplicate labels in project urls") - urls[label] = url - - return urls - - -def _get_payload(msg: email.message.Message, source: Union[bytes, str]) -> str: - """Get the body of the message.""" - # If our source is a str, then our caller has managed encodings for us, - # and we don't need to deal with it. - if isinstance(source, str): - payload: str = msg.get_payload() - return payload - # If our source is a bytes, then we're managing the encoding and we need - # to deal with it. - else: - bpayload: bytes = msg.get_payload(decode=True) - try: - return bpayload.decode("utf8", "strict") - except UnicodeDecodeError: - raise ValueError("payload in an invalid encoding") - - -# The various parse_FORMAT functions here are intended to be as lenient as -# possible in their parsing, while still returning a correctly typed -# RawMetadata. -# -# To aid in this, we also generally want to do as little touching of the -# data as possible, except where there are possibly some historic holdovers -# that make valid data awkward to work with. -# -# While this is a lower level, intermediate format than our ``Metadata`` -# class, some light touch ups can make a massive difference in usability. - -# Map METADATA fields to RawMetadata. -_EMAIL_TO_RAW_MAPPING = { - "author": "author", - "author-email": "author_email", - "classifier": "classifiers", - "description": "description", - "description-content-type": "description_content_type", - "download-url": "download_url", - "dynamic": "dynamic", - "home-page": "home_page", - "keywords": "keywords", - "license": "license", - "maintainer": "maintainer", - "maintainer-email": "maintainer_email", - "metadata-version": "metadata_version", - "name": "name", - "obsoletes": "obsoletes", - "obsoletes-dist": "obsoletes_dist", - "platform": "platforms", - "project-url": "project_urls", - "provides": "provides", - "provides-dist": "provides_dist", - "provides-extra": "provides_extra", - "requires": "requires", - "requires-dist": "requires_dist", - "requires-external": "requires_external", - "requires-python": "requires_python", - "summary": "summary", - "supported-platform": "supported_platforms", - "version": "version", -} -_RAW_TO_EMAIL_MAPPING = {raw: email for email, raw in _EMAIL_TO_RAW_MAPPING.items()} - - -def parse_email(data: Union[bytes, str]) -> Tuple[RawMetadata, Dict[str, List[str]]]: - """Parse a distribution's metadata stored as email headers (e.g. from ``METADATA``). - - This function returns a two-item tuple of dicts. The first dict is of - recognized fields from the core metadata specification. Fields that can be - parsed and translated into Python's built-in types are converted - appropriately. All other fields are left as-is. Fields that are allowed to - appear multiple times are stored as lists. - - The second dict contains all other fields from the metadata. This includes - any unrecognized fields. It also includes any fields which are expected to - be parsed into a built-in type but were not formatted appropriately. Finally, - any fields that are expected to appear only once but are repeated are - included in this dict. - - """ - raw: Dict[str, Union[str, List[str], Dict[str, str]]] = {} - unparsed: Dict[str, List[str]] = {} - - if isinstance(data, str): - parsed = email.parser.Parser(policy=email.policy.compat32).parsestr(data) - else: - parsed = email.parser.BytesParser(policy=email.policy.compat32).parsebytes(data) - - # We have to wrap parsed.keys() in a set, because in the case of multiple - # values for a key (a list), the key will appear multiple times in the - # list of keys, but we're avoiding that by using get_all(). - for name in frozenset(parsed.keys()): - # Header names in RFC are case insensitive, so we'll normalize to all - # lower case to make comparisons easier. - name = name.lower() - - # We use get_all() here, even for fields that aren't multiple use, - # because otherwise someone could have e.g. two Name fields, and we - # would just silently ignore it rather than doing something about it. - headers = parsed.get_all(name) or [] - - # The way the email module works when parsing bytes is that it - # unconditionally decodes the bytes as ascii using the surrogateescape - # handler. When you pull that data back out (such as with get_all() ), - # it looks to see if the str has any surrogate escapes, and if it does - # it wraps it in a Header object instead of returning the string. - # - # As such, we'll look for those Header objects, and fix up the encoding. - value = [] - # Flag if we have run into any issues processing the headers, thus - # signalling that the data belongs in 'unparsed'. - valid_encoding = True - for h in headers: - # It's unclear if this can return more types than just a Header or - # a str, so we'll just assert here to make sure. - assert isinstance(h, (email.header.Header, str)) - - # If it's a header object, we need to do our little dance to get - # the real data out of it. In cases where there is invalid data - # we're going to end up with mojibake, but there's no obvious, good - # way around that without reimplementing parts of the Header object - # ourselves. - # - # That should be fine since, if mojibacked happens, this key is - # going into the unparsed dict anyways. - if isinstance(h, email.header.Header): - # The Header object stores it's data as chunks, and each chunk - # can be independently encoded, so we'll need to check each - # of them. - chunks: List[Tuple[bytes, Optional[str]]] = [] - for bin, encoding in email.header.decode_header(h): - try: - bin.decode("utf8", "strict") - except UnicodeDecodeError: - # Enable mojibake. - encoding = "latin1" - valid_encoding = False - else: - encoding = "utf8" - chunks.append((bin, encoding)) - - # Turn our chunks back into a Header object, then let that - # Header object do the right thing to turn them into a - # string for us. - value.append(str(email.header.make_header(chunks))) - # This is already a string, so just add it. - else: - value.append(h) - - # We've processed all of our values to get them into a list of str, - # but we may have mojibake data, in which case this is an unparsed - # field. - if not valid_encoding: - unparsed[name] = value - continue - - raw_name = _EMAIL_TO_RAW_MAPPING.get(name) - if raw_name is None: - # This is a bit of a weird situation, we've encountered a key that - # we don't know what it means, so we don't know whether it's meant - # to be a list or not. - # - # Since we can't really tell one way or another, we'll just leave it - # as a list, even though it may be a single item list, because that's - # what makes the most sense for email headers. - unparsed[name] = value - continue - - # If this is one of our string fields, then we'll check to see if our - # value is a list of a single item. If it is then we'll assume that - # it was emitted as a single string, and unwrap the str from inside - # the list. - # - # If it's any other kind of data, then we haven't the faintest clue - # what we should parse it as, and we have to just add it to our list - # of unparsed stuff. - if raw_name in _STRING_FIELDS and len(value) == 1: - raw[raw_name] = value[0] - # If this is one of our list of string fields, then we can just assign - # the value, since email *only* has strings, and our get_all() call - # above ensures that this is a list. - elif raw_name in _LIST_FIELDS: - raw[raw_name] = value - # Special Case: Keywords - # The keywords field is implemented in the metadata spec as a str, - # but it conceptually is a list of strings, and is serialized using - # ", ".join(keywords), so we'll do some light data massaging to turn - # this into what it logically is. - elif raw_name == "keywords" and len(value) == 1: - raw[raw_name] = _parse_keywords(value[0]) - # Special Case: Project-URL - # The project urls is implemented in the metadata spec as a list of - # specially-formatted strings that represent a key and a value, which - # is fundamentally a mapping, however the email format doesn't support - # mappings in a sane way, so it was crammed into a list of strings - # instead. - # - # We will do a little light data massaging to turn this into a map as - # it logically should be. - elif raw_name == "project_urls": - try: - raw[raw_name] = _parse_project_urls(value) - except KeyError: - unparsed[name] = value - # Nothing that we've done has managed to parse this, so it'll just - # throw it in our unparsable data and move on. - else: - unparsed[name] = value - - # We need to support getting the Description from the message payload in - # addition to getting it from the the headers. This does mean, though, there - # is the possibility of it being set both ways, in which case we put both - # in 'unparsed' since we don't know which is right. - try: - payload = _get_payload(parsed, data) - except ValueError: - unparsed.setdefault("description", []).append( - parsed.get_payload(decode=isinstance(data, bytes)) - ) - else: - if payload: - # Check to see if we've already got a description, if so then both - # it, and this body move to unparsable. - if "description" in raw: - description_header = cast(str, raw.pop("description")) - unparsed.setdefault("description", []).extend( - [description_header, payload] - ) - elif "description" in unparsed: - unparsed["description"].append(payload) - else: - raw["description"] = payload - - # We need to cast our `raw` to a metadata, because a TypedDict only support - # literal key names, but we're computing our key names on purpose, but the - # way this function is implemented, our `TypedDict` can only have valid key - # names. - return cast(RawMetadata, raw), unparsed - - -_NOT_FOUND = object() - - -# Keep the two values in sync. -_VALID_METADATA_VERSIONS = ["1.0", "1.1", "1.2", "2.1", "2.2", "2.3"] -_MetadataVersion = Literal["1.0", "1.1", "1.2", "2.1", "2.2", "2.3"] - -_REQUIRED_ATTRS = frozenset(["metadata_version", "name", "version"]) - - -class _Validator(Generic[T]): - """Validate a metadata field. - - All _process_*() methods correspond to a core metadata field. The method is - called with the field's raw value. If the raw value is valid it is returned - in its "enriched" form (e.g. ``version.Version`` for the ``Version`` field). - If the raw value is invalid, :exc:`InvalidMetadata` is raised (with a cause - as appropriate). - """ - - name: str - raw_name: str - added: _MetadataVersion - - def __init__( - self, - *, - added: _MetadataVersion = "1.0", - ) -> None: - self.added = added - - def __set_name__(self, _owner: "Metadata", name: str) -> None: - self.name = name - self.raw_name = _RAW_TO_EMAIL_MAPPING[name] - - def __get__(self, instance: "Metadata", _owner: Type["Metadata"]) -> T: - # With Python 3.8+, the caching can be replaced with functools.cached_property(). - # No need to check the cache as attribute lookup will resolve into the - # instance's __dict__ before __get__ is called. - cache = instance.__dict__ - value = instance._raw.get(self.name) - - # To make the _process_* methods easier, we'll check if the value is None - # and if this field is NOT a required attribute, and if both of those - # things are true, we'll skip the the converter. This will mean that the - # converters never have to deal with the None union. - if self.name in _REQUIRED_ATTRS or value is not None: - try: - converter: Callable[[Any], T] = getattr(self, f"_process_{self.name}") - except AttributeError: - pass - else: - value = converter(value) - - cache[self.name] = value - try: - del instance._raw[self.name] # type: ignore[misc] - except KeyError: - pass - - return cast(T, value) - - def _invalid_metadata( - self, msg: str, cause: Optional[Exception] = None - ) -> InvalidMetadata: - exc = InvalidMetadata( - self.raw_name, msg.format_map({"field": repr(self.raw_name)}) - ) - exc.__cause__ = cause - return exc - - def _process_metadata_version(self, value: str) -> _MetadataVersion: - # Implicitly makes Metadata-Version required. - if value not in _VALID_METADATA_VERSIONS: - raise self._invalid_metadata(f"{value!r} is not a valid metadata version") - return cast(_MetadataVersion, value) - - def _process_name(self, value: str) -> str: - if not value: - raise self._invalid_metadata("{field} is a required field") - # Validate the name as a side-effect. - try: - utils.canonicalize_name(value, validate=True) - except utils.InvalidName as exc: - raise self._invalid_metadata( - f"{value!r} is invalid for {{field}}", cause=exc - ) - else: - return value - - def _process_version(self, value: str) -> version_module.Version: - if not value: - raise self._invalid_metadata("{field} is a required field") - try: - return version_module.parse(value) - except version_module.InvalidVersion as exc: - raise self._invalid_metadata( - f"{value!r} is invalid for {{field}}", cause=exc - ) - - def _process_summary(self, value: str) -> str: - """Check the field contains no newlines.""" - if "\n" in value: - raise self._invalid_metadata("{field} must be a single line") - return value - - def _process_description_content_type(self, value: str) -> str: - content_types = {"text/plain", "text/x-rst", "text/markdown"} - message = email.message.EmailMessage() - message["content-type"] = value - - content_type, parameters = ( - # Defaults to `text/plain` if parsing failed. - message.get_content_type().lower(), - message["content-type"].params, - ) - # Check if content-type is valid or defaulted to `text/plain` and thus was - # not parseable. - if content_type not in content_types or content_type not in value.lower(): - raise self._invalid_metadata( - f"{{field}} must be one of {list(content_types)}, not {value!r}" - ) - - if (charset := parameters.get("charset", "UTF-8")) != "UTF-8": - raise self._invalid_metadata( - f"{{field}} can only specify the UTF-8 charset, not {list(charset)}" - ) - - markdown_variants = {"GFM", "CommonMark"} - variant = parameters.get("variant", "GFM") # Use an acceptable default. - if content_type == "text/markdown" and variant not in markdown_variants: - raise self._invalid_metadata( - f"valid Markdown variants for {{field}} are {list(markdown_variants)}, " - f"not {variant!r}", - ) - return value - - def _process_dynamic(self, value: List[str]) -> List[str]: - for dynamic_field in map(str.lower, value): - if dynamic_field in {"name", "version", "metadata-version"}: - raise self._invalid_metadata( - f"{value!r} is not allowed as a dynamic field" - ) - elif dynamic_field not in _EMAIL_TO_RAW_MAPPING: - raise self._invalid_metadata(f"{value!r} is not a valid dynamic field") - return list(map(str.lower, value)) - - def _process_provides_extra( - self, - value: List[str], - ) -> List[utils.NormalizedName]: - normalized_names = [] - try: - for name in value: - normalized_names.append(utils.canonicalize_name(name, validate=True)) - except utils.InvalidName as exc: - raise self._invalid_metadata( - f"{name!r} is invalid for {{field}}", cause=exc - ) - else: - return normalized_names - - def _process_requires_python(self, value: str) -> specifiers.SpecifierSet: - try: - return specifiers.SpecifierSet(value) - except specifiers.InvalidSpecifier as exc: - raise self._invalid_metadata( - f"{value!r} is invalid for {{field}}", cause=exc - ) - - def _process_requires_dist( - self, - value: List[str], - ) -> List[requirements.Requirement]: - reqs = [] - try: - for req in value: - reqs.append(requirements.Requirement(req)) - except requirements.InvalidRequirement as exc: - raise self._invalid_metadata(f"{req!r} is invalid for {{field}}", cause=exc) - else: - return reqs - - -class Metadata: - """Representation of distribution metadata. - - Compared to :class:`RawMetadata`, this class provides objects representing - metadata fields instead of only using built-in types. Any invalid metadata - will cause :exc:`InvalidMetadata` to be raised (with a - :py:attr:`~BaseException.__cause__` attribute as appropriate). - """ - - _raw: RawMetadata - - @classmethod - def from_raw(cls, data: RawMetadata, *, validate: bool = True) -> "Metadata": - """Create an instance from :class:`RawMetadata`. - - If *validate* is true, all metadata will be validated. All exceptions - related to validation will be gathered and raised as an :class:`ExceptionGroup`. - """ - ins = cls() - ins._raw = data.copy() # Mutations occur due to caching enriched values. - - if validate: - exceptions: List[Exception] = [] - try: - metadata_version = ins.metadata_version - metadata_age = _VALID_METADATA_VERSIONS.index(metadata_version) - except InvalidMetadata as metadata_version_exc: - exceptions.append(metadata_version_exc) - metadata_version = None - - # Make sure to check for the fields that are present, the required - # fields (so their absence can be reported). - fields_to_check = frozenset(ins._raw) | _REQUIRED_ATTRS - # Remove fields that have already been checked. - fields_to_check -= {"metadata_version"} - - for key in fields_to_check: - try: - if metadata_version: - # Can't use getattr() as that triggers descriptor protocol which - # will fail due to no value for the instance argument. - try: - field_metadata_version = cls.__dict__[key].added - except KeyError: - exc = InvalidMetadata(key, f"unrecognized field: {key!r}") - exceptions.append(exc) - continue - field_age = _VALID_METADATA_VERSIONS.index( - field_metadata_version - ) - if field_age > metadata_age: - field = _RAW_TO_EMAIL_MAPPING[key] - exc = InvalidMetadata( - field, - "{field} introduced in metadata version " - "{field_metadata_version}, not {metadata_version}", - ) - exceptions.append(exc) - continue - getattr(ins, key) - except InvalidMetadata as exc: - exceptions.append(exc) - - if exceptions: - raise ExceptionGroup("invalid metadata", exceptions) - - return ins - - @classmethod - def from_email( - cls, data: Union[bytes, str], *, validate: bool = True - ) -> "Metadata": - """Parse metadata from email headers. - - If *validate* is true, the metadata will be validated. All exceptions - related to validation will be gathered and raised as an :class:`ExceptionGroup`. - """ - raw, unparsed = parse_email(data) - - if validate: - exceptions: list[Exception] = [] - for unparsed_key in unparsed: - if unparsed_key in _EMAIL_TO_RAW_MAPPING: - message = f"{unparsed_key!r} has invalid data" - else: - message = f"unrecognized field: {unparsed_key!r}" - exceptions.append(InvalidMetadata(unparsed_key, message)) - - if exceptions: - raise ExceptionGroup("unparsed", exceptions) - - try: - return cls.from_raw(raw, validate=validate) - except ExceptionGroup as exc_group: - raise ExceptionGroup( - "invalid or unparsed metadata", exc_group.exceptions - ) from None - - metadata_version: _Validator[_MetadataVersion] = _Validator() - """:external:ref:`core-metadata-metadata-version` - (required; validated to be a valid metadata version)""" - name: _Validator[str] = _Validator() - """:external:ref:`core-metadata-name` - (required; validated using :func:`~packaging.utils.canonicalize_name` and its - *validate* parameter)""" - version: _Validator[version_module.Version] = _Validator() - """:external:ref:`core-metadata-version` (required)""" - dynamic: _Validator[Optional[List[str]]] = _Validator( - added="2.2", - ) - """:external:ref:`core-metadata-dynamic` - (validated against core metadata field names and lowercased)""" - platforms: _Validator[Optional[List[str]]] = _Validator() - """:external:ref:`core-metadata-platform`""" - supported_platforms: _Validator[Optional[List[str]]] = _Validator(added="1.1") - """:external:ref:`core-metadata-supported-platform`""" - summary: _Validator[Optional[str]] = _Validator() - """:external:ref:`core-metadata-summary` (validated to contain no newlines)""" - description: _Validator[Optional[str]] = _Validator() # TODO 2.1: can be in body - """:external:ref:`core-metadata-description`""" - description_content_type: _Validator[Optional[str]] = _Validator(added="2.1") - """:external:ref:`core-metadata-description-content-type` (validated)""" - keywords: _Validator[Optional[List[str]]] = _Validator() - """:external:ref:`core-metadata-keywords`""" - home_page: _Validator[Optional[str]] = _Validator() - """:external:ref:`core-metadata-home-page`""" - download_url: _Validator[Optional[str]] = _Validator(added="1.1") - """:external:ref:`core-metadata-download-url`""" - author: _Validator[Optional[str]] = _Validator() - """:external:ref:`core-metadata-author`""" - author_email: _Validator[Optional[str]] = _Validator() - """:external:ref:`core-metadata-author-email`""" - maintainer: _Validator[Optional[str]] = _Validator(added="1.2") - """:external:ref:`core-metadata-maintainer`""" - maintainer_email: _Validator[Optional[str]] = _Validator(added="1.2") - """:external:ref:`core-metadata-maintainer-email`""" - license: _Validator[Optional[str]] = _Validator() - """:external:ref:`core-metadata-license`""" - classifiers: _Validator[Optional[List[str]]] = _Validator(added="1.1") - """:external:ref:`core-metadata-classifier`""" - requires_dist: _Validator[Optional[List[requirements.Requirement]]] = _Validator( - added="1.2" - ) - """:external:ref:`core-metadata-requires-dist`""" - requires_python: _Validator[Optional[specifiers.SpecifierSet]] = _Validator( - added="1.2" - ) - """:external:ref:`core-metadata-requires-python`""" - # Because `Requires-External` allows for non-PEP 440 version specifiers, we - # don't do any processing on the values. - requires_external: _Validator[Optional[List[str]]] = _Validator(added="1.2") - """:external:ref:`core-metadata-requires-external`""" - project_urls: _Validator[Optional[Dict[str, str]]] = _Validator(added="1.2") - """:external:ref:`core-metadata-project-url`""" - # PEP 685 lets us raise an error if an extra doesn't pass `Name` validation - # regardless of metadata version. - provides_extra: _Validator[Optional[List[utils.NormalizedName]]] = _Validator( - added="2.1", - ) - """:external:ref:`core-metadata-provides-extra`""" - provides_dist: _Validator[Optional[List[str]]] = _Validator(added="1.2") - """:external:ref:`core-metadata-provides-dist`""" - obsoletes_dist: _Validator[Optional[List[str]]] = _Validator(added="1.2") - """:external:ref:`core-metadata-obsoletes-dist`""" - requires: _Validator[Optional[List[str]]] = _Validator(added="1.1") - """``Requires`` (deprecated)""" - provides: _Validator[Optional[List[str]]] = _Validator(added="1.1") - """``Provides`` (deprecated)""" - obsoletes: _Validator[Optional[List[str]]] = _Validator(added="1.1") - """``Obsoletes`` (deprecated)""" diff --git a/tools/gyp/pylib/packaging/py.typed b/tools/gyp/pylib/packaging/py.typed deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/tools/gyp/pylib/packaging/requirements.py b/tools/gyp/pylib/packaging/requirements.py deleted file mode 100644 index 0c00eba331b..00000000000 --- a/tools/gyp/pylib/packaging/requirements.py +++ /dev/null @@ -1,90 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. - -from typing import Any, Iterator, Optional, Set - -from ._parser import parse_requirement as _parse_requirement -from ._tokenizer import ParserSyntaxError -from .markers import Marker, _normalize_extra_values -from .specifiers import SpecifierSet -from .utils import canonicalize_name - - -class InvalidRequirement(ValueError): - """ - An invalid requirement was found, users should refer to PEP 508. - """ - - -class Requirement: - """Parse a requirement. - - Parse a given requirement string into its parts, such as name, specifier, - URL, and extras. Raises InvalidRequirement on a badly-formed requirement - string. - """ - - # TODO: Can we test whether something is contained within a requirement? - # If so how do we do that? Do we need to test against the _name_ of - # the thing as well as the version? What about the markers? - # TODO: Can we normalize the name and extra name? - - def __init__(self, requirement_string: str) -> None: - try: - parsed = _parse_requirement(requirement_string) - except ParserSyntaxError as e: - raise InvalidRequirement(str(e)) from e - - self.name: str = parsed.name - self.url: Optional[str] = parsed.url or None - self.extras: Set[str] = set(parsed.extras if parsed.extras else []) - self.specifier: SpecifierSet = SpecifierSet(parsed.specifier) - self.marker: Optional[Marker] = None - if parsed.marker is not None: - self.marker = Marker.__new__(Marker) - self.marker._markers = _normalize_extra_values(parsed.marker) - - def _iter_parts(self, name: str) -> Iterator[str]: - yield name - - if self.extras: - formatted_extras = ",".join(sorted(self.extras)) - yield f"[{formatted_extras}]" - - if self.specifier: - yield str(self.specifier) - - if self.url: - yield f"@ {self.url}" - if self.marker: - yield " " - - if self.marker: - yield f"; {self.marker}" - - def __str__(self) -> str: - return "".join(self._iter_parts(self.name)) - - def __repr__(self) -> str: - return f"" - - def __hash__(self) -> int: - return hash( - ( - self.__class__.__name__, - *self._iter_parts(canonicalize_name(self.name)), - ) - ) - - def __eq__(self, other: Any) -> bool: - if not isinstance(other, Requirement): - return NotImplemented - - return ( - canonicalize_name(self.name) == canonicalize_name(other.name) - and self.extras == other.extras - and self.specifier == other.specifier - and self.url == other.url - and self.marker == other.marker - ) diff --git a/tools/gyp/pylib/packaging/specifiers.py b/tools/gyp/pylib/packaging/specifiers.py deleted file mode 100644 index 94448327ae2..00000000000 --- a/tools/gyp/pylib/packaging/specifiers.py +++ /dev/null @@ -1,1030 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -""" -.. testsetup:: - - from packaging.specifiers import Specifier, SpecifierSet, InvalidSpecifier - from packaging.version import Version -""" - -import abc -import itertools -import re -from typing import ( - Callable, - Iterable, - Iterator, - List, - Optional, - Set, - Tuple, - TypeVar, - Union, -) - -from .utils import canonicalize_version -from .version import Version - -UnparsedVersion = Union[Version, str] -UnparsedVersionVar = TypeVar("UnparsedVersionVar", bound=UnparsedVersion) -CallableOperator = Callable[[Version, str], bool] - - -def _coerce_version(version: UnparsedVersion) -> Version: - if not isinstance(version, Version): - version = Version(version) - return version - - -class InvalidSpecifier(ValueError): - """ - Raised when attempting to create a :class:`Specifier` with a specifier - string that is invalid. - - >>> Specifier("lolwat") - Traceback (most recent call last): - ... - packaging.specifiers.InvalidSpecifier: Invalid specifier: 'lolwat' - """ - - -class BaseSpecifier(metaclass=abc.ABCMeta): - @abc.abstractmethod - def __str__(self) -> str: - """ - Returns the str representation of this Specifier-like object. This - should be representative of the Specifier itself. - """ - - @abc.abstractmethod - def __hash__(self) -> int: - """ - Returns a hash value for this Specifier-like object. - """ - - @abc.abstractmethod - def __eq__(self, other: object) -> bool: - """ - Returns a boolean representing whether or not the two Specifier-like - objects are equal. - - :param other: The other object to check against. - """ - - @property - @abc.abstractmethod - def prereleases(self) -> Optional[bool]: - """Whether or not pre-releases as a whole are allowed. - - This can be set to either ``True`` or ``False`` to explicitly enable or disable - prereleases or it can be set to ``None`` (the default) to use default semantics. - """ - - @prereleases.setter - def prereleases(self, value: bool) -> None: - """Setter for :attr:`prereleases`. - - :param value: The value to set. - """ - - @abc.abstractmethod - def contains(self, item: str, prereleases: Optional[bool] = None) -> bool: - """ - Determines if the given item is contained within this specifier. - """ - - @abc.abstractmethod - def filter( - self, iterable: Iterable[UnparsedVersionVar], prereleases: Optional[bool] = None - ) -> Iterator[UnparsedVersionVar]: - """ - Takes an iterable of items and filters them so that only items which - are contained within this specifier are allowed in it. - """ - - -class Specifier(BaseSpecifier): - """This class abstracts handling of version specifiers. - - .. tip:: - - It is generally not required to instantiate this manually. You should instead - prefer to work with :class:`SpecifierSet` instead, which can parse - comma-separated version specifiers (which is what package metadata contains). - """ - - _operator_regex_str = r""" - (?P(~=|==|!=|<=|>=|<|>|===)) - """ - _version_regex_str = r""" - (?P - (?: - # The identity operators allow for an escape hatch that will - # do an exact string match of the version you wish to install. - # This will not be parsed by PEP 440 and we cannot determine - # any semantic meaning from it. This operator is discouraged - # but included entirely as an escape hatch. - (?<====) # Only match for the identity operator - \s* - [^\s;)]* # The arbitrary version can be just about anything, - # we match everything except for whitespace, a - # semi-colon for marker support, and a closing paren - # since versions can be enclosed in them. - ) - | - (?: - # The (non)equality operators allow for wild card and local - # versions to be specified so we have to define these two - # operators separately to enable that. - (?<===|!=) # Only match for equals and not equals - - \s* - v? - (?:[0-9]+!)? # epoch - [0-9]+(?:\.[0-9]+)* # release - - # You cannot use a wild card and a pre-release, post-release, a dev or - # local version together so group them with a | and make them optional. - (?: - \.\* # Wild card syntax of .* - | - (?: # pre release - [-_\.]? - (alpha|beta|preview|pre|a|b|c|rc) - [-_\.]? - [0-9]* - )? - (?: # post release - (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) - )? - (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release - (?:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local - )? - ) - | - (?: - # The compatible operator requires at least two digits in the - # release segment. - (?<=~=) # Only match for the compatible operator - - \s* - v? - (?:[0-9]+!)? # epoch - [0-9]+(?:\.[0-9]+)+ # release (We have a + instead of a *) - (?: # pre release - [-_\.]? - (alpha|beta|preview|pre|a|b|c|rc) - [-_\.]? - [0-9]* - )? - (?: # post release - (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) - )? - (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release - ) - | - (?: - # All other operators only allow a sub set of what the - # (non)equality operators do. Specifically they do not allow - # local versions to be specified nor do they allow the prefix - # matching wild cards. - (?=": "greater_than_equal", - "<": "less_than", - ">": "greater_than", - "===": "arbitrary", - } - - def __init__(self, spec: str = "", prereleases: Optional[bool] = None) -> None: - """Initialize a Specifier instance. - - :param spec: - The string representation of a specifier which will be parsed and - normalized before use. - :param prereleases: - This tells the specifier if it should accept prerelease versions if - applicable or not. The default of ``None`` will autodetect it from the - given specifiers. - :raises InvalidSpecifier: - If the given specifier is invalid (i.e. bad syntax). - """ - match = self._regex.search(spec) - if not match: - raise InvalidSpecifier(f"Invalid specifier: '{spec}'") - - self._spec: Tuple[str, str] = ( - match.group("operator").strip(), - match.group("version").strip(), - ) - - # Store whether or not this Specifier should accept prereleases - self._prereleases = prereleases - - # https://github.com/python/mypy/pull/13475#pullrequestreview-1079784515 - @property # type: ignore[override] - def prereleases(self) -> bool: - # If there is an explicit prereleases set for this, then we'll just - # blindly use that. - if self._prereleases is not None: - return self._prereleases - - # Look at all of our specifiers and determine if they are inclusive - # operators, and if they are if they are including an explicit - # prerelease. - operator, version = self._spec - if operator in ["==", ">=", "<=", "~=", "==="]: - # The == specifier can include a trailing .*, if it does we - # want to remove before parsing. - if operator == "==" and version.endswith(".*"): - version = version[:-2] - - # Parse the version, and if it is a pre-release than this - # specifier allows pre-releases. - if Version(version).is_prerelease: - return True - - return False - - @prereleases.setter - def prereleases(self, value: bool) -> None: - self._prereleases = value - - @property - def operator(self) -> str: - """The operator of this specifier. - - >>> Specifier("==1.2.3").operator - '==' - """ - return self._spec[0] - - @property - def version(self) -> str: - """The version of this specifier. - - >>> Specifier("==1.2.3").version - '1.2.3' - """ - return self._spec[1] - - def __repr__(self) -> str: - """A representation of the Specifier that shows all internal state. - - >>> Specifier('>=1.0.0') - =1.0.0')> - >>> Specifier('>=1.0.0', prereleases=False) - =1.0.0', prereleases=False)> - >>> Specifier('>=1.0.0', prereleases=True) - =1.0.0', prereleases=True)> - """ - pre = ( - f", prereleases={self.prereleases!r}" - if self._prereleases is not None - else "" - ) - - return f"<{self.__class__.__name__}({str(self)!r}{pre})>" - - def __str__(self) -> str: - """A string representation of the Specifier that can be round-tripped. - - >>> str(Specifier('>=1.0.0')) - '>=1.0.0' - >>> str(Specifier('>=1.0.0', prereleases=False)) - '>=1.0.0' - """ - return "{}{}".format(*self._spec) - - @property - def _canonical_spec(self) -> Tuple[str, str]: - canonical_version = canonicalize_version( - self._spec[1], - strip_trailing_zero=(self._spec[0] != "~="), - ) - return self._spec[0], canonical_version - - def __hash__(self) -> int: - return hash(self._canonical_spec) - - def __eq__(self, other: object) -> bool: - """Whether or not the two Specifier-like objects are equal. - - :param other: The other object to check against. - - The value of :attr:`prereleases` is ignored. - - >>> Specifier("==1.2.3") == Specifier("== 1.2.3.0") - True - >>> (Specifier("==1.2.3", prereleases=False) == - ... Specifier("==1.2.3", prereleases=True)) - True - >>> Specifier("==1.2.3") == "==1.2.3" - True - >>> Specifier("==1.2.3") == Specifier("==1.2.4") - False - >>> Specifier("==1.2.3") == Specifier("~=1.2.3") - False - """ - if isinstance(other, str): - try: - other = self.__class__(str(other)) - except InvalidSpecifier: - return NotImplemented - elif not isinstance(other, self.__class__): - return NotImplemented - - return self._canonical_spec == other._canonical_spec - - def _get_operator(self, op: str) -> CallableOperator: - operator_callable: CallableOperator = getattr( - self, f"_compare_{self._operators[op]}" - ) - return operator_callable - - def _compare_compatible(self, prospective: Version, spec: str) -> bool: - - # Compatible releases have an equivalent combination of >= and ==. That - # is that ~=2.2 is equivalent to >=2.2,==2.*. This allows us to - # implement this in terms of the other specifiers instead of - # implementing it ourselves. The only thing we need to do is construct - # the other specifiers. - - # We want everything but the last item in the version, but we want to - # ignore suffix segments. - prefix = _version_join( - list(itertools.takewhile(_is_not_suffix, _version_split(spec)))[:-1] - ) - - # Add the prefix notation to the end of our string - prefix += ".*" - - return self._get_operator(">=")(prospective, spec) and self._get_operator("==")( - prospective, prefix - ) - - def _compare_equal(self, prospective: Version, spec: str) -> bool: - - # We need special logic to handle prefix matching - if spec.endswith(".*"): - # In the case of prefix matching we want to ignore local segment. - normalized_prospective = canonicalize_version( - prospective.public, strip_trailing_zero=False - ) - # Get the normalized version string ignoring the trailing .* - normalized_spec = canonicalize_version(spec[:-2], strip_trailing_zero=False) - # Split the spec out by bangs and dots, and pretend that there is - # an implicit dot in between a release segment and a pre-release segment. - split_spec = _version_split(normalized_spec) - - # Split the prospective version out by bangs and dots, and pretend - # that there is an implicit dot in between a release segment and - # a pre-release segment. - split_prospective = _version_split(normalized_prospective) - - # 0-pad the prospective version before shortening it to get the correct - # shortened version. - padded_prospective, _ = _pad_version(split_prospective, split_spec) - - # Shorten the prospective version to be the same length as the spec - # so that we can determine if the specifier is a prefix of the - # prospective version or not. - shortened_prospective = padded_prospective[: len(split_spec)] - - return shortened_prospective == split_spec - else: - # Convert our spec string into a Version - spec_version = Version(spec) - - # If the specifier does not have a local segment, then we want to - # act as if the prospective version also does not have a local - # segment. - if not spec_version.local: - prospective = Version(prospective.public) - - return prospective == spec_version - - def _compare_not_equal(self, prospective: Version, spec: str) -> bool: - return not self._compare_equal(prospective, spec) - - def _compare_less_than_equal(self, prospective: Version, spec: str) -> bool: - - # NB: Local version identifiers are NOT permitted in the version - # specifier, so local version labels can be universally removed from - # the prospective version. - return Version(prospective.public) <= Version(spec) - - def _compare_greater_than_equal(self, prospective: Version, spec: str) -> bool: - - # NB: Local version identifiers are NOT permitted in the version - # specifier, so local version labels can be universally removed from - # the prospective version. - return Version(prospective.public) >= Version(spec) - - def _compare_less_than(self, prospective: Version, spec_str: str) -> bool: - - # Convert our spec to a Version instance, since we'll want to work with - # it as a version. - spec = Version(spec_str) - - # Check to see if the prospective version is less than the spec - # version. If it's not we can short circuit and just return False now - # instead of doing extra unneeded work. - if not prospective < spec: - return False - - # This special case is here so that, unless the specifier itself - # includes is a pre-release version, that we do not accept pre-release - # versions for the version mentioned in the specifier (e.g. <3.1 should - # not match 3.1.dev0, but should match 3.0.dev0). - if not spec.is_prerelease and prospective.is_prerelease: - if Version(prospective.base_version) == Version(spec.base_version): - return False - - # If we've gotten to here, it means that prospective version is both - # less than the spec version *and* it's not a pre-release of the same - # version in the spec. - return True - - def _compare_greater_than(self, prospective: Version, spec_str: str) -> bool: - - # Convert our spec to a Version instance, since we'll want to work with - # it as a version. - spec = Version(spec_str) - - # Check to see if the prospective version is greater than the spec - # version. If it's not we can short circuit and just return False now - # instead of doing extra unneeded work. - if not prospective > spec: - return False - - # This special case is here so that, unless the specifier itself - # includes is a post-release version, that we do not accept - # post-release versions for the version mentioned in the specifier - # (e.g. >3.1 should not match 3.0.post0, but should match 3.2.post0). - if not spec.is_postrelease and prospective.is_postrelease: - if Version(prospective.base_version) == Version(spec.base_version): - return False - - # Ensure that we do not allow a local version of the version mentioned - # in the specifier, which is technically greater than, to match. - if prospective.local is not None: - if Version(prospective.base_version) == Version(spec.base_version): - return False - - # If we've gotten to here, it means that prospective version is both - # greater than the spec version *and* it's not a pre-release of the - # same version in the spec. - return True - - def _compare_arbitrary(self, prospective: Version, spec: str) -> bool: - return str(prospective).lower() == str(spec).lower() - - def __contains__(self, item: Union[str, Version]) -> bool: - """Return whether or not the item is contained in this specifier. - - :param item: The item to check for. - - This is used for the ``in`` operator and behaves the same as - :meth:`contains` with no ``prereleases`` argument passed. - - >>> "1.2.3" in Specifier(">=1.2.3") - True - >>> Version("1.2.3") in Specifier(">=1.2.3") - True - >>> "1.0.0" in Specifier(">=1.2.3") - False - >>> "1.3.0a1" in Specifier(">=1.2.3") - False - >>> "1.3.0a1" in Specifier(">=1.2.3", prereleases=True) - True - """ - return self.contains(item) - - def contains( - self, item: UnparsedVersion, prereleases: Optional[bool] = None - ) -> bool: - """Return whether or not the item is contained in this specifier. - - :param item: - The item to check for, which can be a version string or a - :class:`Version` instance. - :param prereleases: - Whether or not to match prereleases with this Specifier. If set to - ``None`` (the default), it uses :attr:`prereleases` to determine - whether or not prereleases are allowed. - - >>> Specifier(">=1.2.3").contains("1.2.3") - True - >>> Specifier(">=1.2.3").contains(Version("1.2.3")) - True - >>> Specifier(">=1.2.3").contains("1.0.0") - False - >>> Specifier(">=1.2.3").contains("1.3.0a1") - False - >>> Specifier(">=1.2.3", prereleases=True).contains("1.3.0a1") - True - >>> Specifier(">=1.2.3").contains("1.3.0a1", prereleases=True) - True - """ - - # Determine if prereleases are to be allowed or not. - if prereleases is None: - prereleases = self.prereleases - - # Normalize item to a Version, this allows us to have a shortcut for - # "2.0" in Specifier(">=2") - normalized_item = _coerce_version(item) - - # Determine if we should be supporting prereleases in this specifier - # or not, if we do not support prereleases than we can short circuit - # logic if this version is a prereleases. - if normalized_item.is_prerelease and not prereleases: - return False - - # Actually do the comparison to determine if this item is contained - # within this Specifier or not. - operator_callable: CallableOperator = self._get_operator(self.operator) - return operator_callable(normalized_item, self.version) - - def filter( - self, iterable: Iterable[UnparsedVersionVar], prereleases: Optional[bool] = None - ) -> Iterator[UnparsedVersionVar]: - """Filter items in the given iterable, that match the specifier. - - :param iterable: - An iterable that can contain version strings and :class:`Version` instances. - The items in the iterable will be filtered according to the specifier. - :param prereleases: - Whether or not to allow prereleases in the returned iterator. If set to - ``None`` (the default), it will be intelligently decide whether to allow - prereleases or not (based on the :attr:`prereleases` attribute, and - whether the only versions matching are prereleases). - - This method is smarter than just ``filter(Specifier().contains, [...])`` - because it implements the rule from :pep:`440` that a prerelease item - SHOULD be accepted if no other versions match the given specifier. - - >>> list(Specifier(">=1.2.3").filter(["1.2", "1.3", "1.5a1"])) - ['1.3'] - >>> list(Specifier(">=1.2.3").filter(["1.2", "1.2.3", "1.3", Version("1.4")])) - ['1.2.3', '1.3', ] - >>> list(Specifier(">=1.2.3").filter(["1.2", "1.5a1"])) - ['1.5a1'] - >>> list(Specifier(">=1.2.3").filter(["1.3", "1.5a1"], prereleases=True)) - ['1.3', '1.5a1'] - >>> list(Specifier(">=1.2.3", prereleases=True).filter(["1.3", "1.5a1"])) - ['1.3', '1.5a1'] - """ - - yielded = False - found_prereleases = [] - - kw = {"prereleases": prereleases if prereleases is not None else True} - - # Attempt to iterate over all the values in the iterable and if any of - # them match, yield them. - for version in iterable: - parsed_version = _coerce_version(version) - - if self.contains(parsed_version, **kw): - # If our version is a prerelease, and we were not set to allow - # prereleases, then we'll store it for later in case nothing - # else matches this specifier. - if parsed_version.is_prerelease and not ( - prereleases or self.prereleases - ): - found_prereleases.append(version) - # Either this is not a prerelease, or we should have been - # accepting prereleases from the beginning. - else: - yielded = True - yield version - - # Now that we've iterated over everything, determine if we've yielded - # any values, and if we have not and we have any prereleases stored up - # then we will go ahead and yield the prereleases. - if not yielded and found_prereleases: - for version in found_prereleases: - yield version - - -_prefix_regex = re.compile(r"^([0-9]+)((?:a|b|c|rc)[0-9]+)$") - - -def _version_split(version: str) -> List[str]: - """Split version into components. - - The split components are intended for version comparison. The logic does - not attempt to retain the original version string, so joining the - components back with :func:`_version_join` may not produce the original - version string. - """ - result: List[str] = [] - - epoch, _, rest = version.rpartition("!") - result.append(epoch or "0") - - for item in rest.split("."): - match = _prefix_regex.search(item) - if match: - result.extend(match.groups()) - else: - result.append(item) - return result - - -def _version_join(components: List[str]) -> str: - """Join split version components into a version string. - - This function assumes the input came from :func:`_version_split`, where the - first component must be the epoch (either empty or numeric), and all other - components numeric. - """ - epoch, *rest = components - return f"{epoch}!{'.'.join(rest)}" - - -def _is_not_suffix(segment: str) -> bool: - return not any( - segment.startswith(prefix) for prefix in ("dev", "a", "b", "rc", "post") - ) - - -def _pad_version(left: List[str], right: List[str]) -> Tuple[List[str], List[str]]: - left_split, right_split = [], [] - - # Get the release segment of our versions - left_split.append(list(itertools.takewhile(lambda x: x.isdigit(), left))) - right_split.append(list(itertools.takewhile(lambda x: x.isdigit(), right))) - - # Get the rest of our versions - left_split.append(left[len(left_split[0]) :]) - right_split.append(right[len(right_split[0]) :]) - - # Insert our padding - left_split.insert(1, ["0"] * max(0, len(right_split[0]) - len(left_split[0]))) - right_split.insert(1, ["0"] * max(0, len(left_split[0]) - len(right_split[0]))) - - return (list(itertools.chain(*left_split)), list(itertools.chain(*right_split))) - - -class SpecifierSet(BaseSpecifier): - """This class abstracts handling of a set of version specifiers. - - It can be passed a single specifier (``>=3.0``), a comma-separated list of - specifiers (``>=3.0,!=3.1``), or no specifier at all. - """ - - def __init__( - self, specifiers: str = "", prereleases: Optional[bool] = None - ) -> None: - """Initialize a SpecifierSet instance. - - :param specifiers: - The string representation of a specifier or a comma-separated list of - specifiers which will be parsed and normalized before use. - :param prereleases: - This tells the SpecifierSet if it should accept prerelease versions if - applicable or not. The default of ``None`` will autodetect it from the - given specifiers. - - :raises InvalidSpecifier: - If the given ``specifiers`` are not parseable than this exception will be - raised. - """ - - # Split on `,` to break each individual specifier into it's own item, and - # strip each item to remove leading/trailing whitespace. - split_specifiers = [s.strip() for s in specifiers.split(",") if s.strip()] - - # Parsed each individual specifier, attempting first to make it a - # Specifier. - parsed: Set[Specifier] = set() - for specifier in split_specifiers: - parsed.add(Specifier(specifier)) - - # Turn our parsed specifiers into a frozen set and save them for later. - self._specs = frozenset(parsed) - - # Store our prereleases value so we can use it later to determine if - # we accept prereleases or not. - self._prereleases = prereleases - - @property - def prereleases(self) -> Optional[bool]: - # If we have been given an explicit prerelease modifier, then we'll - # pass that through here. - if self._prereleases is not None: - return self._prereleases - - # If we don't have any specifiers, and we don't have a forced value, - # then we'll just return None since we don't know if this should have - # pre-releases or not. - if not self._specs: - return None - - # Otherwise we'll see if any of the given specifiers accept - # prereleases, if any of them do we'll return True, otherwise False. - return any(s.prereleases for s in self._specs) - - @prereleases.setter - def prereleases(self, value: bool) -> None: - self._prereleases = value - - def __repr__(self) -> str: - """A representation of the specifier set that shows all internal state. - - Note that the ordering of the individual specifiers within the set may not - match the input string. - - >>> SpecifierSet('>=1.0.0,!=2.0.0') - =1.0.0')> - >>> SpecifierSet('>=1.0.0,!=2.0.0', prereleases=False) - =1.0.0', prereleases=False)> - >>> SpecifierSet('>=1.0.0,!=2.0.0', prereleases=True) - =1.0.0', prereleases=True)> - """ - pre = ( - f", prereleases={self.prereleases!r}" - if self._prereleases is not None - else "" - ) - - return f"" - - def __str__(self) -> str: - """A string representation of the specifier set that can be round-tripped. - - Note that the ordering of the individual specifiers within the set may not - match the input string. - - >>> str(SpecifierSet(">=1.0.0,!=1.0.1")) - '!=1.0.1,>=1.0.0' - >>> str(SpecifierSet(">=1.0.0,!=1.0.1", prereleases=False)) - '!=1.0.1,>=1.0.0' - """ - return ",".join(sorted(str(s) for s in self._specs)) - - def __hash__(self) -> int: - return hash(self._specs) - - def __and__(self, other: Union["SpecifierSet", str]) -> "SpecifierSet": - """Return a SpecifierSet which is a combination of the two sets. - - :param other: The other object to combine with. - - >>> SpecifierSet(">=1.0.0,!=1.0.1") & '<=2.0.0,!=2.0.1' - =1.0.0')> - >>> SpecifierSet(">=1.0.0,!=1.0.1") & SpecifierSet('<=2.0.0,!=2.0.1') - =1.0.0')> - """ - if isinstance(other, str): - other = SpecifierSet(other) - elif not isinstance(other, SpecifierSet): - return NotImplemented - - specifier = SpecifierSet() - specifier._specs = frozenset(self._specs | other._specs) - - if self._prereleases is None and other._prereleases is not None: - specifier._prereleases = other._prereleases - elif self._prereleases is not None and other._prereleases is None: - specifier._prereleases = self._prereleases - elif self._prereleases == other._prereleases: - specifier._prereleases = self._prereleases - else: - raise ValueError( - "Cannot combine SpecifierSets with True and False prerelease " - "overrides." - ) - - return specifier - - def __eq__(self, other: object) -> bool: - """Whether or not the two SpecifierSet-like objects are equal. - - :param other: The other object to check against. - - The value of :attr:`prereleases` is ignored. - - >>> SpecifierSet(">=1.0.0,!=1.0.1") == SpecifierSet(">=1.0.0,!=1.0.1") - True - >>> (SpecifierSet(">=1.0.0,!=1.0.1", prereleases=False) == - ... SpecifierSet(">=1.0.0,!=1.0.1", prereleases=True)) - True - >>> SpecifierSet(">=1.0.0,!=1.0.1") == ">=1.0.0,!=1.0.1" - True - >>> SpecifierSet(">=1.0.0,!=1.0.1") == SpecifierSet(">=1.0.0") - False - >>> SpecifierSet(">=1.0.0,!=1.0.1") == SpecifierSet(">=1.0.0,!=1.0.2") - False - """ - if isinstance(other, (str, Specifier)): - other = SpecifierSet(str(other)) - elif not isinstance(other, SpecifierSet): - return NotImplemented - - return self._specs == other._specs - - def __len__(self) -> int: - """Returns the number of specifiers in this specifier set.""" - return len(self._specs) - - def __iter__(self) -> Iterator[Specifier]: - """ - Returns an iterator over all the underlying :class:`Specifier` instances - in this specifier set. - - >>> sorted(SpecifierSet(">=1.0.0,!=1.0.1"), key=str) - [, =1.0.0')>] - """ - return iter(self._specs) - - def __contains__(self, item: UnparsedVersion) -> bool: - """Return whether or not the item is contained in this specifier. - - :param item: The item to check for. - - This is used for the ``in`` operator and behaves the same as - :meth:`contains` with no ``prereleases`` argument passed. - - >>> "1.2.3" in SpecifierSet(">=1.0.0,!=1.0.1") - True - >>> Version("1.2.3") in SpecifierSet(">=1.0.0,!=1.0.1") - True - >>> "1.0.1" in SpecifierSet(">=1.0.0,!=1.0.1") - False - >>> "1.3.0a1" in SpecifierSet(">=1.0.0,!=1.0.1") - False - >>> "1.3.0a1" in SpecifierSet(">=1.0.0,!=1.0.1", prereleases=True) - True - """ - return self.contains(item) - - def contains( - self, - item: UnparsedVersion, - prereleases: Optional[bool] = None, - installed: Optional[bool] = None, - ) -> bool: - """Return whether or not the item is contained in this SpecifierSet. - - :param item: - The item to check for, which can be a version string or a - :class:`Version` instance. - :param prereleases: - Whether or not to match prereleases with this SpecifierSet. If set to - ``None`` (the default), it uses :attr:`prereleases` to determine - whether or not prereleases are allowed. - - >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.2.3") - True - >>> SpecifierSet(">=1.0.0,!=1.0.1").contains(Version("1.2.3")) - True - >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.0.1") - False - >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.3.0a1") - False - >>> SpecifierSet(">=1.0.0,!=1.0.1", prereleases=True).contains("1.3.0a1") - True - >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.3.0a1", prereleases=True) - True - """ - # Ensure that our item is a Version instance. - if not isinstance(item, Version): - item = Version(item) - - # Determine if we're forcing a prerelease or not, if we're not forcing - # one for this particular filter call, then we'll use whatever the - # SpecifierSet thinks for whether or not we should support prereleases. - if prereleases is None: - prereleases = self.prereleases - - # We can determine if we're going to allow pre-releases by looking to - # see if any of the underlying items supports them. If none of them do - # and this item is a pre-release then we do not allow it and we can - # short circuit that here. - # Note: This means that 1.0.dev1 would not be contained in something - # like >=1.0.devabc however it would be in >=1.0.debabc,>0.0.dev0 - if not prereleases and item.is_prerelease: - return False - - if installed and item.is_prerelease: - item = Version(item.base_version) - - # We simply dispatch to the underlying specs here to make sure that the - # given version is contained within all of them. - # Note: This use of all() here means that an empty set of specifiers - # will always return True, this is an explicit design decision. - return all(s.contains(item, prereleases=prereleases) for s in self._specs) - - def filter( - self, iterable: Iterable[UnparsedVersionVar], prereleases: Optional[bool] = None - ) -> Iterator[UnparsedVersionVar]: - """Filter items in the given iterable, that match the specifiers in this set. - - :param iterable: - An iterable that can contain version strings and :class:`Version` instances. - The items in the iterable will be filtered according to the specifier. - :param prereleases: - Whether or not to allow prereleases in the returned iterator. If set to - ``None`` (the default), it will be intelligently decide whether to allow - prereleases or not (based on the :attr:`prereleases` attribute, and - whether the only versions matching are prereleases). - - This method is smarter than just ``filter(SpecifierSet(...).contains, [...])`` - because it implements the rule from :pep:`440` that a prerelease item - SHOULD be accepted if no other versions match the given specifier. - - >>> list(SpecifierSet(">=1.2.3").filter(["1.2", "1.3", "1.5a1"])) - ['1.3'] - >>> list(SpecifierSet(">=1.2.3").filter(["1.2", "1.3", Version("1.4")])) - ['1.3', ] - >>> list(SpecifierSet(">=1.2.3").filter(["1.2", "1.5a1"])) - [] - >>> list(SpecifierSet(">=1.2.3").filter(["1.3", "1.5a1"], prereleases=True)) - ['1.3', '1.5a1'] - >>> list(SpecifierSet(">=1.2.3", prereleases=True).filter(["1.3", "1.5a1"])) - ['1.3', '1.5a1'] - - An "empty" SpecifierSet will filter items based on the presence of prerelease - versions in the set. - - >>> list(SpecifierSet("").filter(["1.3", "1.5a1"])) - ['1.3'] - >>> list(SpecifierSet("").filter(["1.5a1"])) - ['1.5a1'] - >>> list(SpecifierSet("", prereleases=True).filter(["1.3", "1.5a1"])) - ['1.3', '1.5a1'] - >>> list(SpecifierSet("").filter(["1.3", "1.5a1"], prereleases=True)) - ['1.3', '1.5a1'] - """ - # Determine if we're forcing a prerelease or not, if we're not forcing - # one for this particular filter call, then we'll use whatever the - # SpecifierSet thinks for whether or not we should support prereleases. - if prereleases is None: - prereleases = self.prereleases - - # If we have any specifiers, then we want to wrap our iterable in the - # filter method for each one, this will act as a logical AND amongst - # each specifier. - if self._specs: - for spec in self._specs: - iterable = spec.filter(iterable, prereleases=bool(prereleases)) - return iter(iterable) - # If we do not have any specifiers, then we need to have a rough filter - # which will filter out any pre-releases, unless there are no final - # releases. - else: - filtered: List[UnparsedVersionVar] = [] - found_prereleases: List[UnparsedVersionVar] = [] - - for item in iterable: - parsed_version = _coerce_version(item) - - # Store any item which is a pre-release for later unless we've - # already found a final version or we are accepting prereleases - if parsed_version.is_prerelease and not prereleases: - if not filtered: - found_prereleases.append(item) - else: - filtered.append(item) - - # If we've found no items except for pre-releases, then we'll go - # ahead and use the pre-releases - if not filtered and found_prereleases and prereleases is None: - return iter(found_prereleases) - - return iter(filtered) diff --git a/tools/gyp/pylib/packaging/tags.py b/tools/gyp/pylib/packaging/tags.py deleted file mode 100644 index f1da2b96d39..00000000000 --- a/tools/gyp/pylib/packaging/tags.py +++ /dev/null @@ -1,541 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. - -import logging -import platform -import struct -import subprocess -import sys -import sysconfig -from importlib.machinery import EXTENSION_SUFFIXES -from typing import ( - Dict, - FrozenSet, - Iterable, - Iterator, - List, - Optional, - Sequence, - Tuple, - Union, - cast, -) - -from . import _manylinux, _musllinux - -logger = logging.getLogger(__name__) - -PythonVersion = Sequence[int] -MacVersion = Tuple[int, int] - -INTERPRETER_SHORT_NAMES: Dict[str, str] = { - "python": "py", # Generic. - "cpython": "cp", - "pypy": "pp", - "ironpython": "ip", - "jython": "jy", -} - - -_32_BIT_INTERPRETER = struct.calcsize("P") == 4 - - -class Tag: - """ - A representation of the tag triple for a wheel. - - Instances are considered immutable and thus are hashable. Equality checking - is also supported. - """ - - __slots__ = ["_interpreter", "_abi", "_platform", "_hash"] - - def __init__(self, interpreter: str, abi: str, platform: str) -> None: - self._interpreter = interpreter.lower() - self._abi = abi.lower() - self._platform = platform.lower() - # The __hash__ of every single element in a Set[Tag] will be evaluated each time - # that a set calls its `.disjoint()` method, which may be called hundreds of - # times when scanning a page of links for packages with tags matching that - # Set[Tag]. Pre-computing the value here produces significant speedups for - # downstream consumers. - self._hash = hash((self._interpreter, self._abi, self._platform)) - - @property - def interpreter(self) -> str: - return self._interpreter - - @property - def abi(self) -> str: - return self._abi - - @property - def platform(self) -> str: - return self._platform - - def __eq__(self, other: object) -> bool: - if not isinstance(other, Tag): - return NotImplemented - - return ( - (self._hash == other._hash) # Short-circuit ASAP for perf reasons. - and (self._platform == other._platform) - and (self._abi == other._abi) - and (self._interpreter == other._interpreter) - ) - - def __hash__(self) -> int: - return self._hash - - def __str__(self) -> str: - return f"{self._interpreter}-{self._abi}-{self._platform}" - - def __repr__(self) -> str: - return f"<{self} @ {id(self)}>" - - -def parse_tag(tag: str) -> FrozenSet[Tag]: - """ - Parses the provided tag (e.g. `py3-none-any`) into a frozenset of Tag instances. - - Returning a set is required due to the possibility that the tag is a - compressed tag set. - """ - tags = set() - interpreters, abis, platforms = tag.split("-") - for interpreter in interpreters.split("."): - for abi in abis.split("."): - for platform_ in platforms.split("."): - tags.add(Tag(interpreter, abi, platform_)) - return frozenset(tags) - - -def _get_config_var(name: str, warn: bool = False) -> Union[int, str, None]: - value: Union[int, str, None] = sysconfig.get_config_var(name) - if value is None and warn: - logger.debug( - "Config variable '%s' is unset, Python ABI tag may be incorrect", name - ) - return value - - -def _normalize_string(string: str) -> str: - return string.replace(".", "_").replace("-", "_").replace(" ", "_") - - -def _abi3_applies(python_version: PythonVersion) -> bool: - """ - Determine if the Python version supports abi3. - """ - return len(python_version) > 1 - - -def _cpython_abis(py_version: PythonVersion, warn: bool = False) -> List[str]: - py_version = tuple(py_version) # To allow for version comparison. - abis = [] - version = _version_nodot(py_version[:2]) - debug = pymalloc = ucs4 = "" - with_debug = _get_config_var("Py_DEBUG", warn) - has_refcount = hasattr(sys, "gettotalrefcount") - # Windows doesn't set Py_DEBUG, so checking for support of debug-compiled - # extension modules is the best option. - # https://github.com/pypa/pip/issues/3383#issuecomment-173267692 - has_ext = "_d.pyd" in EXTENSION_SUFFIXES - if with_debug or (with_debug is None and (has_refcount or has_ext)): - debug = "d" - if debug: - # Debug builds can also load "normal" extension modules. - # We can also assume no UCS-4 or pymalloc requirement. - abis.append(f"cp{version}") - abis.insert( - 0, - "cp{version}{debug}{pymalloc}{ucs4}".format( - version=version, debug=debug, pymalloc=pymalloc, ucs4=ucs4 - ), - ) - return abis - - -def cpython_tags( - python_version: Optional[PythonVersion] = None, - abis: Optional[Iterable[str]] = None, - platforms: Optional[Iterable[str]] = None, - *, - warn: bool = False, -) -> Iterator[Tag]: - """ - Yields the tags for a CPython interpreter. - - The tags consist of: - - cp-- - - cp-abi3- - - cp-none- - - cp-abi3- # Older Python versions down to 3.2. - - If python_version only specifies a major version then user-provided ABIs and - the 'none' ABItag will be used. - - If 'abi3' or 'none' are specified in 'abis' then they will be yielded at - their normal position and not at the beginning. - """ - if not python_version: - python_version = sys.version_info[:2] - - interpreter = f"cp{_version_nodot(python_version[:2])}" - - if abis is None: - if len(python_version) > 1: - abis = _cpython_abis(python_version, warn) - else: - abis = [] - abis = list(abis) - # 'abi3' and 'none' are explicitly handled later. - for explicit_abi in ("abi3", "none"): - try: - abis.remove(explicit_abi) - except ValueError: - pass - - platforms = list(platforms or platform_tags()) - for abi in abis: - for platform_ in platforms: - yield Tag(interpreter, abi, platform_) - if _abi3_applies(python_version): - yield from (Tag(interpreter, "abi3", platform_) for platform_ in platforms) - yield from (Tag(interpreter, "none", platform_) for platform_ in platforms) - - if _abi3_applies(python_version): - for minor_version in range(python_version[1] - 1, 1, -1): - for platform_ in platforms: - interpreter = "cp{version}".format( - version=_version_nodot((python_version[0], minor_version)) - ) - yield Tag(interpreter, "abi3", platform_) - - -def _generic_abi() -> List[str]: - """ - Return the ABI tag based on EXT_SUFFIX. - """ - # The following are examples of `EXT_SUFFIX`. - # We want to keep the parts which are related to the ABI and remove the - # parts which are related to the platform: - # - linux: '.cpython-310-x86_64-linux-gnu.so' => cp310 - # - mac: '.cpython-310-darwin.so' => cp310 - # - win: '.cp310-win_amd64.pyd' => cp310 - # - win: '.pyd' => cp37 (uses _cpython_abis()) - # - pypy: '.pypy38-pp73-x86_64-linux-gnu.so' => pypy38_pp73 - # - graalpy: '.graalpy-38-native-x86_64-darwin.dylib' - # => graalpy_38_native - - ext_suffix = _get_config_var("EXT_SUFFIX", warn=True) - if not isinstance(ext_suffix, str) or ext_suffix[0] != ".": - raise SystemError("invalid sysconfig.get_config_var('EXT_SUFFIX')") - parts = ext_suffix.split(".") - if len(parts) < 3: - # CPython3.7 and earlier uses ".pyd" on Windows. - return _cpython_abis(sys.version_info[:2]) - soabi = parts[1] - if soabi.startswith("cpython"): - # non-windows - abi = "cp" + soabi.split("-")[1] - elif soabi.startswith("cp"): - # windows - abi = soabi.split("-")[0] - elif soabi.startswith("pypy"): - abi = "-".join(soabi.split("-")[:2]) - elif soabi.startswith("graalpy"): - abi = "-".join(soabi.split("-")[:3]) - elif soabi: - # pyston, ironpython, others? - abi = soabi - else: - return [] - return [_normalize_string(abi)] - - -def generic_tags( - interpreter: Optional[str] = None, - abis: Optional[Iterable[str]] = None, - platforms: Optional[Iterable[str]] = None, - *, - warn: bool = False, -) -> Iterator[Tag]: - """ - Yields the tags for a generic interpreter. - - The tags consist of: - - -- - - The "none" ABI will be added if it was not explicitly provided. - """ - if not interpreter: - interp_name = interpreter_name() - interp_version = interpreter_version(warn=warn) - interpreter = "".join([interp_name, interp_version]) - if abis is None: - abis = _generic_abi() - else: - abis = list(abis) - platforms = list(platforms or platform_tags()) - if "none" not in abis: - abis.append("none") - for abi in abis: - for platform_ in platforms: - yield Tag(interpreter, abi, platform_) - - -def _py_interpreter_range(py_version: PythonVersion) -> Iterator[str]: - """ - Yields Python versions in descending order. - - After the latest version, the major-only version will be yielded, and then - all previous versions of that major version. - """ - if len(py_version) > 1: - yield f"py{_version_nodot(py_version[:2])}" - yield f"py{py_version[0]}" - if len(py_version) > 1: - for minor in range(py_version[1] - 1, -1, -1): - yield f"py{_version_nodot((py_version[0], minor))}" - - -def compatible_tags( - python_version: Optional[PythonVersion] = None, - interpreter: Optional[str] = None, - platforms: Optional[Iterable[str]] = None, -) -> Iterator[Tag]: - """ - Yields the sequence of tags that are compatible with a specific version of Python. - - The tags consist of: - - py*-none- - - -none-any # ... if `interpreter` is provided. - - py*-none-any - """ - if not python_version: - python_version = sys.version_info[:2] - platforms = list(platforms or platform_tags()) - for version in _py_interpreter_range(python_version): - for platform_ in platforms: - yield Tag(version, "none", platform_) - if interpreter: - yield Tag(interpreter, "none", "any") - for version in _py_interpreter_range(python_version): - yield Tag(version, "none", "any") - - -def _mac_arch(arch: str, is_32bit: bool = _32_BIT_INTERPRETER) -> str: - if not is_32bit: - return arch - - if arch.startswith("ppc"): - return "ppc" - - return "i386" - - -def _mac_binary_formats(version: MacVersion, cpu_arch: str) -> List[str]: - formats = [cpu_arch] - if cpu_arch == "x86_64": - if version < (10, 4): - return [] - formats.extend(["intel", "fat64", "fat32"]) - - elif cpu_arch == "i386": - if version < (10, 4): - return [] - formats.extend(["intel", "fat32", "fat"]) - - elif cpu_arch == "ppc64": - # TODO: Need to care about 32-bit PPC for ppc64 through 10.2? - if version > (10, 5) or version < (10, 4): - return [] - formats.append("fat64") - - elif cpu_arch == "ppc": - if version > (10, 6): - return [] - formats.extend(["fat32", "fat"]) - - if cpu_arch in {"arm64", "x86_64"}: - formats.append("universal2") - - if cpu_arch in {"x86_64", "i386", "ppc64", "ppc", "intel"}: - formats.append("universal") - - return formats - - -def mac_platforms( - version: Optional[MacVersion] = None, arch: Optional[str] = None -) -> Iterator[str]: - """ - Yields the platform tags for a macOS system. - - The `version` parameter is a two-item tuple specifying the macOS version to - generate platform tags for. The `arch` parameter is the CPU architecture to - generate platform tags for. Both parameters default to the appropriate value - for the current system. - """ - version_str, _, cpu_arch = platform.mac_ver() - if version is None: - version = cast("MacVersion", tuple(map(int, version_str.split(".")[:2]))) - if version == (10, 16): - # When built against an older macOS SDK, Python will report macOS 10.16 - # instead of the real version. - version_str = subprocess.run( - [ - sys.executable, - "-sS", - "-c", - "import platform; print(platform.mac_ver()[0])", - ], - check=True, - env={"SYSTEM_VERSION_COMPAT": "0"}, - stdout=subprocess.PIPE, - text=True, - ).stdout - version = cast("MacVersion", tuple(map(int, version_str.split(".")[:2]))) - else: - version = version - if arch is None: - arch = _mac_arch(cpu_arch) - else: - arch = arch - - if (10, 0) <= version and version < (11, 0): - # Prior to Mac OS 11, each yearly release of Mac OS bumped the - # "minor" version number. The major version was always 10. - for minor_version in range(version[1], -1, -1): - compat_version = 10, minor_version - binary_formats = _mac_binary_formats(compat_version, arch) - for binary_format in binary_formats: - yield "macosx_{major}_{minor}_{binary_format}".format( - major=10, minor=minor_version, binary_format=binary_format - ) - - if version >= (11, 0): - # Starting with Mac OS 11, each yearly release bumps the major version - # number. The minor versions are now the midyear updates. - for major_version in range(version[0], 10, -1): - compat_version = major_version, 0 - binary_formats = _mac_binary_formats(compat_version, arch) - for binary_format in binary_formats: - yield "macosx_{major}_{minor}_{binary_format}".format( - major=major_version, minor=0, binary_format=binary_format - ) - - if version >= (11, 0): - # Mac OS 11 on x86_64 is compatible with binaries from previous releases. - # Arm64 support was introduced in 11.0, so no Arm binaries from previous - # releases exist. - # - # However, the "universal2" binary format can have a - # macOS version earlier than 11.0 when the x86_64 part of the binary supports - # that version of macOS. - if arch == "x86_64": - for minor_version in range(16, 3, -1): - compat_version = 10, minor_version - binary_formats = _mac_binary_formats(compat_version, arch) - for binary_format in binary_formats: - yield "macosx_{major}_{minor}_{binary_format}".format( - major=compat_version[0], - minor=compat_version[1], - binary_format=binary_format, - ) - else: - for minor_version in range(16, 3, -1): - compat_version = 10, minor_version - binary_format = "universal2" - yield "macosx_{major}_{minor}_{binary_format}".format( - major=compat_version[0], - minor=compat_version[1], - binary_format=binary_format, - ) - - -def _linux_platforms(is_32bit: bool = _32_BIT_INTERPRETER) -> Iterator[str]: - linux = _normalize_string(sysconfig.get_platform()) - if not linux.startswith("linux_"): - # we should never be here, just yield the sysconfig one and return - yield linux - return - if is_32bit: - if linux == "linux_x86_64": - linux = "linux_i686" - elif linux == "linux_aarch64": - linux = "linux_armv8l" - _, arch = linux.split("_", 1) - archs = {"armv8l": ["armv8l", "armv7l"]}.get(arch, [arch]) - yield from _manylinux.platform_tags(archs) - yield from _musllinux.platform_tags(archs) - for arch in archs: - yield f"linux_{arch}" - - -def _generic_platforms() -> Iterator[str]: - yield _normalize_string(sysconfig.get_platform()) - - -def platform_tags() -> Iterator[str]: - """ - Provides the platform tags for this installation. - """ - if platform.system() == "Darwin": - return mac_platforms() - elif platform.system() == "Linux": - return _linux_platforms() - else: - return _generic_platforms() - - -def interpreter_name() -> str: - """ - Returns the name of the running interpreter. - - Some implementations have a reserved, two-letter abbreviation which will - be returned when appropriate. - """ - name = sys.implementation.name - return INTERPRETER_SHORT_NAMES.get(name) or name - - -def interpreter_version(*, warn: bool = False) -> str: - """ - Returns the version of the running interpreter. - """ - version = _get_config_var("py_version_nodot", warn=warn) - if version: - version = str(version) - else: - version = _version_nodot(sys.version_info[:2]) - return version - - -def _version_nodot(version: PythonVersion) -> str: - return "".join(map(str, version)) - - -def sys_tags(*, warn: bool = False) -> Iterator[Tag]: - """ - Returns the sequence of tag triples for the running interpreter. - - The order of the sequence corresponds to priority order for the - interpreter, from most to least important. - """ - - interp_name = interpreter_name() - if interp_name == "cp": - yield from cpython_tags(warn=warn) - else: - yield from generic_tags() - - if interp_name == "pp": - interp = "pp3" - elif interp_name == "cp": - interp = "cp" + interpreter_version(warn=warn) - else: - interp = None - yield from compatible_tags(interpreter=interp) diff --git a/tools/gyp/pylib/packaging/utils.py b/tools/gyp/pylib/packaging/utils.py deleted file mode 100644 index c2c2f75aa80..00000000000 --- a/tools/gyp/pylib/packaging/utils.py +++ /dev/null @@ -1,172 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. - -import re -from typing import FrozenSet, NewType, Tuple, Union, cast - -from .tags import Tag, parse_tag -from .version import InvalidVersion, Version - -BuildTag = Union[Tuple[()], Tuple[int, str]] -NormalizedName = NewType("NormalizedName", str) - - -class InvalidName(ValueError): - """ - An invalid distribution name; users should refer to the packaging user guide. - """ - - -class InvalidWheelFilename(ValueError): - """ - An invalid wheel filename was found, users should refer to PEP 427. - """ - - -class InvalidSdistFilename(ValueError): - """ - An invalid sdist filename was found, users should refer to the packaging user guide. - """ - - -# Core metadata spec for `Name` -_validate_regex = re.compile( - r"^([A-Z0-9]|[A-Z0-9][A-Z0-9._-]*[A-Z0-9])$", re.IGNORECASE -) -_canonicalize_regex = re.compile(r"[-_.]+") -_normalized_regex = re.compile(r"^([a-z0-9]|[a-z0-9]([a-z0-9-](?!--))*[a-z0-9])$") -# PEP 427: The build number must start with a digit. -_build_tag_regex = re.compile(r"(\d+)(.*)") - - -def canonicalize_name(name: str, *, validate: bool = False) -> NormalizedName: - if validate and not _validate_regex.match(name): - raise InvalidName(f"name is invalid: {name!r}") - # This is taken from PEP 503. - value = _canonicalize_regex.sub("-", name).lower() - return cast(NormalizedName, value) - - -def is_normalized_name(name: str) -> bool: - return _normalized_regex.match(name) is not None - - -def canonicalize_version( - version: Union[Version, str], *, strip_trailing_zero: bool = True -) -> str: - """ - This is very similar to Version.__str__, but has one subtle difference - with the way it handles the release segment. - """ - if isinstance(version, str): - try: - parsed = Version(version) - except InvalidVersion: - # Legacy versions cannot be normalized - return version - else: - parsed = version - - parts = [] - - # Epoch - if parsed.epoch != 0: - parts.append(f"{parsed.epoch}!") - - # Release segment - release_segment = ".".join(str(x) for x in parsed.release) - if strip_trailing_zero: - # NB: This strips trailing '.0's to normalize - release_segment = re.sub(r"(\.0)+$", "", release_segment) - parts.append(release_segment) - - # Pre-release - if parsed.pre is not None: - parts.append("".join(str(x) for x in parsed.pre)) - - # Post-release - if parsed.post is not None: - parts.append(f".post{parsed.post}") - - # Development release - if parsed.dev is not None: - parts.append(f".dev{parsed.dev}") - - # Local version segment - if parsed.local is not None: - parts.append(f"+{parsed.local}") - - return "".join(parts) - - -def parse_wheel_filename( - filename: str, -) -> Tuple[NormalizedName, Version, BuildTag, FrozenSet[Tag]]: - if not filename.endswith(".whl"): - raise InvalidWheelFilename( - f"Invalid wheel filename (extension must be '.whl'): {filename}" - ) - - filename = filename[:-4] - dashes = filename.count("-") - if dashes not in (4, 5): - raise InvalidWheelFilename( - f"Invalid wheel filename (wrong number of parts): {filename}" - ) - - parts = filename.split("-", dashes - 2) - name_part = parts[0] - # See PEP 427 for the rules on escaping the project name. - if "__" in name_part or re.match(r"^[\w\d._]*$", name_part, re.UNICODE) is None: - raise InvalidWheelFilename(f"Invalid project name: {filename}") - name = canonicalize_name(name_part) - - try: - version = Version(parts[1]) - except InvalidVersion as e: - raise InvalidWheelFilename( - f"Invalid wheel filename (invalid version): {filename}" - ) from e - - if dashes == 5: - build_part = parts[2] - build_match = _build_tag_regex.match(build_part) - if build_match is None: - raise InvalidWheelFilename( - f"Invalid build number: {build_part} in '{filename}'" - ) - build = cast(BuildTag, (int(build_match.group(1)), build_match.group(2))) - else: - build = () - tags = parse_tag(parts[-1]) - return (name, version, build, tags) - - -def parse_sdist_filename(filename: str) -> Tuple[NormalizedName, Version]: - if filename.endswith(".tar.gz"): - file_stem = filename[: -len(".tar.gz")] - elif filename.endswith(".zip"): - file_stem = filename[: -len(".zip")] - else: - raise InvalidSdistFilename( - f"Invalid sdist filename (extension must be '.tar.gz' or '.zip'):" - f" {filename}" - ) - - # We are requiring a PEP 440 version, which cannot contain dashes, - # so we split on the last dash. - name_part, sep, version_part = file_stem.rpartition("-") - if not sep: - raise InvalidSdistFilename(f"Invalid sdist filename: {filename}") - - name = canonicalize_name(name_part) - - try: - version = Version(version_part) - except InvalidVersion as e: - raise InvalidSdistFilename( - f"Invalid sdist filename (invalid version): {filename}" - ) from e - - return (name, version) diff --git a/tools/gyp/pylib/packaging/version.py b/tools/gyp/pylib/packaging/version.py deleted file mode 100644 index 5faab9bd0dc..00000000000 --- a/tools/gyp/pylib/packaging/version.py +++ /dev/null @@ -1,563 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -""" -.. testsetup:: - - from packaging.version import parse, Version -""" - -import itertools -import re -from typing import Any, Callable, NamedTuple, Optional, SupportsInt, Tuple, Union - -from ._structures import Infinity, InfinityType, NegativeInfinity, NegativeInfinityType - -__all__ = ["VERSION_PATTERN", "parse", "Version", "InvalidVersion"] - -LocalType = Tuple[Union[int, str], ...] - -CmpPrePostDevType = Union[InfinityType, NegativeInfinityType, Tuple[str, int]] -CmpLocalType = Union[ - NegativeInfinityType, - Tuple[Union[Tuple[int, str], Tuple[NegativeInfinityType, Union[int, str]]], ...], -] -CmpKey = Tuple[ - int, - Tuple[int, ...], - CmpPrePostDevType, - CmpPrePostDevType, - CmpPrePostDevType, - CmpLocalType, -] -VersionComparisonMethod = Callable[[CmpKey, CmpKey], bool] - - -class _Version(NamedTuple): - epoch: int - release: Tuple[int, ...] - dev: Optional[Tuple[str, int]] - pre: Optional[Tuple[str, int]] - post: Optional[Tuple[str, int]] - local: Optional[LocalType] - - -def parse(version: str) -> "Version": - """Parse the given version string. - - >>> parse('1.0.dev1') - - - :param version: The version string to parse. - :raises InvalidVersion: When the version string is not a valid version. - """ - return Version(version) - - -class InvalidVersion(ValueError): - """Raised when a version string is not a valid version. - - >>> Version("invalid") - Traceback (most recent call last): - ... - packaging.version.InvalidVersion: Invalid version: 'invalid' - """ - - -class _BaseVersion: - _key: Tuple[Any, ...] - - def __hash__(self) -> int: - return hash(self._key) - - # Please keep the duplicated `isinstance` check - # in the six comparisons hereunder - # unless you find a way to avoid adding overhead function calls. - def __lt__(self, other: "_BaseVersion") -> bool: - if not isinstance(other, _BaseVersion): - return NotImplemented - - return self._key < other._key - - def __le__(self, other: "_BaseVersion") -> bool: - if not isinstance(other, _BaseVersion): - return NotImplemented - - return self._key <= other._key - - def __eq__(self, other: object) -> bool: - if not isinstance(other, _BaseVersion): - return NotImplemented - - return self._key == other._key - - def __ge__(self, other: "_BaseVersion") -> bool: - if not isinstance(other, _BaseVersion): - return NotImplemented - - return self._key >= other._key - - def __gt__(self, other: "_BaseVersion") -> bool: - if not isinstance(other, _BaseVersion): - return NotImplemented - - return self._key > other._key - - def __ne__(self, other: object) -> bool: - if not isinstance(other, _BaseVersion): - return NotImplemented - - return self._key != other._key - - -# Deliberately not anchored to the start and end of the string, to make it -# easier for 3rd party code to reuse -_VERSION_PATTERN = r""" - v? - (?: - (?:(?P[0-9]+)!)? # epoch - (?P[0-9]+(?:\.[0-9]+)*) # release segment - (?P
                                          # pre-release
-            [-_\.]?
-            (?Palpha|a|beta|b|preview|pre|c|rc)
-            [-_\.]?
-            (?P[0-9]+)?
-        )?
-        (?P                                         # post release
-            (?:-(?P[0-9]+))
-            |
-            (?:
-                [-_\.]?
-                (?Ppost|rev|r)
-                [-_\.]?
-                (?P[0-9]+)?
-            )
-        )?
-        (?P                                          # dev release
-            [-_\.]?
-            (?Pdev)
-            [-_\.]?
-            (?P[0-9]+)?
-        )?
-    )
-    (?:\+(?P[a-z0-9]+(?:[-_\.][a-z0-9]+)*))?       # local version
-"""
-
-VERSION_PATTERN = _VERSION_PATTERN
-"""
-A string containing the regular expression used to match a valid version.
-
-The pattern is not anchored at either end, and is intended for embedding in larger
-expressions (for example, matching a version number as part of a file name). The
-regular expression should be compiled with the ``re.VERBOSE`` and ``re.IGNORECASE``
-flags set.
-
-:meta hide-value:
-"""
-
-
-class Version(_BaseVersion):
-    """This class abstracts handling of a project's versions.
-
-    A :class:`Version` instance is comparison aware and can be compared and
-    sorted using the standard Python interfaces.
-
-    >>> v1 = Version("1.0a5")
-    >>> v2 = Version("1.0")
-    >>> v1
-    
-    >>> v2
-    
-    >>> v1 < v2
-    True
-    >>> v1 == v2
-    False
-    >>> v1 > v2
-    False
-    >>> v1 >= v2
-    False
-    >>> v1 <= v2
-    True
-    """
-
-    _regex = re.compile(r"^\s*" + VERSION_PATTERN + r"\s*$", re.VERBOSE | re.IGNORECASE)
-    _key: CmpKey
-
-    def __init__(self, version: str) -> None:
-        """Initialize a Version object.
-
-        :param version:
-            The string representation of a version which will be parsed and normalized
-            before use.
-        :raises InvalidVersion:
-            If the ``version`` does not conform to PEP 440 in any way then this
-            exception will be raised.
-        """
-
-        # Validate the version and parse it into pieces
-        match = self._regex.search(version)
-        if not match:
-            raise InvalidVersion(f"Invalid version: '{version}'")
-
-        # Store the parsed out pieces of the version
-        self._version = _Version(
-            epoch=int(match.group("epoch")) if match.group("epoch") else 0,
-            release=tuple(int(i) for i in match.group("release").split(".")),
-            pre=_parse_letter_version(match.group("pre_l"), match.group("pre_n")),
-            post=_parse_letter_version(
-                match.group("post_l"), match.group("post_n1") or match.group("post_n2")
-            ),
-            dev=_parse_letter_version(match.group("dev_l"), match.group("dev_n")),
-            local=_parse_local_version(match.group("local")),
-        )
-
-        # Generate a key which will be used for sorting
-        self._key = _cmpkey(
-            self._version.epoch,
-            self._version.release,
-            self._version.pre,
-            self._version.post,
-            self._version.dev,
-            self._version.local,
-        )
-
-    def __repr__(self) -> str:
-        """A representation of the Version that shows all internal state.
-
-        >>> Version('1.0.0')
-        
-        """
-        return f""
-
-    def __str__(self) -> str:
-        """A string representation of the version that can be rounded-tripped.
-
-        >>> str(Version("1.0a5"))
-        '1.0a5'
-        """
-        parts = []
-
-        # Epoch
-        if self.epoch != 0:
-            parts.append(f"{self.epoch}!")
-
-        # Release segment
-        parts.append(".".join(str(x) for x in self.release))
-
-        # Pre-release
-        if self.pre is not None:
-            parts.append("".join(str(x) for x in self.pre))
-
-        # Post-release
-        if self.post is not None:
-            parts.append(f".post{self.post}")
-
-        # Development release
-        if self.dev is not None:
-            parts.append(f".dev{self.dev}")
-
-        # Local version segment
-        if self.local is not None:
-            parts.append(f"+{self.local}")
-
-        return "".join(parts)
-
-    @property
-    def epoch(self) -> int:
-        """The epoch of the version.
-
-        >>> Version("2.0.0").epoch
-        0
-        >>> Version("1!2.0.0").epoch
-        1
-        """
-        return self._version.epoch
-
-    @property
-    def release(self) -> Tuple[int, ...]:
-        """The components of the "release" segment of the version.
-
-        >>> Version("1.2.3").release
-        (1, 2, 3)
-        >>> Version("2.0.0").release
-        (2, 0, 0)
-        >>> Version("1!2.0.0.post0").release
-        (2, 0, 0)
-
-        Includes trailing zeroes but not the epoch or any pre-release / development /
-        post-release suffixes.
-        """
-        return self._version.release
-
-    @property
-    def pre(self) -> Optional[Tuple[str, int]]:
-        """The pre-release segment of the version.
-
-        >>> print(Version("1.2.3").pre)
-        None
-        >>> Version("1.2.3a1").pre
-        ('a', 1)
-        >>> Version("1.2.3b1").pre
-        ('b', 1)
-        >>> Version("1.2.3rc1").pre
-        ('rc', 1)
-        """
-        return self._version.pre
-
-    @property
-    def post(self) -> Optional[int]:
-        """The post-release number of the version.
-
-        >>> print(Version("1.2.3").post)
-        None
-        >>> Version("1.2.3.post1").post
-        1
-        """
-        return self._version.post[1] if self._version.post else None
-
-    @property
-    def dev(self) -> Optional[int]:
-        """The development number of the version.
-
-        >>> print(Version("1.2.3").dev)
-        None
-        >>> Version("1.2.3.dev1").dev
-        1
-        """
-        return self._version.dev[1] if self._version.dev else None
-
-    @property
-    def local(self) -> Optional[str]:
-        """The local version segment of the version.
-
-        >>> print(Version("1.2.3").local)
-        None
-        >>> Version("1.2.3+abc").local
-        'abc'
-        """
-        if self._version.local:
-            return ".".join(str(x) for x in self._version.local)
-        else:
-            return None
-
-    @property
-    def public(self) -> str:
-        """The public portion of the version.
-
-        >>> Version("1.2.3").public
-        '1.2.3'
-        >>> Version("1.2.3+abc").public
-        '1.2.3'
-        >>> Version("1.2.3+abc.dev1").public
-        '1.2.3'
-        """
-        return str(self).split("+", 1)[0]
-
-    @property
-    def base_version(self) -> str:
-        """The "base version" of the version.
-
-        >>> Version("1.2.3").base_version
-        '1.2.3'
-        >>> Version("1.2.3+abc").base_version
-        '1.2.3'
-        >>> Version("1!1.2.3+abc.dev1").base_version
-        '1!1.2.3'
-
-        The "base version" is the public version of the project without any pre or post
-        release markers.
-        """
-        parts = []
-
-        # Epoch
-        if self.epoch != 0:
-            parts.append(f"{self.epoch}!")
-
-        # Release segment
-        parts.append(".".join(str(x) for x in self.release))
-
-        return "".join(parts)
-
-    @property
-    def is_prerelease(self) -> bool:
-        """Whether this version is a pre-release.
-
-        >>> Version("1.2.3").is_prerelease
-        False
-        >>> Version("1.2.3a1").is_prerelease
-        True
-        >>> Version("1.2.3b1").is_prerelease
-        True
-        >>> Version("1.2.3rc1").is_prerelease
-        True
-        >>> Version("1.2.3dev1").is_prerelease
-        True
-        """
-        return self.dev is not None or self.pre is not None
-
-    @property
-    def is_postrelease(self) -> bool:
-        """Whether this version is a post-release.
-
-        >>> Version("1.2.3").is_postrelease
-        False
-        >>> Version("1.2.3.post1").is_postrelease
-        True
-        """
-        return self.post is not None
-
-    @property
-    def is_devrelease(self) -> bool:
-        """Whether this version is a development release.
-
-        >>> Version("1.2.3").is_devrelease
-        False
-        >>> Version("1.2.3.dev1").is_devrelease
-        True
-        """
-        return self.dev is not None
-
-    @property
-    def major(self) -> int:
-        """The first item of :attr:`release` or ``0`` if unavailable.
-
-        >>> Version("1.2.3").major
-        1
-        """
-        return self.release[0] if len(self.release) >= 1 else 0
-
-    @property
-    def minor(self) -> int:
-        """The second item of :attr:`release` or ``0`` if unavailable.
-
-        >>> Version("1.2.3").minor
-        2
-        >>> Version("1").minor
-        0
-        """
-        return self.release[1] if len(self.release) >= 2 else 0
-
-    @property
-    def micro(self) -> int:
-        """The third item of :attr:`release` or ``0`` if unavailable.
-
-        >>> Version("1.2.3").micro
-        3
-        >>> Version("1").micro
-        0
-        """
-        return self.release[2] if len(self.release) >= 3 else 0
-
-
-def _parse_letter_version(
-    letter: Optional[str], number: Union[str, bytes, SupportsInt, None]
-) -> Optional[Tuple[str, int]]:
-
-    if letter:
-        # We consider there to be an implicit 0 in a pre-release if there is
-        # not a numeral associated with it.
-        if number is None:
-            number = 0
-
-        # We normalize any letters to their lower case form
-        letter = letter.lower()
-
-        # We consider some words to be alternate spellings of other words and
-        # in those cases we want to normalize the spellings to our preferred
-        # spelling.
-        if letter == "alpha":
-            letter = "a"
-        elif letter == "beta":
-            letter = "b"
-        elif letter in ["c", "pre", "preview"]:
-            letter = "rc"
-        elif letter in ["rev", "r"]:
-            letter = "post"
-
-        return letter, int(number)
-    if not letter and number:
-        # We assume if we are given a number, but we are not given a letter
-        # then this is using the implicit post release syntax (e.g. 1.0-1)
-        letter = "post"
-
-        return letter, int(number)
-
-    return None
-
-
-_local_version_separators = re.compile(r"[\._-]")
-
-
-def _parse_local_version(local: Optional[str]) -> Optional[LocalType]:
-    """
-    Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve").
-    """
-    if local is not None:
-        return tuple(
-            part.lower() if not part.isdigit() else int(part)
-            for part in _local_version_separators.split(local)
-        )
-    return None
-
-
-def _cmpkey(
-    epoch: int,
-    release: Tuple[int, ...],
-    pre: Optional[Tuple[str, int]],
-    post: Optional[Tuple[str, int]],
-    dev: Optional[Tuple[str, int]],
-    local: Optional[LocalType],
-) -> CmpKey:
-
-    # When we compare a release version, we want to compare it with all of the
-    # trailing zeros removed. So we'll use a reverse the list, drop all the now
-    # leading zeros until we come to something non zero, then take the rest
-    # re-reverse it back into the correct order and make it a tuple and use
-    # that for our sorting key.
-    _release = tuple(
-        reversed(list(itertools.dropwhile(lambda x: x == 0, reversed(release))))
-    )
-
-    # We need to "trick" the sorting algorithm to put 1.0.dev0 before 1.0a0.
-    # We'll do this by abusing the pre segment, but we _only_ want to do this
-    # if there is not a pre or a post segment. If we have one of those then
-    # the normal sorting rules will handle this case correctly.
-    if pre is None and post is None and dev is not None:
-        _pre: CmpPrePostDevType = NegativeInfinity
-    # Versions without a pre-release (except as noted above) should sort after
-    # those with one.
-    elif pre is None:
-        _pre = Infinity
-    else:
-        _pre = pre
-
-    # Versions without a post segment should sort before those with one.
-    if post is None:
-        _post: CmpPrePostDevType = NegativeInfinity
-
-    else:
-        _post = post
-
-    # Versions without a development segment should sort after those with one.
-    if dev is None:
-        _dev: CmpPrePostDevType = Infinity
-
-    else:
-        _dev = dev
-
-    if local is None:
-        # Versions without a local segment should sort before those with one.
-        _local: CmpLocalType = NegativeInfinity
-    else:
-        # Versions with a local segment need that segment parsed to implement
-        # the sorting rules in PEP440.
-        # - Alpha numeric segments sort before numeric segments
-        # - Alpha numeric segments sort lexicographically
-        # - Numeric segments sort numerically
-        # - Shorter versions sort before longer versions when the prefixes
-        #   match exactly
-        _local = tuple(
-            (i, "") if isinstance(i, int) else (NegativeInfinity, i) for i in local
-        )
-
-    return epoch, _release, _pre, _post, _dev, _local
diff --git a/tools/gyp/pyproject.toml b/tools/gyp/pyproject.toml
deleted file mode 100644
index 487cb75002d..00000000000
--- a/tools/gyp/pyproject.toml
+++ /dev/null
@@ -1,116 +0,0 @@
-[build-system]
-requires = ["setuptools>=61.0"]
-build-backend = "setuptools.build_meta"
-
-[project]
-name = "gyp-next"
-version = "0.22.2"
-authors = [
-  { name="Node.js contributors", email="ryzokuken@disroot.org" },
-]
-description = "A fork of the GYP build system for use in the Node.js projects"
-readme = "README.md"
-license = "BSD-3-Clause"
-license-files = ["LICENSE"]
-requires-python = ">=3.9"
-dependencies = ["packaging>=24.0", "setuptools>=77.0.3"]
-classifiers = [
-    "Development Status :: 3 - Alpha",
-    "Environment :: Console",
-    "Intended Audience :: Developers",
-    "Natural Language :: English",
-    "Programming Language :: Python",
-    "Programming Language :: Python :: 3",
-    "Programming Language :: Python :: 3.9",
-    "Programming Language :: Python :: 3.10",
-    "Programming Language :: Python :: 3.11",
-    "Programming Language :: Python :: 3.12",
-    "Programming Language :: Python :: 3.13",
-    "Programming Language :: Python :: 3.14",
-]
-
-[project.optional-dependencies]
-dev = ["pytest", "ruff"]
-
-[project.scripts]
-gyp = "gyp:script_main"
-
-[project.urls]
-"Homepage" = "https://github.com/nodejs/gyp-next"
-
-[tool.ruff]
-extend-exclude = ["pylib/packaging"]
-line-length = 88
-
-[tool.ruff.lint]
-select = [
-  "C4",   # flake8-comprehensions
-  "C90",  # McCabe cyclomatic complexity
-  "DTZ",  # flake8-datetimez
-  "E",    # pycodestyle
-  "F",    # Pyflakes
-  "G",    # flake8-logging-format
-  "ICN",  # flake8-import-conventions
-  "INT",  # flake8-gettext
-  "PL",   # Pylint
-  "PYI",  # flake8-pyi
-  "RSE",  # flake8-raise
-  "RUF",  # Ruff-specific rules
-  "T10",  # flake8-debugger
-  "TCH",  # flake8-type-checking
-  "TID",  # flake8-tidy-imports
-  "UP",   # pyupgrade
-  "W",    # pycodestyle
-  "YTT",  # flake8-2020
-  # "A",    # flake8-builtins
-  # "ANN",  # flake8-annotations
-  # "ARG",  # flake8-unused-arguments
-  # "B",    # flake8-bugbear
-  # "BLE",  # flake8-blind-except
-  # "COM",  # flake8-commas
-  # "D",    # pydocstyle
-  # "DJ",   # flake8-django
-  # "EM",   # flake8-errmsg
-  # "ERA",  # eradicate
-  # "EXE",  # flake8-executable
-  # "FBT",  # flake8-boolean-trap
-  # "I",    # isort
-  # "INP",  # flake8-no-pep420
-  # "ISC",  # flake8-implicit-str-concat
-  # "N",    # pep8-naming
-  # "NPY",  # NumPy-specific rules
-  # "PD",   # pandas-vet
-  # "PGH",  # pygrep-hooks
-  # "PIE",  # flake8-pie
-  # "PT",   # flake8-pytest-style
-  # "PTH",  # flake8-use-pathlib
-  # "Q",    # flake8-quotes
-  # "RET",  # flake8-return
-  # "S",    # flake8-bandit
-  # "SIM",  # flake8-simplify
-  # "SLF",  # flake8-self
-  # "T20",  # flake8-print
-  # "TRY",  # tryceratops
-]
-ignore = [
-  "PLR1714",
-  "PLW0603",
-  "PLW2901",
-  "RUF005",
-  "RUF012",
-  "UP031",
-]
-
-[tool.ruff.lint.mccabe]
-max-complexity = 101
-
-[tool.ruff.lint.pylint]
-allow-magic-value-types = ["float", "int", "str"]
-max-args = 11
-max-branches = 108
-max-returns = 10
-max-statements = 286
-
-[tool.setuptools]
-package-dir = {"" = "pylib"}
-packages = ["gyp", "gyp.generator"]
diff --git a/tools/gyp/release-please-config.json b/tools/gyp/release-please-config.json
deleted file mode 100644
index b6cad32a2dd..00000000000
--- a/tools/gyp/release-please-config.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-    "last-release-sha": "78756421b0d7bb335992a9c7d26ba3cc8b619708",
-    "packages": {
-        ".": {
-          "release-type": "python",
-          "package-name": "gyp-next",
-          "bump-minor-pre-major": true,
-          "include-component-in-tag": false
-        }
-    }
-}
diff --git a/tools/gyp/test/fixtures/expected-darwin/cmake/CMakeLists.txt b/tools/gyp/test/fixtures/expected-darwin/cmake/CMakeLists.txt
deleted file mode 100644
index 90b95e75eb5..00000000000
--- a/tools/gyp/test/fixtures/expected-darwin/cmake/CMakeLists.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-cmake_minimum_required(VERSION 2.8.8 FATAL_ERROR)
-cmake_policy(VERSION 2.8.8)
-project(test)
-set(configuration "Default")
-enable_language(ASM)
-set(builddir "${CMAKE_CURRENT_BINARY_DIR}")
-set(obj "${builddir}/obj")
-
-set(CMAKE_C_OUTPUT_EXTENSION_REPLACE 1)
-set(CMAKE_CXX_OUTPUT_EXTENSION_REPLACE 1)
-
-
-
-#*/gyp-next/test/fixtures/integration.gyp:test#target
-set(TARGET "test")
-set(TOOLSET "target")
-set(test__cxx_srcs "../../test.cc")
-link_directories( ../../mylib
-)
-add_executable(test ${test__cxx_srcs})
-set_target_properties(test PROPERTIES EXCLUDE_FROM_ALL "FALSE")
-set_target_properties(test PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${builddir}")
-set_target_properties(test PROPERTIES PREFIX "")
-set_target_properties(test PROPERTIES RUNTIME_OUTPUT_NAME "test")
-set_target_properties(test PROPERTIES SUFFIX "")
-set_source_files_properties(${builddir}/test PROPERTIES GENERATED "TRUE")
-set(test__include_dirs "${CMAKE_CURRENT_LIST_DIR}/../../include")
-set_property(TARGET test APPEND PROPERTY INCLUDE_DIRECTORIES ${test__include_dirs})
-set_target_properties(test PROPERTIES COMPILE_FLAGS "-fasm-blocks -mpascal-strings -Os -gdwarf-2 -arch x86_64 ")
-unset(TOOLSET)
-unset(TARGET)
diff --git a/tools/gyp/test/fixtures/expected-darwin/make/test.target.mk b/tools/gyp/test/fixtures/expected-darwin/make/test.target.mk
deleted file mode 100644
index c9e16b63445..00000000000
--- a/tools/gyp/test/fixtures/expected-darwin/make/test.target.mk
+++ /dev/null
@@ -1,86 +0,0 @@
-# This file is generated by gyp; do not edit.
-
-TOOLSET := target
-TARGET := test
-DEFS_Default :=
-
-# Flags passed to all source files.
-CFLAGS_Default := \
-	-fasm-blocks \
-	-mpascal-strings \
-	-Os \
-	-gdwarf-2 \
-	-arch \
-	x86_64
-
-# Flags passed to only C files.
-CFLAGS_C_Default :=
-
-# Flags passed to only C++ files.
-CFLAGS_CC_Default :=
-
-# Flags passed to only ObjC files.
-CFLAGS_OBJC_Default :=
-
-# Flags passed to only ObjC++ files.
-CFLAGS_OBJCC_Default :=
-
-INCS_Default := \
-	-I$(srcdir)/include
-
-OBJS := \
-	$(obj).target/$(TARGET)/test.o
-
-# Add to the list of files we specially track dependencies for.
-all_deps += $(OBJS)
-
-# CFLAGS et al overrides must be target-local.
-# See "Target-specific Variable Values" in the GNU Make manual.
-$(OBJS): TOOLSET := $(TOOLSET)
-$(OBJS): GYP_CFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE))  $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_C_$(BUILDTYPE))
-$(OBJS): GYP_CXXFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE))  $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_CC_$(BUILDTYPE))
-$(OBJS): GYP_OBJCFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE))  $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_C_$(BUILDTYPE)) $(CFLAGS_OBJC_$(BUILDTYPE))
-$(OBJS): GYP_OBJCXXFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE))  $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_CC_$(BUILDTYPE)) $(CFLAGS_OBJCC_$(BUILDTYPE))
-
-# Suffix rules, putting all outputs into $(obj).
-
-$(obj).$(TOOLSET)/$(TARGET)/%.o: $(srcdir)/%.cc FORCE_DO_CMD
-	@$(call do_cmd,cxx,1)
-
-# Try building from generated source, too.
-
-$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj).$(TOOLSET)/%.cc FORCE_DO_CMD
-	@$(call do_cmd,cxx,1)
-
-$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj)/%.cc FORCE_DO_CMD
-	@$(call do_cmd,cxx,1)
-
-# End of this set of suffix rules
-### Rules for final target.
-LDFLAGS_Default := \
-	-arch \
-	x86_64 \
-	-L$(builddir) \
-	-L$(srcdir)/mylib
-
-LIBTOOLFLAGS_Default :=
-
-LIBS :=
-
-$(builddir)/test: GYP_LDFLAGS := $(LDFLAGS_$(BUILDTYPE))
-$(builddir)/test: LIBS := $(LIBS)
-$(builddir)/test: GYP_LIBTOOLFLAGS := $(LIBTOOLFLAGS_$(BUILDTYPE))
-$(builddir)/test: LD_INPUTS := $(OBJS)
-$(builddir)/test: TOOLSET := $(TOOLSET)
-$(builddir)/test: $(OBJS) FORCE_DO_CMD
-	$(call do_cmd,link)
-
-all_deps += $(builddir)/test
-# Add target alias
-.PHONY: test
-test: $(builddir)/test
-
-# Add executable to "all" target.
-.PHONY: all
-all: $(builddir)/test
-
diff --git a/tools/gyp/test/fixtures/expected-darwin/ninja/test.ninja b/tools/gyp/test/fixtures/expected-darwin/ninja/test.ninja
deleted file mode 100644
index fcb13208633..00000000000
--- a/tools/gyp/test/fixtures/expected-darwin/ninja/test.ninja
+++ /dev/null
@@ -1,15 +0,0 @@
-defines = 
-includes = -I../../include
-cflags = -fasm-blocks -mpascal-strings -Os -gdwarf-2 -arch x86_64
-cflags_c = 
-cflags_cc = 
-cflags_objc = $cflags_c
-cflags_objcc = $cflags_cc
-arflags = 
-
-build obj/test.test.o: cxx ../../test.cc
-
-ldflags = -arch x86_64 -L./
-libs = -L../../mylib
-build test: link obj/test.test.o
-  ld = $ldxx
diff --git a/tools/gyp/test/fixtures/expected-linux/cmake/CMakeLists.txt b/tools/gyp/test/fixtures/expected-linux/cmake/CMakeLists.txt
deleted file mode 100644
index 968642201ac..00000000000
--- a/tools/gyp/test/fixtures/expected-linux/cmake/CMakeLists.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-cmake_minimum_required(VERSION 2.8.8 FATAL_ERROR)
-cmake_policy(VERSION 2.8.8)
-project(test)
-set(configuration "Default")
-enable_language(ASM)
-set(builddir "${CMAKE_CURRENT_BINARY_DIR}")
-set(obj "${builddir}/obj")
-
-set(CMAKE_C_OUTPUT_EXTENSION_REPLACE 1)
-set(CMAKE_CXX_OUTPUT_EXTENSION_REPLACE 1)
-
-set(CMAKE_NINJA_FORCE_RESPONSE_FILE 1)
-
-
-#*/test/fixtures/integration.gyp:test#target
-set(TARGET "test")
-set(TOOLSET "target")
-set(test__cxx_srcs "../../test.cc")
-link_directories( ../../mylib
-)
-add_executable(test ${test__cxx_srcs})
-set_target_properties(test PROPERTIES EXCLUDE_FROM_ALL "FALSE")
-set_target_properties(test PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${builddir}")
-set_target_properties(test PROPERTIES PREFIX "")
-set_target_properties(test PROPERTIES RUNTIME_OUTPUT_NAME "test")
-set_target_properties(test PROPERTIES SUFFIX "")
-set_source_files_properties(${builddir}/test PROPERTIES GENERATED "TRUE")
-set(test__include_dirs "${CMAKE_CURRENT_LIST_DIR}/../../include")
-set_property(TARGET test APPEND PROPERTY INCLUDE_DIRECTORIES ${test__include_dirs})
-set_target_properties(test PROPERTIES COMPILE_FLAGS "")
-unset(TOOLSET)
-unset(TARGET)
diff --git a/tools/gyp/test/fixtures/expected-linux/make/test.target.mk b/tools/gyp/test/fixtures/expected-linux/make/test.target.mk
deleted file mode 100644
index bae91717b42..00000000000
--- a/tools/gyp/test/fixtures/expected-linux/make/test.target.mk
+++ /dev/null
@@ -1,66 +0,0 @@
-# This file is generated by gyp; do not edit.
-
-TOOLSET := target
-TARGET := test
-DEFS_Default :=
-
-# Flags passed to all source files.
-CFLAGS_Default :=
-
-# Flags passed to only C files.
-CFLAGS_C_Default :=
-
-# Flags passed to only C++ files.
-CFLAGS_CC_Default :=
-
-INCS_Default := \
-	-I$(srcdir)/include
-
-OBJS := \
-	$(obj).target/$(TARGET)/test.o
-
-# Add to the list of files we specially track dependencies for.
-all_deps += $(OBJS)
-
-# CFLAGS et al overrides must be target-local.
-# See "Target-specific Variable Values" in the GNU Make manual.
-$(OBJS): TOOLSET := $(TOOLSET)
-$(OBJS): GYP_CFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE))  $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_C_$(BUILDTYPE))
-$(OBJS): GYP_CXXFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE))  $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_CC_$(BUILDTYPE))
-
-# Suffix rules, putting all outputs into $(obj).
-
-$(obj).$(TOOLSET)/$(TARGET)/%.o: $(srcdir)/%.cc FORCE_DO_CMD
-	@$(call do_cmd,cxx,1)
-
-# Try building from generated source, too.
-
-$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj).$(TOOLSET)/%.cc FORCE_DO_CMD
-	@$(call do_cmd,cxx,1)
-
-$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj)/%.cc FORCE_DO_CMD
-	@$(call do_cmd,cxx,1)
-
-# End of this set of suffix rules
-### Rules for final target.
-LDFLAGS_Default := \
-	-L$(srcdir)/mylib
-
-LIBS :=
-
-$(builddir)/test: GYP_LDFLAGS := $(LDFLAGS_$(BUILDTYPE))
-$(builddir)/test: LIBS := $(LIBS)
-$(builddir)/test: LD_INPUTS := $(OBJS)
-$(builddir)/test: TOOLSET := $(TOOLSET)
-$(builddir)/test: $(OBJS) FORCE_DO_CMD
-	$(call do_cmd,link)
-
-all_deps += $(builddir)/test
-# Add target alias
-.PHONY: test
-test: $(builddir)/test
-
-# Add executable to "all" target.
-.PHONY: all
-all: $(builddir)/test
-
diff --git a/tools/gyp/test/fixtures/expected-linux/ninja/test.ninja b/tools/gyp/test/fixtures/expected-linux/ninja/test.ninja
deleted file mode 100644
index 15c6c3d6978..00000000000
--- a/tools/gyp/test/fixtures/expected-linux/ninja/test.ninja
+++ /dev/null
@@ -1,13 +0,0 @@
-defines = 
-includes = -I../../include
-cflags = 
-cflags_c = 
-cflags_cc = 
-arflags = 
-
-build obj/test.test.o: cxx ../../test.cc
-
-ldflags = 
-libs = -L../../mylib
-build test: link obj/test.test.o
-  ld = $ldxx
diff --git a/tools/gyp/test/fixtures/expected-win32/msvs/integration.sln b/tools/gyp/test/fixtures/expected-win32/msvs/integration.sln
deleted file mode 100644
index 276e0693118..00000000000
--- a/tools/gyp/test/fixtures/expected-win32/msvs/integration.sln
+++ /dev/null
@@ -1,16 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual Studio 2005
-Project("{*}") = "test", "test.vcproj", "{*}"
-EndProject
-Global
-	GlobalSection(SolutionConfigurationPlatforms) = preSolution
-		Default|Win32 = Default|Win32
-	EndGlobalSection
-	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{*}.Default|Win32.ActiveCfg = Default|Win32
-		{*}.Default|Win32.Build.0 = Default|Win32
-	EndGlobalSection
-	GlobalSection(SolutionProperties) = preSolution
-		HideSolutionNode = FALSE
-	EndGlobalSection
-EndGlobal
diff --git a/tools/gyp/test/fixtures/expected-win32/msvs/test.vcproj b/tools/gyp/test/fixtures/expected-win32/msvs/test.vcproj
deleted file mode 100644
index 981a106ce47..00000000000
--- a/tools/gyp/test/fixtures/expected-win32/msvs/test.vcproj
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/tools/gyp/test/fixtures/include/test.h b/tools/gyp/test/fixtures/include/test.h
deleted file mode 100644
index eacbb8d7731..00000000000
--- a/tools/gyp/test/fixtures/include/test.h
+++ /dev/null
@@ -1,3 +0,0 @@
-#pragma once
-
-int foo();
diff --git a/tools/gyp/test/fixtures/integration.gyp b/tools/gyp/test/fixtures/integration.gyp
deleted file mode 100644
index c4835117002..00000000000
--- a/tools/gyp/test/fixtures/integration.gyp
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-  'targets': [
-    {
-      'target_name': 'test',
-      'type': 'executable',
-      'sources': [
-        'test.cc',
-      ],
-      'include_dirs': [
-        'include',
-      ],
-      'library_dirs': [
-        'mylib'
-      ],
-    },
-  ]
-}
diff --git a/tools/gyp/test/fixtures/test.cc b/tools/gyp/test/fixtures/test.cc
deleted file mode 100644
index 8b1ecf89811..00000000000
--- a/tools/gyp/test/fixtures/test.cc
+++ /dev/null
@@ -1,9 +0,0 @@
-#include "test.h"
-
-int main() {
-  return foo();
-}
-
-int foo() {
-  return 0;
-}
diff --git a/tools/gyp/test/integration_test.py b/tools/gyp/test/integration_test.py
deleted file mode 100644
index 26d78763078..00000000000
--- a/tools/gyp/test/integration_test.py
+++ /dev/null
@@ -1,93 +0,0 @@
-#!/usr/bin/env python3
-
-"""Integration test"""
-
-import os
-import re
-import shutil
-import sys
-import unittest
-
-import gyp
-
-fixture_dir = os.path.join(os.path.dirname(__file__), "fixtures")
-gyp_file = os.path.join(os.path.dirname(__file__), "fixtures/integration.gyp")
-
-if sys.platform == "win32":
-    sysname = sys.platform
-else:
-    sysname = os.uname().sysname.lower()
-expected_dir = os.path.join(fixture_dir, f"expected-{sysname}")
-
-
-def assert_file(test, actual, expected) -> None:
-    actual_filepath = os.path.join(fixture_dir, actual)
-    expected_filepath = os.path.join(expected_dir, expected)
-
-    with open(expected_filepath) as in_file:
-        in_bytes = in_file.read()
-        in_bytes = in_bytes.strip()
-        expected_bytes = re.escape(in_bytes)
-    expected_bytes = expected_bytes.replace("\\*", ".*")
-    expected_re = re.compile(expected_bytes)
-
-    with open(actual_filepath) as in_file:
-        actual_bytes = in_file.read()
-        actual_bytes = actual_bytes.strip()
-
-    try:
-        test.assertRegex(actual_bytes, expected_re)
-    except Exception:
-        shutil.copyfile(actual_filepath, f"{expected_filepath}.actual")
-        raise
-
-
-class TestGypUnix(unittest.TestCase):
-    supported_sysnames = {"darwin", "linux"}
-
-    def setUp(self) -> None:
-        if sysname not in TestGypUnix.supported_sysnames:
-            self.skipTest(f"Unsupported system: {sysname}")
-        shutil.rmtree(os.path.join(fixture_dir, "out"), ignore_errors=True)
-
-    def test_ninja(self) -> None:
-        rc = gyp.main(["-f", "ninja", "--depth", fixture_dir, gyp_file])
-        assert rc == 0
-
-        assert_file(self, "out/Default/obj/test.ninja", "ninja/test.ninja")
-
-    def test_make(self) -> None:
-        rc = gyp.main(
-            [
-                "-f",
-                "make",
-                "--depth",
-                fixture_dir,
-                "--generator-output",
-                "out",
-                gyp_file,
-            ]
-        )
-        assert rc == 0
-
-        assert_file(self, "out/test.target.mk", "make/test.target.mk")
-
-    def test_cmake(self) -> None:
-        rc = gyp.main(["-f", "cmake", "--depth", fixture_dir, gyp_file])
-        assert rc == 0
-
-        assert_file(self, "out/Default/CMakeLists.txt", "cmake/CMakeLists.txt")
-
-
-class TestGypWindows(unittest.TestCase):
-    def setUp(self) -> None:
-        if sys.platform != "win32":
-            self.skipTest("Windows-only test")
-        shutil.rmtree(os.path.join(fixture_dir, "out"), ignore_errors=True)
-
-    def test_msvs(self) -> None:
-        rc = gyp.main(["-f", "msvs", "--depth", fixture_dir, gyp_file])
-        assert rc == 0
-
-        assert_file(self, "test.vcproj", "msvs/test.vcproj")
-        assert_file(self, "integration.sln", "msvs/integration.sln")
diff --git a/tools/gyp/test_gyp.py b/tools/gyp/test_gyp.py
deleted file mode 100755
index 70c81ae8ca3..00000000000
--- a/tools/gyp/test_gyp.py
+++ /dev/null
@@ -1,260 +0,0 @@
-#!/usr/bin/env python3
-# Copyright (c) 2012 Google Inc. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""gyptest.py -- test runner for GYP tests."""
-
-import argparse
-import os
-import platform
-import subprocess
-import sys
-import time
-
-
-def is_test_name(f):
-    return f.startswith("gyptest") and f.endswith(".py")
-
-
-def find_all_gyptest_files(directory):
-    result = []
-    for root, dirs, files in os.walk(directory):
-        result.extend([os.path.join(root, f) for f in files if is_test_name(f)])
-    result.sort()
-    return result
-
-
-def main(argv=None):
-    if argv is None:
-        argv = sys.argv
-
-    parser = argparse.ArgumentParser()
-    parser.add_argument("-a", "--all", action="store_true", help="run all tests")
-    parser.add_argument("-C", "--chdir", action="store", help="change to directory")
-    parser.add_argument(
-        "-f",
-        "--format",
-        action="store",
-        default="",
-        help="run tests with the specified formats",
-    )
-    parser.add_argument(
-        "-G",
-        "--gyp_option",
-        action="append",
-        default=[],
-        help="Add -G options to the gyp command line",
-    )
-    parser.add_argument(
-        "-l", "--list", action="store_true", help="list available tests and exit"
-    )
-    parser.add_argument(
-        "-n",
-        "--no-exec",
-        action="store_true",
-        help="no execute, just print the command line",
-    )
-    parser.add_argument(
-        "--path", action="append", default=[], help="additional $PATH directory"
-    )
-    parser.add_argument(
-        "-q",
-        "--quiet",
-        action="store_true",
-        help="quiet, don't print anything unless there are failures",
-    )
-    parser.add_argument(
-        "-v",
-        "--verbose",
-        action="store_true",
-        help="print configuration info and test results.",
-    )
-    parser.add_argument("tests", nargs="*")
-    args = parser.parse_args(argv[1:])
-
-    if args.chdir:
-        os.chdir(args.chdir)
-
-    if args.path:
-        extra_path = [os.path.abspath(p) for p in args.path]
-        extra_path = os.pathsep.join(extra_path)
-        os.environ["PATH"] = extra_path + os.pathsep + os.environ["PATH"]
-
-    if not args.tests:
-        if not args.all:
-            sys.stderr.write("Specify -a to get all tests.\n")
-            return 1
-        args.tests = ["test"]
-
-    tests = []
-    for arg in args.tests:
-        if os.path.isdir(arg):
-            tests.extend(find_all_gyptest_files(os.path.normpath(arg)))
-        else:
-            if not is_test_name(os.path.basename(arg)):
-                print(arg, "is not a valid gyp test name.", file=sys.stderr)
-                sys.exit(1)
-            tests.append(arg)
-
-    if args.list:
-        for test in tests:
-            print(test)
-        sys.exit(0)
-
-    os.environ["PYTHONPATH"] = os.path.abspath("test/lib")
-
-    if args.verbose:
-        print_configuration_info()
-
-    if args.gyp_option and not args.quiet:
-        print("Extra Gyp options: %s\n" % args.gyp_option)
-
-    if args.format:
-        format_list = args.format.split(",")
-    else:
-        format_list = {
-            "aix5": ["make"],
-            "os400": ["make"],
-            "freebsd7": ["make"],
-            "freebsd8": ["make"],
-            "openbsd5": ["make"],
-            "cygwin": ["msvs"],
-            "win32": ["msvs", "ninja"],
-            "linux": ["make", "ninja"],
-            "linux2": ["make", "ninja"],
-            "linux3": ["make", "ninja"],
-            # TODO: Re-enable xcode-ninja.
-            # https://bugs.chromium.org/p/gyp/issues/detail?id=530
-            # 'darwin':   ['make', 'ninja', 'xcode', 'xcode-ninja'],
-            "darwin": ["make", "ninja", "xcode"],
-        }[sys.platform]
-
-    gyp_options = []
-    for option in args.gyp_option:
-        gyp_options += ["-G", option]
-
-    runner = Runner(format_list, tests, gyp_options, args.verbose)
-    runner.run()
-
-    if not args.quiet:
-        runner.print_results()
-
-    return 1 if runner.failures else 0
-
-
-def print_configuration_info():
-    print("Test configuration:")
-    if sys.platform == "darwin":
-        sys.path.append(os.path.abspath("test/lib"))
-        import TestMac  # noqa: PLC0415
-
-        print(f"  Mac {platform.mac_ver()[0]} {platform.mac_ver()[2]}")
-        print(f"  Xcode {TestMac.Xcode.Version()}")
-    elif sys.platform == "win32":
-        sys.path.append(os.path.abspath("pylib"))
-        import gyp.MSVSVersion  # noqa: PLC0415
-
-        print("  Win %s %s\n" % platform.win32_ver()[0:2])
-        print("  MSVS %s" % gyp.MSVSVersion.SelectVisualStudioVersion().Description())
-    elif sys.platform in ("linux", "linux2"):
-        print("  Linux %s" % " ".join(platform.linux_distribution()))
-    print(f"  Python {platform.python_version()}")
-    print(f"  PYTHONPATH={os.environ['PYTHONPATH']}")
-    print()
-
-
-class Runner:
-    def __init__(self, formats, tests, gyp_options, verbose):
-        self.formats = formats
-        self.tests = tests
-        self.verbose = verbose
-        self.gyp_options = gyp_options
-        self.failures = []
-        self.num_tests = len(formats) * len(tests)
-        num_digits = len(str(self.num_tests))
-        self.fmt_str = "[%%%dd/%%%dd] (%%s) %%s" % (num_digits, num_digits)
-        self.isatty = sys.stdout.isatty() and not self.verbose
-        self.env = os.environ.copy()
-        self.hpos = 0
-
-    def run(self):
-        run_start = time.time()
-
-        i = 1
-        for fmt in self.formats:
-            for test in self.tests:
-                self.run_test(test, fmt, i)
-                i += 1
-
-        if self.isatty:
-            self.erase_current_line()
-
-        self.took = time.time() - run_start
-
-    def run_test(self, test, fmt, i):
-        if self.isatty:
-            self.erase_current_line()
-
-        msg = self.fmt_str % (i, self.num_tests, fmt, test)
-        self.print_(msg)
-
-        start = time.time()
-        cmd = [sys.executable, test] + self.gyp_options
-        self.env["TESTGYP_FORMAT"] = fmt
-        proc = subprocess.Popen(
-            cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, env=self.env
-        )
-        proc.wait()
-        took = time.time() - start
-
-        stdout = proc.stdout.read().decode("utf8")
-        if proc.returncode == 2:
-            res = "skipped"
-        elif proc.returncode:
-            res = "failed"
-            self.failures.append(f"({test}) {fmt}")
-        else:
-            res = "passed"
-        res_msg = f" {res} {took:.3f}s"
-        self.print_(res_msg)
-
-        if stdout and not stdout.endswith(("PASSED\n", "NO RESULT\n")):
-            print()
-            print("\n".join(f"    {line}" for line in stdout.splitlines()))
-        elif not self.isatty:
-            print()
-
-    def print_(self, msg):
-        print(msg, end="")
-        index = msg.rfind("\n")
-        if index == -1:
-            self.hpos += len(msg)
-        else:
-            self.hpos = len(msg) - index
-        sys.stdout.flush()
-
-    def erase_current_line(self):
-        print("\b" * self.hpos + " " * self.hpos + "\b" * self.hpos, end="")
-        sys.stdout.flush()
-        self.hpos = 0
-
-    def print_results(self):
-        num_failures = len(self.failures)
-        if num_failures:
-            print()
-            if num_failures == 1:
-                print("Failed the following test:")
-            else:
-                print("Failed the following %d tests:" % num_failures)
-            print("\t" + "\n\t".join(sorted(self.failures)))
-            print()
-        print(
-            "Ran %d tests in %.3fs, %d failed."
-            % (self.num_tests, self.took, num_failures)
-        )
-        print()
-
-
-if __name__ == "__main__":
-    sys.exit(main())
diff --git a/tools/gyp/tools/README b/tools/gyp/tools/README
deleted file mode 100644
index 84a73d15214..00000000000
--- a/tools/gyp/tools/README
+++ /dev/null
@@ -1,15 +0,0 @@
-pretty_vcproj:
-  Usage: pretty_vcproj.py "c:\path\to\vcproj.vcproj" [key1=value1] [key2=value2]
-
-  They key/value pair are used to resolve vsprops name.
-
-  For example, if I want to diff the base.vcproj project:
-
-  pretty_vcproj.py z:\dev\src-chrome\src\base\build\base.vcproj "$(SolutionDir)=z:\dev\src-chrome\src\chrome\\" "$(CHROMIUM_BUILD)=" "$(CHROME_BUILD_TYPE)=" > original.txt
-  pretty_vcproj.py z:\dev\src-chrome\src\base\base_gyp.vcproj "$(SolutionDir)=z:\dev\src-chrome\src\chrome\\" "$(CHROMIUM_BUILD)=" "$(CHROME_BUILD_TYPE)=" > gyp.txt
-
-  And you can use your favorite diff tool to see the changes.
-
-  Note: In the case of base.vcproj, the original vcproj is one level up the generated one.
-        I suggest you do a search and replace for '"..\' and replace it with '"' in original.txt
-        before you perform the diff.
\ No newline at end of file
diff --git a/tools/gyp/tools/Xcode/README b/tools/gyp/tools/Xcode/README
deleted file mode 100644
index 2492a2c2f8f..00000000000
--- a/tools/gyp/tools/Xcode/README
+++ /dev/null
@@ -1,5 +0,0 @@
-Specifications contains syntax formatters for Xcode 3. These do not appear to be supported yet on Xcode 4. To use these with Xcode 3 please install both the gyp.pbfilespec and gyp.xclangspec files in
-
-~/Library/Application Support/Developer/Shared/Xcode/Specifications/
-
-and restart Xcode.
\ No newline at end of file
diff --git a/tools/gyp/tools/Xcode/Specifications/gyp.pbfilespec b/tools/gyp/tools/Xcode/Specifications/gyp.pbfilespec
deleted file mode 100644
index 85e2e268a51..00000000000
--- a/tools/gyp/tools/Xcode/Specifications/gyp.pbfilespec
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
-	gyp.pbfilespec
-	GYP source file spec for Xcode 3
-
-	There is not much documentation available regarding the format
-	of .pbfilespec files. As a starting point, see for instance the
-	outdated documentation at:
-	http://maxao.free.fr/xcode-plugin-interface/specifications.html
-	and the files in:
-	/Developer/Library/PrivateFrameworks/XcodeEdit.framework/Versions/A/Resources/
-
-	Place this file in directory:
-	~/Library/Application Support/Developer/Shared/Xcode/Specifications/
-*/
-
-(
-	{
-		Identifier = sourcecode.gyp;
-		BasedOn = sourcecode;
-		Name = "GYP Files";
-		Extensions = ("gyp", "gypi");
-		MIMETypes = ("text/gyp");
-		Language = "xcode.lang.gyp";
-		IsTextFile = YES;
-		IsSourceFile = YES;
-	}
-)
diff --git a/tools/gyp/tools/Xcode/Specifications/gyp.xclangspec b/tools/gyp/tools/Xcode/Specifications/gyp.xclangspec
deleted file mode 100644
index 3b3506d319e..00000000000
--- a/tools/gyp/tools/Xcode/Specifications/gyp.xclangspec
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
-	Copyright (c) 2011 Google Inc. All rights reserved.
-	Use of this source code is governed by a BSD-style license that can be
-	found in the LICENSE file.
-	
-	gyp.xclangspec
-	GYP language specification for Xcode 3
-
-	There is not much documentation available regarding the format
-	of .xclangspec files. As a starting point, see for instance the
-	outdated documentation at:
-	http://maxao.free.fr/xcode-plugin-interface/specifications.html
-	and the files in:
-	/Developer/Library/PrivateFrameworks/XcodeEdit.framework/Versions/A/Resources/
-
-	Place this file in directory:
-	~/Library/Application Support/Developer/Shared/Xcode/Specifications/
-*/
-
-(
-
-    {
-        Identifier = "xcode.lang.gyp.keyword";
-        Syntax = {
-            Words = (
-                "and",
-                "or",
-                " (caar gyp-parse-history) target-point)
-    (setq gyp-parse-history (cdr gyp-parse-history))))
-
-(defun gyp-parse-point ()
-  "The point of the last parse state added by gyp-parse-to."
-  (caar gyp-parse-history))
-
-(defun gyp-parse-sections ()
-  "A list of section symbols holding at the last parse state point."
-  (cdar gyp-parse-history))
-
-(defun gyp-inside-dictionary-p ()
-  "Predicate returning true if the parser is inside a dictionary."
-  (not (eq (cadar gyp-parse-history) 'list)))
-
-(defun gyp-add-parse-history (point sections)
-  "Add parse state SECTIONS to the parse history at POINT so that parsing can be
-   resumed instantly."
-  (while (>= (caar gyp-parse-history) point)
-    (setq gyp-parse-history (cdr gyp-parse-history)))
-  (setq gyp-parse-history (cons (cons point sections) gyp-parse-history)))
-
-(defun gyp-parse-to (target-point)
-  "Parses from (point) to TARGET-POINT adding the parse state information to
-   gyp-parse-state-history. Parsing stops if TARGET-POINT is reached or if a
-   string literal has been parsed. Returns nil if no further parsing can be
-   done, otherwise returns the position of the start of a parsed string, leaving
-   the point at the end of the string."
-  (let ((parsing t)
-        string-start)
-    (while parsing
-      (setq string-start nil)
-      ;; Parse up to a character that starts a sexp, or if the nesting
-      ;; level decreases.
-      (let ((state (parse-partial-sexp (gyp-parse-point)
-                                       target-point
-                                       -1
-                                       t))
-            (sections (gyp-parse-sections)))
-        (if (= (nth 0 state) -1)
-            (setq sections (cdr sections)) ; pop out a level
-          (cond ((looking-at-p "['\"]") ; a string
-                 (setq string-start (point))
-                 (goto-char (scan-sexps (point) 1))
-                 (if (gyp-inside-dictionary-p)
-                     ;; Look for sections inside a dictionary
-                     (let ((section (gyp-section-name
-                                     (buffer-substring-no-properties
-                                      (+ 1 string-start)
-                                      (- (point) 1)))))
-                       (setq sections (cons section (cdr sections)))))
-                 ;; Stop after the string so it can be fontified.
-                 (setq target-point (point)))
-                ((looking-at-p "{")
-                 ;; Inside a dictionary. Increase nesting.
-                 (forward-char 1)
-                 (setq sections (cons 'unknown sections)))
-                ((looking-at-p "\\[")
-                 ;; Inside a list. Increase nesting
-                 (forward-char 1)
-                 (setq sections (cons 'list sections)))
-                ((not (eobp))
-                 ;; other
-                 (forward-char 1))))
-        (gyp-add-parse-history (point) sections)
-        (setq parsing (< (point) target-point))))
-    string-start))
-
-(defun gyp-section-at-point ()
-  "Transform the last parse state, which is a list of nested sections and return
-   the section symbol that should be used to determine font-lock information for
-   the string. Can return nil indicating the string should not have any attached
-   section."
-  (let ((sections (gyp-parse-sections)))
-    (cond
-     ((eq (car sections) 'conditions)
-      ;; conditions can occur in a variables section, but we still want to
-      ;; highlight it as a keyword.
-      nil)
-     ((and (eq (car sections) 'list)
-           (eq (cadr sections) 'list))
-      ;; conditions and sources can have items in [[ ]]
-      (caddr sections))
-     (t (cadr sections)))))
-
-(defun gyp-section-match (limit)
-  "Parse from (point) to LIMIT returning by means of match data what was
-   matched. The group of the match indicates what style font-lock should apply.
-   See also `gyp-add-font-lock-keywords'."
-  (gyp-invalidate-parse-states-after (point))
-  (let ((group nil)
-        (string-start t))
-    (while (and (< (point) limit)
-                (not group)
-                string-start)
-      (setq string-start (gyp-parse-to limit))
-      (if string-start
-          (setq group (cl-case (gyp-section-at-point)
-                        ('dependencies 1)
-                        ('variables 2)
-                        ('conditions 2)
-                        ('sources 3)
-                        ('defines 4)
-                        (nil nil)))))
-    (if group
-        (progn
-          ;; Set the match data to indicate to the font-lock mechanism the
-          ;; highlighting to be performed.
-          (set-match-data (append (list string-start (point))
-                                  (make-list (* (1- group) 2) nil)
-                                  (list (1+ string-start) (1- (point)))))
-          t))))
-
-;;; Please see http://code.google.com/p/gyp/wiki/GypLanguageSpecification for
-;;; canonical list of keywords.
-(defun gyp-add-font-lock-keywords ()
-  "Add gyp-mode keywords to font-lock mechanism."
-  ;; TODO(jknotten): Move all the keyword highlighting into gyp-section-match
-  ;; so that we can do the font-locking in a single font-lock pass.
-  (font-lock-add-keywords
-   nil
-   (list
-    ;; Top-level keywords
-    (list (concat "['\"]\\("
-              (regexp-opt (list "action" "action_name" "actions" "cflags"
-                                "cflags_cc" "conditions" "configurations"
-                                "copies" "defines" "dependencies" "destination"
-                                "direct_dependent_settings"
-                                "export_dependent_settings" "extension" "files"
-                                "include_dirs" "includes" "inputs" "ldflags" "libraries"
-                                "link_settings" "mac_bundle" "message"
-                                "msvs_external_rule" "outputs" "product_name"
-                                "process_outputs_as_sources" "rules" "rule_name"
-                                "sources" "suppress_wildcard"
-                                "target_conditions" "target_defaults"
-                                "target_defines" "target_name" "toolsets"
-                                "targets" "type" "variables" "xcode_settings"))
-              "[!/+=]?\\)") 1 'font-lock-keyword-face t)
-    ;; Type of target
-    (list (concat "['\"]\\("
-              (regexp-opt (list "loadable_module" "static_library"
-                                "shared_library" "executable" "none"))
-              "\\)") 1 'font-lock-type-face t)
-    (list "\\(?:target\\|action\\)_name['\"]\\s-*:\\s-*['\"]\\([^ '\"]*\\)" 1
-          'font-lock-function-name-face t)
-    (list 'gyp-section-match
-          (list 1 'font-lock-function-name-face t t) ; dependencies
-          (list 2 'font-lock-variable-name-face t t) ; variables, conditions
-          (list 3 'font-lock-constant-face t t) ; sources
-          (list 4 'font-lock-preprocessor-face t t)) ; preprocessor
-    ;; Variable expansion
-    (list "<@?(\\([^\n )]+\\))" 1 'font-lock-variable-name-face t)
-    ;; Command expansion
-    (list " "{dst}"')
-
-    print("}")
-
-
-def main():
-    if len(sys.argv) < 2:
-        print(__doc__, file=sys.stderr)
-        print(file=sys.stderr)
-        print("usage: %s target1 target2..." % (sys.argv[0]), file=sys.stderr)
-        return 1
-
-    edges = LoadEdges("dump.json", sys.argv[1:])
-
-    WriteGraph(edges)
-    return 0
-
-
-if __name__ == "__main__":
-    sys.exit(main())
diff --git a/tools/gyp/tools/pretty_gyp.py b/tools/gyp/tools/pretty_gyp.py
deleted file mode 100755
index 562a73ee672..00000000000
--- a/tools/gyp/tools/pretty_gyp.py
+++ /dev/null
@@ -1,154 +0,0 @@
-#!/usr/bin/env python3
-
-# Copyright (c) 2012 Google Inc. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Pretty-prints the contents of a GYP file."""
-
-import re
-import sys
-
-# Regex to remove comments when we're counting braces.
-COMMENT_RE = re.compile(r"\s*#.*")
-
-# Regex to remove quoted strings when we're counting braces.
-# It takes into account quoted quotes, and makes sure that the quotes match.
-# NOTE: It does not handle quotes that span more than one line, or
-# cases where an escaped quote is preceded by an escaped backslash.
-QUOTE_RE_STR = r'(?P[\'"])(.*?)(? 0:
-        after = True
-
-    # This catches the special case of a closing brace having something
-    # other than just whitespace ahead of it -- we don't want to
-    # unindent that until after this line is printed so it stays with
-    # the previous indentation level.
-    if cnt < 0 and closing_prefix_re.match(stripline):
-        after = True
-    return (cnt, after)
-
-
-def prettyprint_input(lines):
-    """Does the main work of indenting the input based on the brace counts."""
-    indent = 0
-    basic_offset = 2
-    for line in lines:
-        if COMMENT_RE.match(line):
-            print(line)
-        else:
-            line = line.strip("\r\n\t ")  # Otherwise doesn't strip \r on Unix.
-            if len(line) > 0:
-                (brace_diff, after) = count_braces(line)
-                if brace_diff != 0:
-                    if after:
-                        print(" " * (basic_offset * indent) + line)
-                        indent += brace_diff
-                    else:
-                        indent += brace_diff
-                        print(" " * (basic_offset * indent) + line)
-                else:
-                    print(" " * (basic_offset * indent) + line)
-            else:
-                print()
-
-
-def main():
-    if len(sys.argv) > 1:
-        data = open(sys.argv[1]).read().splitlines()
-    else:
-        data = sys.stdin.read().splitlines()
-    # Split up the double braces.
-    lines = split_double_braces(data)
-
-    # Indent and print the output.
-    prettyprint_input(lines)
-    return 0
-
-
-if __name__ == "__main__":
-    sys.exit(main())
diff --git a/tools/gyp/tools/pretty_sln.py b/tools/gyp/tools/pretty_sln.py
deleted file mode 100755
index 70c91aefad4..00000000000
--- a/tools/gyp/tools/pretty_sln.py
+++ /dev/null
@@ -1,180 +0,0 @@
-#!/usr/bin/env python3
-
-# Copyright (c) 2012 Google Inc. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Prints the information in a sln file in a diffable way.
-
-It first outputs each projects in alphabetical order with their
-dependencies.
-
-Then it outputs a possible build order.
-"""
-
-import os
-import re
-import sys
-
-import pretty_vcproj
-
-__author__ = "nsylvain (Nicolas Sylvain)"
-
-
-def BuildProject(project, built, projects, deps):
-    # if all dependencies are done, we can build it, otherwise we try to build the
-    # dependency.
-    # This is not infinite-recursion proof.
-    for dep in deps[project]:
-        if dep not in built:
-            BuildProject(dep, built, projects, deps)
-    print(project)
-    built.append(project)
-
-
-def ParseSolution(solution_file):
-    # All projects, their clsid and paths.
-    projects = {}
-
-    # A list of dependencies associated with a project.
-    dependencies = {}
-
-    # Regular expressions that matches the SLN format.
-    # The first line of a project definition.
-    begin_project = re.compile(
-        r'^Project\("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942'
-        r'}"\) = "(.*)", "(.*)", "(.*)"$'
-    )
-    # The last line of a project definition.
-    end_project = re.compile("^EndProject$")
-    # The first line of a dependency list.
-    begin_dep = re.compile(r"ProjectSection\(ProjectDependencies\) = postProject$")
-    # The last line of a dependency list.
-    end_dep = re.compile("EndProjectSection$")
-    # A line describing a dependency.
-    dep_line = re.compile(" *({.*}) = ({.*})$")
-
-    in_deps = False
-    solution = open(solution_file)
-    for line in solution:
-        results = begin_project.search(line)
-        if results:
-            # Hack to remove icu because the diff is too different.
-            if results.group(1).find("icu") != -1:
-                continue
-            # We remove "_gyp" from the names because it helps to diff them.
-            current_project = results.group(1).replace("_gyp", "")
-            projects[current_project] = [
-                results.group(2).replace("_gyp", ""),
-                results.group(3),
-                results.group(2),
-            ]
-            dependencies[current_project] = []
-            continue
-
-        results = end_project.search(line)
-        if results:
-            current_project = None
-            continue
-
-        results = begin_dep.search(line)
-        if results:
-            in_deps = True
-            continue
-
-        results = end_dep.search(line)
-        if results:
-            in_deps = False
-            continue
-
-        results = dep_line.search(line)
-        if results and in_deps and current_project:
-            dependencies[current_project].append(results.group(1))
-            continue
-
-    # Change all dependencies clsid to name instead.
-    for project, deps in dependencies.items():
-        # For each dependencies in this project
-        new_dep_array = []
-        for dep in deps:
-            # Look for the project name matching this cldis
-            for project_info in projects:
-                if projects[project_info][1] == dep:
-                    new_dep_array.append(project_info)
-        dependencies[project] = sorted(new_dep_array)
-
-    return (projects, dependencies)
-
-
-def PrintDependencies(projects, deps):
-    print("---------------------------------------")
-    print("Dependencies for all projects")
-    print("---------------------------------------")
-    print("--                                   --")
-
-    for project, dep_list in sorted(deps.items()):
-        print("Project : %s" % project)
-        print("Path : %s" % projects[project][0])
-        if dep_list:
-            for dep in dep_list:
-                print("  - %s" % dep)
-        print()
-
-    print("--                                   --")
-
-
-def PrintBuildOrder(projects, deps):
-    print("---------------------------------------")
-    print("Build order                            ")
-    print("---------------------------------------")
-    print("--                                   --")
-
-    built = []
-    for project, _ in sorted(deps.items()):
-        if project not in built:
-            BuildProject(project, built, projects, deps)
-
-    print("--                                   --")
-
-
-def PrintVCProj(projects):
-    for project in projects:
-        print("-------------------------------------")
-        print("-------------------------------------")
-        print(project)
-        print(project)
-        print(project)
-        print("-------------------------------------")
-        print("-------------------------------------")
-
-        project_path = os.path.abspath(
-            os.path.join(os.path.dirname(sys.argv[1]), projects[project][2])
-        )
-
-        pretty = pretty_vcproj
-        argv = [
-            "",
-            project_path,
-            "$(SolutionDir)=%s\\" % os.path.dirname(sys.argv[1]),
-        ]
-        argv.extend(sys.argv[3:])
-        pretty.main(argv)
-
-
-def main():
-    # check if we have exactly 1 parameter.
-    if len(sys.argv) < 2:
-        print('Usage: %s "c:\\path\\to\\project.sln"' % sys.argv[0])
-        return 1
-
-    (projects, deps) = ParseSolution(sys.argv[1])
-    PrintDependencies(projects, deps)
-    PrintBuildOrder(projects, deps)
-
-    if "--recursive" in sys.argv:
-        PrintVCProj(projects)
-    return 0
-
-
-if __name__ == "__main__":
-    sys.exit(main())
diff --git a/tools/gyp/tools/pretty_vcproj.py b/tools/gyp/tools/pretty_vcproj.py
deleted file mode 100755
index 82d47a0bdd4..00000000000
--- a/tools/gyp/tools/pretty_vcproj.py
+++ /dev/null
@@ -1,336 +0,0 @@
-#!/usr/bin/env python3
-
-# Copyright (c) 2012 Google Inc. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Make the format of a vcproj really pretty.
-
-This script normalize and sort an xml. It also fetches all the properties
-inside linked vsprops and include them explicitly in the vcproj.
-
-It outputs the resulting xml to stdout.
-"""
-
-import os
-import sys
-from xml.dom.minidom import Node, parse
-
-__author__ = "nsylvain (Nicolas Sylvain)"
-ARGUMENTS = None
-REPLACEMENTS = {}
-
-
-def cmp(x, y):
-    return (x > y) - (x < y)
-
-
-class CmpTuple:
-    """Compare function between 2 tuple."""
-
-    def __call__(self, x, y):
-        return cmp(x[0], y[0])
-
-
-class CmpNode:
-    """Compare function between 2 xml nodes."""
-
-    def __call__(self, x, y):
-        def get_string(node):
-            node_string = "node"
-            node_string += node.nodeName
-            if node.nodeValue:
-                node_string += node.nodeValue
-
-            if node.attributes:
-                # We first sort by name, if present.
-                node_string += node.getAttribute("Name")
-
-                all_nodes = []
-                for name, value in node.attributes.items():
-                    all_nodes.append((name, value))
-
-                all_nodes.sort(CmpTuple())
-                for name, value in all_nodes:
-                    node_string += name
-                    node_string += value
-
-            return node_string
-
-        return cmp(get_string(x), get_string(y))
-
-
-def PrettyPrintNode(node, indent=0):
-    if node.nodeType == Node.TEXT_NODE:
-        if node.data.strip():
-            print("{}{}".format(" " * indent, node.data.strip()))
-        return
-
-    if node.childNodes:
-        node.normalize()
-    # Get the number of attributes
-    attr_count = 0
-    if node.attributes:
-        attr_count = node.attributes.length
-
-    # Print the main tag
-    if attr_count == 0:
-        print("{}<{}>".format(" " * indent, node.nodeName))
-    else:
-        print("{}<{}".format(" " * indent, node.nodeName))
-
-        all_attributes = []
-        for name, value in node.attributes.items():
-            all_attributes.append((name, value))
-            all_attributes.sort(CmpTuple())
-        for name, value in all_attributes:
-            print('{}  {}="{}"'.format(" " * indent, name, value))
-        print("%s>" % (" " * indent))
-    if node.nodeValue:
-        print("{}  {}".format(" " * indent, node.nodeValue))
-
-    for sub_node in node.childNodes:
-        PrettyPrintNode(sub_node, indent=indent + 2)
-    print("{}".format(" " * indent, node.nodeName))
-
-
-def FlattenFilter(node):
-    """Returns a list of all the node and sub nodes."""
-    node_list = []
-
-    if node.attributes and node.getAttribute("Name") == "_excluded_files":
-        # We don't add the "_excluded_files" filter.
-        return []
-
-    for current in node.childNodes:
-        if current.nodeName == "Filter":
-            node_list.extend(FlattenFilter(current))
-        else:
-            node_list.append(current)
-
-    return node_list
-
-
-def FixFilenames(filenames, current_directory):
-    new_list = []
-    for filename in filenames:
-        if filename:
-            for key, value in REPLACEMENTS.items():
-                filename = filename.replace(key, value)
-            os.chdir(current_directory)
-            filename = filename.strip("\"' ")
-            if filename.startswith("$"):
-                new_list.append(filename)
-            else:
-                new_list.append(os.path.abspath(filename))
-    return new_list
-
-
-def AbsoluteNode(node):
-    """Makes all the properties we know about in this node absolute."""
-    if node.attributes:
-        for name, value in node.attributes.items():
-            if name in [
-                "InheritedPropertySheets",
-                "RelativePath",
-                "AdditionalIncludeDirectories",
-                "IntermediateDirectory",
-                "OutputDirectory",
-                "AdditionalLibraryDirectories",
-            ]:
-                # We want to fix up these paths
-                path_list = value.split(";")
-                new_list = FixFilenames(path_list, os.path.dirname(ARGUMENTS[1]))
-                node.setAttribute(name, ";".join(new_list))
-            if not value:
-                node.removeAttribute(name)
-
-
-def CleanupVcproj(node):
-    """For each sub node, we call recursively this function."""
-    for sub_node in node.childNodes:
-        AbsoluteNode(sub_node)
-        CleanupVcproj(sub_node)
-
-    # Normalize the node, and remove all extraneous whitespaces.
-    for sub_node in node.childNodes:
-        if sub_node.nodeType == Node.TEXT_NODE:
-            sub_node.data = sub_node.data.replace("\r", "")
-            sub_node.data = sub_node.data.replace("\n", "")
-            sub_node.data = sub_node.data.rstrip()
-
-    # Fix all the semicolon separated attributes to be sorted, and we also
-    # remove the dups.
-    if node.attributes:
-        for name, value in node.attributes.items():
-            sorted_list = sorted(value.split(";"))
-            unique_list = []
-            for i in sorted_list:
-                if not unique_list.count(i):
-                    unique_list.append(i)
-            node.setAttribute(name, ";".join(unique_list))
-            if not value:
-                node.removeAttribute(name)
-
-    if node.childNodes:
-        node.normalize()
-
-    # For each node, take a copy, and remove it from the list.
-    node_array = []
-    while node.childNodes and node.childNodes[0]:
-        # Take a copy of the node and remove it from the list.
-        current = node.childNodes[0]
-        node.removeChild(current)
-
-        # If the child is a filter, we want to append all its children
-        # to this same list.
-        if current.nodeName == "Filter":
-            node_array.extend(FlattenFilter(current))
-        else:
-            node_array.append(current)
-
-    # Sort the list.
-    node_array.sort(CmpNode())
-
-    # Insert the nodes in the correct order.
-    for new_node in node_array:
-        # But don't append empty tool node.
-        if new_node.nodeName == "Tool":
-            if new_node.attributes and new_node.attributes.length == 1:
-                # This one was empty.
-                continue
-        if new_node.nodeName == "UserMacro":
-            continue
-        node.appendChild(new_node)
-
-
-def GetConfigurationNodes(vcproj):
-    # TODO(nsylvain): Find a better way to navigate the xml.
-    nodes = []
-    for node in vcproj.childNodes:
-        if node.nodeName == "Configurations":
-            for sub_node in node.childNodes:
-                if sub_node.nodeName == "Configuration":
-                    nodes.append(sub_node)
-
-    return nodes
-
-
-def GetChildrenVsprops(filename):
-    dom = parse(filename)
-    if dom.documentElement.attributes:
-        vsprops = dom.documentElement.getAttribute("InheritedPropertySheets")
-        return FixFilenames(vsprops.split(";"), os.path.dirname(filename))
-    return []
-
-
-def SeekToNode(node1, child2):
-    # A text node does not have properties.
-    if child2.nodeType == Node.TEXT_NODE:
-        return None
-
-    # Get the name of the current node.
-    current_name = child2.getAttribute("Name")
-    if not current_name:
-        # There is no name. We don't know how to merge.
-        return None
-
-    # Look through all the nodes to find a match.
-    for sub_node in node1.childNodes:
-        if sub_node.nodeName == child2.nodeName:
-            name = sub_node.getAttribute("Name")
-            if name == current_name:
-                return sub_node
-
-    # No match. We give up.
-    return None
-
-
-def MergeAttributes(node1, node2):
-    # No attributes to merge?
-    if not node2.attributes:
-        return
-
-    for name, value2 in node2.attributes.items():
-        # Don't merge the 'Name' attribute.
-        if name == "Name":
-            continue
-        value1 = node1.getAttribute(name)
-        if value1:
-            # The attribute exist in the main node. If it's equal, we leave it
-            # untouched, otherwise we concatenate it.
-            if value1 != value2:
-                node1.setAttribute(name, ";".join([value1, value2]))
-        else:
-            # The attribute does not exist in the main node. We append this one.
-            node1.setAttribute(name, value2)
-
-        # If the attribute was a property sheet attributes, we remove it, since
-        # they are useless.
-        if name == "InheritedPropertySheets":
-            node1.removeAttribute(name)
-
-
-def MergeProperties(node1, node2):
-    MergeAttributes(node1, node2)
-    for child2 in node2.childNodes:
-        child1 = SeekToNode(node1, child2)
-        if child1:
-            MergeProperties(child1, child2)
-        else:
-            node1.appendChild(child2.cloneNode(True))
-
-
-def main(argv):
-    """Main function of this vcproj prettifier."""
-    global ARGUMENTS
-    ARGUMENTS = argv
-
-    # check if we have exactly 1 parameter.
-    if len(argv) < 2:
-        print(
-            'Usage: %s "c:\\path\\to\\vcproj.vcproj" [key1=value1] '
-            "[key2=value2]" % argv[0]
-        )
-        return 1
-
-    # Parse the keys
-    for i in range(2, len(argv)):
-        (key, value) = argv[i].split("=")
-        REPLACEMENTS[key] = value
-
-    # Open the vcproj and parse the xml.
-    dom = parse(argv[1])
-
-    # First thing we need to do is find the Configuration Node and merge them
-    # with the vsprops they include.
-    for configuration_node in GetConfigurationNodes(dom.documentElement):
-        # Get the property sheets associated with this configuration.
-        vsprops = configuration_node.getAttribute("InheritedPropertySheets")
-
-        # Fix the filenames to be absolute.
-        vsprops_list = FixFilenames(
-            vsprops.strip().split(";"), os.path.dirname(argv[1])
-        )
-
-        # Extend the list of vsprops with all vsprops contained in the current
-        # vsprops.
-        for current_vsprops in vsprops_list:
-            vsprops_list.extend(GetChildrenVsprops(current_vsprops))
-
-        # Now that we have all the vsprops, we need to merge them.
-        for current_vsprops in vsprops_list:
-            MergeProperties(configuration_node, parse(current_vsprops).documentElement)
-
-    # Now that everything is merged, we need to cleanup the xml.
-    CleanupVcproj(dom.documentElement)
-
-    # Finally, we use the prett xml function to print the vcproj back to the
-    # user.
-    # print dom.toprettyxml(newl="\n")
-    PrettyPrintNode(dom.documentElement)
-    return 0
-
-
-if __name__ == "__main__":
-    sys.exit(main(sys.argv))
diff --git a/tools/gyp_node.py b/tools/gyp_node.py
deleted file mode 100755
index 2bcc912a4da..00000000000
--- a/tools/gyp_node.py
+++ /dev/null
@@ -1,55 +0,0 @@
-#!/usr/bin/env python
-from __future__ import print_function
-import os
-import sys
-
-script_dir = os.path.dirname(__file__)
-node_root  = os.path.normpath(os.path.join(script_dir, os.pardir))
-
-sys.path.insert(0, os.path.join(node_root, 'tools', 'gyp', 'pylib'))
-import gyp
-
-# Add search path for `pymod_do_main` first to avoid depending on
-# load order of gyp files.
-sys.path.insert(0, os.path.join(node_root, 'tools', 'v8_gypfiles'))
-
-# Directory within which we want all generated files (including Makefiles)
-# to be written.
-output_dir = os.path.join(os.path.abspath(node_root), 'out')
-
-def run_gyp(args):
-  # GYP bug.
-  # On msvs it will crash if it gets an absolute path.
-  # On Mac/make it will crash if it doesn't get an absolute path.
-  a_path = node_root if sys.platform == 'win32' else os.path.abspath(node_root)
-  args.append(os.path.join(a_path, 'node.gyp'))
-  common_fn = os.path.join(a_path, 'common.gypi')
-  options_fn = os.path.join(a_path, 'config.gypi')
-
-  if os.path.exists(common_fn):
-    args.extend(['-I', common_fn])
-
-  if os.path.exists(options_fn):
-    args.extend(['-I', options_fn])
-
-  args.append('--depth=' + node_root)
-
-  # There's a bug with windows which doesn't allow this feature.
-  if sys.platform != 'win32' and 'ninja' not in args:
-    # Tell gyp to write the Makefiles into output_dir
-    args.extend(['--generator-output', output_dir])
-
-    # Tell make to write its output into the same dir
-    args.extend(['-Goutput_dir=' + output_dir])
-
-  args.append('-Dcomponent=static_library')
-  args.append('-Dlibrary=static_library')
-
-  rc = gyp.main(args)
-  if rc != 0:
-    print('Error running GYP')
-    sys.exit(rc)
-
-
-if __name__ == '__main__':
-  run_gyp(sys.argv[1:])
diff --git a/tools/gypi_to_gn.py b/tools/gypi_to_gn.py
deleted file mode 100755
index 327cd38d7ba..00000000000
--- a/tools/gypi_to_gn.py
+++ /dev/null
@@ -1,334 +0,0 @@
-#!/usr/bin/env python3
-# Copyright 2014 The Chromium Authors. All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-#    * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#    * Redistributions in binary form must reproduce the above
-# copyright notice, this list of conditions and the following disclaimer
-# in the documentation and/or other materials provided with the
-# distribution.
-#    * Neither the name of Google LLC nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-# Deleted from Chromium in https://crrev.com/097f64c631.
-
-"""Converts a given gypi file to a python scope and writes the result to stdout.
-USING THIS SCRIPT IN CHROMIUM
-Forking Python to run this script in the middle of GN is slow, especially on
-Windows, and it makes both the GYP and GN files harder to follow. You can't
-use "git grep" to find files in the GN build any more, and tracking everything
-in GYP down requires a level of indirection. Any calls will have to be removed
-and cleaned up once the GYP-to-GN transition is complete.
-As a result, we only use this script when the list of files is large and
-frequently-changing. In these cases, having one canonical list outweighs the
-downsides.
-As of this writing, the GN build is basically complete. It's likely that all
-large and frequently changing targets where this is appropriate use this
-mechanism already. And since we hope to turn down the GYP build soon, the time
-horizon is also relatively short. As a result, it is likely that no additional
-uses of this script should every be added to the build. During this later part
-of the transition period, we should be focusing more and more on the absolute
-readability of the GN build.
-HOW TO USE
-It is assumed that the file contains a toplevel dictionary, and this script
-will return that dictionary as a GN "scope" (see example below). This script
-does not know anything about GYP and it will not expand variables or execute
-conditions.
-It will strip conditions blocks.
-A variables block at the top level will be flattened so that the variables
-appear in the root dictionary. This way they can be returned to the GN code.
-Say your_file.gypi looked like this:
-  {
-     'sources': [ 'a.cc', 'b.cc' ],
-     'defines': [ 'ENABLE_DOOM_MELON' ],
-  }
-You would call it like this:
-  gypi_values = exec_script("//build/gypi_to_gn.py",
-                            [ rebase_path("your_file.gypi") ],
-                            "scope",
-                            [ "your_file.gypi" ])
-Notes:
- - The rebase_path call converts the gypi file from being relative to the
-   current build file to being system absolute for calling the script, which
-   will have a different current directory than this file.
- - The "scope" parameter tells GN to interpret the result as a series of GN
-   variable assignments.
- - The last file argument to exec_script tells GN that the given file is a
-   dependency of the build so Ninja can automatically re-run GN if the file
-   changes.
-Read the values into a target like this:
-  component("mycomponent") {
-    sources = gypi_values.sources
-    defines = gypi_values.defines
-  }
-Sometimes your .gypi file will include paths relative to a different
-directory than the current .gn file. In this case, you can rebase them to
-be relative to the current directory.
-  sources = rebase_path(gypi_values.sources, ".",
-                        "//path/gypi/input/values/are/relative/to")
-This script will tolerate a 'variables' in the toplevel dictionary or not. If
-the toplevel dictionary just contains one item called 'variables', it will be
-collapsed away and the result will be the contents of that dictinoary. Some
-.gypi files are written with or without this, depending on how they expect to
-be embedded into a .gyp file.
-This script also has the ability to replace certain substrings in the input.
-Generally this is used to emulate GYP variable expansion. If you passed the
-argument "--replace=<(foo)=bar" then all instances of "<(foo)" in strings in
-the input will be replaced with "bar":
-  gypi_values = exec_script("//build/gypi_to_gn.py",
-                            [ rebase_path("your_file.gypi"),
-                              "--replace=<(foo)=bar"],
-                            "scope",
-                            [ "your_file.gypi" ])
-"""
-
-from __future__ import absolute_import
-from __future__ import print_function
-from optparse import OptionParser
-import sys
-
-
-# This function is copied from build/gn_helpers.py in Chromium.
-def ToGNString(value, pretty=False):
-  """Returns a stringified GN equivalent of a Python value.
-
-  Args:
-    value: The Python value to convert.
-    pretty: Whether to pretty print. If true, then non-empty lists are rendered
-        recursively with one item per line, with indents. Otherwise lists are
-        rendered without new line.
-  Returns:
-    The stringified GN equivalent to |value|.
-
-  Raises:
-    ValueError: |value| cannot be printed to GN.
-  """
-
-  # Emits all output tokens without intervening whitespaces.
-  def GenerateTokens(v, level):
-    if isinstance(v, str):
-      yield '"' + ''.join(TranslateToGnChars(v)) + '"'
-
-    elif isinstance(v, bool):
-      yield 'true' if v else 'false'
-
-    elif isinstance(v, int):
-      yield str(v)
-
-    elif isinstance(v, list):
-      yield '['
-      for i, item in enumerate(v):
-        if i > 0:
-          yield ','
-        for tok in GenerateTokens(item, level + 1):
-          yield tok
-      yield ']'
-
-    elif isinstance(v, dict):
-      if level > 0:
-        yield '{'
-      for key in sorted(v):
-        if not isinstance(key, str):
-          raise ValueError('Dictionary key is not a string.')
-        if not key or key[0].isdigit() or not key.replace('_', '').isalnum():
-          raise ValueError('Dictionary key is not a valid GN identifier.')
-        yield key  # No quotations.
-        yield '='
-        for tok in GenerateTokens(v[key], level + 1):
-          yield tok
-      if level > 0:
-        yield '}'
-
-    else:  # Not supporting float: Add only when needed.
-      raise ValueError('Unsupported type when printing to GN.')
-
-  can_start = lambda tok: tok and tok not in ',}]='
-  can_end = lambda tok: tok and tok not in ',{[='
-
-  # Adds whitespaces, trying to keep everything (except dicts) in 1 line.
-  def PlainGlue(gen):
-    prev_tok = None
-    for i, tok in enumerate(gen):
-      if i > 0:
-        if can_end(prev_tok) and can_start(tok):
-          yield '\n'  # New dict item.
-        elif prev_tok == '[' and tok == ']':
-          yield '  '  # Special case for [].
-        elif tok != ',':
-          yield ' '
-      yield tok
-      prev_tok = tok
-
-  # Adds whitespaces so non-empty lists can span multiple lines, with indent.
-  def PrettyGlue(gen):
-    prev_tok = None
-    level = 0
-    for i, tok in enumerate(gen):
-      if i > 0:
-        if can_end(prev_tok) and can_start(tok):
-          yield '\n' + '  ' * level  # New dict item.
-        elif tok == '=' or prev_tok in '=':
-          yield ' '  # Separator before and after '=', on same line.
-      if tok in ']}':
-        level -= 1
-      # Exclude '[]' and '{}' cases.
-      if int(prev_tok == '[') + int(tok == ']') == 1 or \
-         int(prev_tok == '{') + int(tok == '}') == 1:
-        yield '\n' + '  ' * level
-      yield tok
-      if tok in '[{':
-        level += 1
-      if tok == ',':
-        yield '\n' + '  ' * level
-      prev_tok = tok
-
-  token_gen = GenerateTokens(value, 0)
-  ret = ''.join((PrettyGlue if pretty else PlainGlue)(token_gen))
-  # Add terminating '\n' for dict |value| or multi-line output.
-  if isinstance(value, dict) or '\n' in ret:
-    return ret + '\n'
-  return ret
-
-
-def TranslateToGnChars(s):
-  for code in s.encode('utf-8'):
-    if code in (34, 36, 92):  # For '"', '$', or '\\'.
-      yield '\\' + chr(code)
-    elif 32 <= code < 127:
-      yield chr(code)
-    else:
-      yield '$0x%02X' % code
-
-
-def LoadPythonDictionary(path):
-  file_string = open(path).read()
-  try:
-    file_data = eval(file_string, {'__builtins__': None}, None)
-  except SyntaxError as e:
-    e.filename = path
-    raise
-  except Exception as e:
-    raise Exception("Unexpected error while reading %s: %s" % (path, str(e)))
-
-  assert isinstance(file_data, dict), "%s does not eval to a dictionary" % path
-
-  # Flatten any variables to the top level.
-  if 'variables' in file_data:
-    file_data.update(file_data['variables'])
-    del file_data['variables']
-
-  # Strip all elements that this script can't process.
-  elements_to_strip = [
-    'conditions',
-    'direct_dependent_settings',
-    'target_conditions',
-    'target_defaults',
-    'targets',
-    'includes',
-    'actions',
-  ]
-  for element in elements_to_strip:
-    if element in file_data:
-      del file_data[element]
-
-  return file_data
-
-
-def ReplaceSubstrings(values, search_for, replace_with):
-  """Recursively replaces substrings in a value.
-  Replaces all substrings of the "search_for" with "replace_with" for all
-  strings occurring in "values". This is done by recursively iterating into
-  lists as well as the keys and values of dictionaries."""
-  if isinstance(values, str):
-    return values.replace(search_for, replace_with)
-
-  if isinstance(values, list):
-    result = []
-    for v in values:
-      # Remove the item from list for complete match.
-      if v == search_for and replace_with == '':
-        continue
-      result.append(ReplaceSubstrings(v, search_for, replace_with))
-    return result
-
-  if isinstance(values, dict):
-    # For dictionaries, do the search for both the key and values.
-    result = {}
-    for key, value in values.items():
-      new_key = ReplaceSubstrings(key, search_for, replace_with)
-      new_value = ReplaceSubstrings(value, search_for, replace_with)
-      result[new_key] = new_value
-    return result
-
-  # Assume everything else is unchanged.
-  return values
-
-
-def DeduplicateLists(values):
-  """Recursively remove duplicate values in lists."""
-  if isinstance(values, list):
-    return sorted(list(set(values)))
-
-  if isinstance(values, dict):
-    for key in values:
-      values[key] = DeduplicateLists(values[key])
-  return values
-
-
-def main():
-  parser = OptionParser()
-  parser.add_option("-r", "--replace", action="append",
-    help="Replaces substrings. If passed a=b, replaces all substrs a with b.")
-  (options, args) = parser.parse_args()
-
-  if len(args) != 1:
-    raise Exception("Need one argument which is the .gypi file to read.")
-
-  data = LoadPythonDictionary(args[0])
-  if options.replace:
-    # Do replacements for all specified patterns.
-    for replace in options.replace:
-      split = replace.split('=')
-      # Allow "foo=" to replace with nothing.
-      if len(split) == 1:
-        split.append('')
-      assert len(split) == 2, "Replacement must be of the form 'key=value'."
-      data = ReplaceSubstrings(data, split[0], split[1])
-
-  gn_dict = {}
-  for key in data:
-    gn_key = key.replace('-', '_')
-    # Sometimes .gypi files use the GYP syntax with percents at the end of the
-    # variable name (to indicate not to overwrite a previously-defined value):
-    #   'foo%': 'bar',
-    # Convert these to regular variables.
-    if len(key) > 1 and key[len(key) - 1] == '%':
-      gn_dict[gn_key[:-1]] = data[key]
-    else:
-      gn_dict[gn_key] = data[key]
-
-  print(ToGNString(DeduplicateLists(gn_dict)))
-
-if __name__ == '__main__':
-  try:
-    main()
-  except Exception as e:
-    print(str(e))
-    sys.exit(1)
diff --git a/tools/icu/README.md b/tools/icu/README.md
deleted file mode 100644
index 711f459696b..00000000000
--- a/tools/icu/README.md
+++ /dev/null
@@ -1,39 +0,0 @@
-# Notes about the `tools/icu` subdirectory
-
-This directory contains tools and information about the
-[International Components for Unicode][ICU] (ICU) integration.
-Both V8 and Node.js use ICU to provide internationalization functionality.
-
-* `patches/` are one-off patches, actually entire source file replacements,
-  organized by ICU version number.
-* `icu_small.json` controls the "small" (English only) ICU. It is input to
-  `icutrim.py`
-* `icu-generic.gyp` is the build file used for most ICU builds within ICU.
-  
-* `icu-system.gyp` is an alternate build file used when `--with-intl=system-icu`
-  is invoked. It builds against the `pkg-config` located ICU.
-* `iculslocs.cc` is source for the `iculslocs` utility, invoked by `icutrim.py`
-  as part of repackaging. Not used separately. See source for more details.
-* `no-op.cc` contains an empty function to convince gyp to use a C++ compiler.
-* `shrink-icu-src.py` is used during upgrade (see guide below).
-
-Note:
-
-> The files in this directory were written for the Node.js 0.12 effort.
-> The original intent was to merge the tools such as `icutrim.py` and `iculslocs.cc`
-> back into ICU. ICU has gained its own “data slicer” tool.
-> There is an issue open, 
-> for replacing `icutrim.py` with the [ICU data slicer][].
-
-## See Also
-
-* [docs/guides/maintaining-icu.md](../../doc/contributing/maintaining/maintaining-icu.md)
-  for information on maintaining ICU in Node.js
-
-* [docs/api/intl.md](../../doc/api/intl.md) for information on the
-  internationalization-related APIs in Node.js
-
-* [The ICU Homepage][ICU]
-
-[ICU]: http://icu-project.org
-[ICU data slicer]: https://github.com/unicode-org/icu/blob/HEAD/docs/userguide/icu_data/buildtool.md
diff --git a/tools/icu/current_ver.dep b/tools/icu/current_ver.dep
deleted file mode 100644
index 3d923fec865..00000000000
--- a/tools/icu/current_ver.dep
+++ /dev/null
@@ -1,6 +0,0 @@
-[
-  {
-    "url": "https://github.com/unicode-org/icu/releases/download/release-78.3/icu4c-78.3-sources.tgz",
-    "md5": "a7b736b570ef0e180c96a31715a00c78"
-  }
-]
diff --git a/tools/icu/icu-generic.gyp b/tools/icu/icu-generic.gyp
deleted file mode 100644
index c4e8c6fbb9f..00000000000
--- a/tools/icu/icu-generic.gyp
+++ /dev/null
@@ -1,555 +0,0 @@
-# Copyright (c) IBM Corporation and Others. All Rights Reserved.
-# very loosely based on icu.gyp from Chromium:
-# Copyright (c) 2012 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.
-
-
-{
-  'variables': {
-    'icu_src_derb': [
-      '<(icu_path)/source/tools/genrb/derb.c',
-      '<(icu_path)/source/tools/genrb/derb.cpp'
-    ],
-  },
-  'includes': [ '../../icu_config.gypi' ],
-  'targets': [
-    {
-      # a target for additional uconfig defines, target only
-      'target_name': 'icu_uconfig_target',
-      'type': 'none',
-      'toolsets': [ 'target' ],
-      'direct_dependent_settings': {
-        'defines': []
-      },
-    },
-    {
-      # a target to hold uconfig defines.
-      # for now these are hard coded, but could be defined.
-      'target_name': 'icu_uconfig',
-      'type': 'none',
-      'toolsets': [ 'host', 'target' ],
-      'direct_dependent_settings': {
-        'defines': [
-          'UCONFIG_NO_SERVICE=1',
-          'U_ENABLE_DYLOAD=0',
-          'U_STATIC_IMPLEMENTATION=1',
-          'U_HAVE_STD_STRING=1',
-          # TODO(srl295): reenable following pending
-          # https://code.google.com/p/v8/issues/detail?id=3345
-          # (saves some space)
-          'UCONFIG_NO_BREAK_ITERATION=0',
-        ],
-      }
-    },
-    {
-      # a target to hold common settings.
-      # make any target that is ICU implementation depend on this.
-      'target_name': 'icu_implementation',
-      'toolsets': [ 'host', 'target' ],
-      'type': 'none',
-      'direct_dependent_settings': {
-        'conditions': [
-          [ 'os_posix == 1 and OS != "mac" and OS != "ios"', {
-            'cflags': [ '-Wno-deprecated-declarations', '-Wno-strict-aliasing' ],
-            'cflags_cc': [ '-frtti' ],
-            'cflags_cc!': [ '-fno-rtti' ],
-          }],
-          [ 'OS == "mac" or OS == "ios"', {
-            'xcode_settings': {'GCC_ENABLE_CPP_RTTI': 'YES' },
-          }],
-          [ 'OS == "win"', {
-            'msvs_settings': {
-              'VCCLCompilerTool': {'RuntimeTypeInfo': 'true'},
-            }
-          }],
-        ],
-        'msvs_settings': {
-          'VCCLCompilerTool': {
-            'RuntimeTypeInfo': 'true',
-            'ExceptionHandling': '1',
-            'AdditionalOptions': [ '/source-charset:utf-8' ],
-          },
-        },
-        'configurations': {
-          # TODO: why does this need to be redefined for Release and Debug?
-          # Maybe this should be pushed into common.gypi with an "if v8 i18n"?
-          'Release': {
-            'msvs_settings': {
-              'VCCLCompilerTool': {
-                'RuntimeTypeInfo': 'true',
-                'ExceptionHandling': '1',
-              },
-            },
-          },
-          'Debug': {
-            'msvs_settings': {
-              'VCCLCompilerTool': {
-                'RuntimeTypeInfo': 'true',
-                'ExceptionHandling': '1',
-              },
-            },
-          },
-        },
-        'defines': [
-          'U_ATTRIBUTE_DEPRECATED=',
-          'U_STATIC_IMPLEMENTATION=1',
-        ],
-      },
-    },
-    {
-      'target_name': 'icui18n',
-      'toolsets': [ 'target', 'host' ],
-      'conditions' : [
-        ['_toolset=="target"', {
-          'type': '<(library)',
-          'sources': [
-            '<@(icu_src_i18n)'
-          ],
-          'include_dirs': [
-            '<(icu_path)/source/i18n',
-          ],
-          'defines': [
-            'U_I18N_IMPLEMENTATION=1',
-          ],
-          'dependencies': [ 'icuucx', 'icu_implementation', 'icu_uconfig', 'icu_uconfig_target' ],
-          'direct_dependent_settings': {
-            'include_dirs': [
-              '<(icu_path)/source/i18n',
-            ],
-          },
-          'export_dependent_settings': [ 'icuucx', 'icu_uconfig_target' ],
-        }],
-        ['_toolset=="host"', {
-          'type': 'none',
-          'dependencies': [ 'icutools#host' ],
-          'export_dependent_settings': [ 'icutools' ],
-        }],
-      ],
-    },
-    # This exports actual ICU data
-    {
-      'target_name': 'icudata',
-      'type': '<(library)',
-      'toolsets': [ 'target' ],
-      'conditions': [
-        [ 'OS == "win"', {
-          'conditions': [
-            [ 'icu_small == "false"', { # and OS=win
-              # full data - just build the full data file, then we are done.
-              'sources': [ '<(SHARED_INTERMEDIATE_DIR)/icudt<(icu_ver_major)<(icu_endianness)_dat.<(icu_asm_ext)' ],
-              'dependencies': [ 'genccode#host' ],
-              'conditions': [
-                [ 'clang==1', {
-                  'actions': [
-                    {
-                      'action_name': 'icudata',
-                      'msvs_quote_cmd': 0,
-                      'inputs': [ '<(icu_data_in)' ],
-                      'outputs': [ '<(SHARED_INTERMEDIATE_DIR)/icudt<(icu_ver_major)<(icu_endianness)_dat.<(icu_asm_ext)' ],
-                      # on Windows, we can go directly to .obj file (-o) option.
-                      # for Clang use "-c <(target_arch)" option
-                      'action': [ '<(PRODUCT_DIR)/genccode<(EXECUTABLE_SUFFIX)',
-                                  '<@(icu_asm_opts)', # -o
-                                  '-c', '<(target_arch)',
-                                  '-d', '<(SHARED_INTERMEDIATE_DIR)',
-                                  '-n', 'icudata',
-                                  '-e', 'icudt<(icu_ver_major)',
-                                  '<@(_inputs)' ],
-                    },
-                  ],
-                }, {
-                  'actions': [
-                    {
-                      'action_name': 'icudata',
-                      'msvs_quote_cmd': 0,
-                      'inputs': [ '<(icu_data_in)' ],
-                      'outputs': [ '<(SHARED_INTERMEDIATE_DIR)/icudt<(icu_ver_major)<(icu_endianness)_dat.<(icu_asm_ext)' ],
-                      # on Windows, we can go directly to .obj file (-o) option.
-                      # for MSVC do not use "-c <(target_arch)" option
-                      'action': [ '<(PRODUCT_DIR)/genccode<(EXECUTABLE_SUFFIX)',
-                                  '<@(icu_asm_opts)', # -o
-                                  '-d', '<(SHARED_INTERMEDIATE_DIR)',
-                                  '-n', 'icudata',
-                                  '-e', 'icudt<(icu_ver_major)',
-                                  '<@(_inputs)' ],
-                    },
-                  ],
-                }]
-              ],
-            }, { # icu_small == TRUE and OS == win
-              # link against stub data primarily
-              # then, use icupkg and genccode to rebuild data
-              'dependencies': [ 'icustubdata', 'genccode#host', 'icupkg#host', 'genrb#host', 'iculslocs#host' ],
-              'export_dependent_settings': [ 'icustubdata' ],
-              'actions': [
-                {
-                  # trim down ICU
-                  'action_name': 'icutrim',
-                  'msvs_quote_cmd': 0,
-                  'inputs': [ '<(icu_data_in)', 'icu_small.json' ],
-                  'outputs': [ '<(SHARED_INTERMEDIATE_DIR)/icutmp/icudt<(icu_ver_major)<(icu_endianness).dat' ],
-                  'action': [ '<(python)',
-                              'icutrim.py',
-                              '-P', '<(PRODUCT_DIR)/.', # '.' suffix is a workaround against GYP assumptions :(
-                              '-D', '<(icu_data_in)',
-                              '--delete-tmp',
-                              '-T', '<(SHARED_INTERMEDIATE_DIR)/icutmp',
-                              '-F', 'icu_small.json',
-                              '-O', 'icudt<(icu_ver_major)<(icu_endianness).dat',
-                              '-v',
-                              '-L', '<(icu_locales)'],
-                },
-                {
-                  # build final .dat -> .obj
-                  'action_name': 'genccode',
-                  'msvs_quote_cmd': 0,
-                  'inputs': [ '<(SHARED_INTERMEDIATE_DIR)/icutmp/icudt<(icu_ver_major)<(icu_endianness).dat' ],
-                  'outputs': [ '<(SHARED_INTERMEDIATE_DIR)/icudt<(icu_ver_major)<(icu_endianness)_dat.<(icu_asm_ext)' ],
-                  'action': [ '<(PRODUCT_DIR)/genccode<(EXECUTABLE_SUFFIX)',
-                              '<@(icu_asm_opts)', # -o
-                              '-c', '<(target_arch)',
-                              '-d', '<(SHARED_INTERMEDIATE_DIR)/',
-                              '-n', 'icudata',
-                              '-e', 'icusmdt<(icu_ver_major)',
-                              '<@(_inputs)' ],
-                },
-              ],
-              # This file contains the small ICU data.
-              'sources': [ '<(SHARED_INTERMEDIATE_DIR)/icudt<(icu_ver_major)<(icu_endianness)_dat.<(icu_asm_ext)' ],
-            } ] ], #end of OS==win and icu_small == true
-        }, { # OS != win
-          'conditions': [
-            [ 'icu_small == "false"', {
-              # full data - no trim needed
-              'sources': [ '<(SHARED_INTERMEDIATE_DIR)/icudt<(icu_ver_major)_dat.<(icu_asm_ext)' ],
-              'dependencies': [ 'genccode#host', 'icupkg#host', 'icu_implementation#host', 'icu_uconfig' ],
-              'include_dirs': [
-                '<(icu_path)/source/common',
-              ],
-              'actions': [
-                {
-                   # Copy the .dat file, swapping endianness if needed.
-                   'action_name': 'icupkg',
-                   'inputs': [ '<(icu_data_in)' ],
-                   'outputs':[ '<(SHARED_INTERMEDIATE_DIR)/icudt<(icu_ver_major)<(icu_endianness).dat' ],
-                   'action': [ '<(PRODUCT_DIR)/icupkg<(EXECUTABLE_SUFFIX)',
-                               '-t<(icu_endianness)',
-                               '<@(_inputs)',
-                               '<@(_outputs)',
-                             ],
-                },
-                {
-                   # Rename without the endianness marker (icudt64l.dat -> icudt64.dat)
-                   'action_name': 'copy',
-                   'inputs': [ '<(SHARED_INTERMEDIATE_DIR)/icudt<(icu_ver_major)<(icu_endianness).dat' ],
-                   'outputs':[ '<(SHARED_INTERMEDIATE_DIR)/icudt<(icu_ver_major).dat' ],
-                   'action': [ 'cp',
-                               '<@(_inputs)',
-                               '<@(_outputs)',
-                             ],
-                },
-                {
-                  # convert full ICU data file to .c, or .S, etc.
-                  'action_name': 'icudata',
-                  'inputs': [ '<(SHARED_INTERMEDIATE_DIR)/icudt<(icu_ver_major).dat' ],
-                  'outputs':[ '<(SHARED_INTERMEDIATE_DIR)/icudt<(icu_ver_major)_dat.<(icu_asm_ext)' ],
-                  'action': [ '<(PRODUCT_DIR)/genccode<(EXECUTABLE_SUFFIX)',
-                              '-e', 'icudt<(icu_ver_major)',
-                              '-d', '<(SHARED_INTERMEDIATE_DIR)',
-                              '<@(icu_asm_opts)',
-                              '-f', 'icudt<(icu_ver_major)_dat',
-                              '<@(_inputs)' ],
-                },
-              ], # end actions
-            }, { # icu_small == true ( and OS != win )
-              # link against stub data (as primary data)
-              # then, use icupkg and genccode to rebuild small data
-              'dependencies': [ 'icustubdata', 'genccode#host', 'icupkg#host', 'genrb#host', 'iculslocs#host',
-                               'icu_implementation', 'icu_uconfig' ],
-              'export_dependent_settings': [ 'icustubdata' ],
-              'actions': [
-                {
-                  # Trim down ICU.
-                  # Note that icupkg is invoked automatically, swapping endianness if needed.
-                  'action_name': 'icutrim',
-                  'inputs': [ '<(icu_data_in)', 'icu_small.json' ],
-                  'outputs': [ '<(SHARED_INTERMEDIATE_DIR)/icutmp/icudt<(icu_ver_major)<(icu_endianness).dat' ],
-                  'action': [ '<(python)',
-                              'icutrim.py',
-                              '-P', '<(PRODUCT_DIR)',
-                              '-D', '<(icu_data_in)',
-                              '--delete-tmp',
-                              '-T', '<(SHARED_INTERMEDIATE_DIR)/icutmp',
-                              '-F', 'icu_small.json',
-                              '-O', 'icudt<(icu_ver_major)<(icu_endianness).dat',
-                              '-v',
-                              '-L', '<(icu_locales)'],
-                }, {
-                  # rename to get the final entrypoint name right (icudt64l.dat -> icusmdt64.dat)
-                   'action_name': 'rename',
-                   'inputs': [ '<(SHARED_INTERMEDIATE_DIR)/icutmp/icudt<(icu_ver_major)<(icu_endianness).dat' ],
-                   'outputs': [ '<(SHARED_INTERMEDIATE_DIR)/icutmp/icusmdt<(icu_ver_major).dat' ],
-                   'action': [ 'cp',
-                               '<@(_inputs)',
-                               '<@(_outputs)',
-                             ],
-                }, {
-                  # For icu-small, always use .c, don't try to use .S, etc.
-                  'action_name': 'genccode',
-                  'inputs': [ '<(SHARED_INTERMEDIATE_DIR)/icutmp/icusmdt<(icu_ver_major).dat' ],
-                  'outputs': [ '<(SHARED_INTERMEDIATE_DIR)/icusmdt<(icu_ver_major)_dat.<(icu_asm_ext)' ],
-                  'action': [ '<(PRODUCT_DIR)/genccode<(EXECUTABLE_SUFFIX)',
-                              '<@(icu_asm_opts)',
-                              '-d', '<(SHARED_INTERMEDIATE_DIR)',
-                              '<@(_inputs)' ],
-                },
-              ],
-              # This file contains the small ICU data
-              'sources': [ '<(SHARED_INTERMEDIATE_DIR)/icusmdt<(icu_ver_major)_dat.<(icu_asm_ext)' ],
-              # for umachine.h
-              'include_dirs': [
-                '<(icu_path)/source/common',
-              ],
-            }]], # end icu_small == true
-        }]], # end OS != win
-    }, # end icudata
-    # icustubdata is a tiny (~1k) symbol with no ICU data in it.
-    # tools must link against it as they are generating the full data.
-    {
-      'target_name': 'icustubdata',
-      'type': '<(library)',
-      'toolsets': [ 'target' ],
-      'dependencies': [ 'icu_implementation' ],
-      'sources': [
-        '<@(icu_src_stubdata)'
-      ],
-      'include_dirs': [
-        '<(icu_path)/source/common',
-      ],
-    },
-    # this target is for v8 consumption.
-    # it is icuuc + stubdata
-    # it is only built for target
-    {
-      'target_name': 'icuuc',
-      'type': 'none',
-      'toolsets': [ 'target', 'host' ],
-      'conditions' : [
-        ['_toolset=="host"', {
-          'dependencies': [ 'icutools#host' ],
-          'export_dependent_settings': [ 'icutools' ],
-        }],
-        ['_toolset=="target"', {
-          'dependencies': [ 'icuucx', 'icudata' ],
-          'export_dependent_settings': [ 'icuucx', 'icudata' ],
-        }],
-      ],
-    },
-    # This is the 'real' icuuc.
-    {
-      'target_name': 'icuucx',
-      'type': '<(library)',
-      'dependencies': [ 'icu_implementation', 'icu_uconfig', 'icu_uconfig_target' ],
-      'toolsets': [ 'target' ],
-      'sources': [
-        '<@(icu_src_common)',
-      ],
-          ## if your compiler can dead-strip, this will
-          ## make ZERO difference to binary size.
-          ## Made ICU-specific for future-proofing.
-      'conditions': [
-        [ 'OS == "solaris"', { 'defines': [
-          '_XOPEN_SOURCE_EXTENDED=0',
-        ]}],
-      ],
-      'include_dirs': [
-        '<(icu_path)/source/common',
-      ],
-      'defines': [
-        'U_COMMON_IMPLEMENTATION=1',
-      ],
-      'cflags_c': ['-std=c99'],
-      'export_dependent_settings': [ 'icu_uconfig', 'icu_uconfig_target' ],
-      'direct_dependent_settings': {
-        'include_dirs': [
-          '<(icu_path)/source/common',
-        ],
-        'conditions': [
-          [ 'OS=="win"', {
-            'link_settings': {
-              'libraries': [ '-lAdvAPI32.lib', '-lUser32.lib' ],
-            },
-          }],
-        ],
-      },
-    },
-    # tools library. This builds all of ICU together.
-    {
-      'target_name': 'icutools',
-      'type': '<(library)',
-      'toolsets': [ 'host' ],
-      'dependencies': [ 'icu_implementation', 'icu_uconfig' ],
-      'sources': [
-        '<@(icu_src_tools)',
-        '<@(icu_src_common)',
-        '<@(icu_src_i18n)',
-        '<@(icu_src_stubdata)',
-      ],
-      'sources!': [
-        '<(icu_path)/source/tools/toolutil/udbgutil.cpp',
-        '<(icu_path)/source/tools/toolutil/udbgutil.h',
-        '<(icu_path)/source/tools/toolutil/dbgutil.cpp',
-        '<(icu_path)/source/tools/toolutil/dbgutil.h',
-      ],
-      'include_dirs': [
-        '<(icu_path)/source/common',
-        '<(icu_path)/source/i18n',
-        '<(icu_path)/source/tools/toolutil',
-      ],
-      'defines': [
-        'U_COMMON_IMPLEMENTATION=1',
-        'U_I18N_IMPLEMENTATION=1',
-        'U_IO_IMPLEMENTATION=1',
-        'U_TOOLUTIL_IMPLEMENTATION=1',
-        #'DEBUG=0', # http://bugs.icu-project.org/trac/ticket/10977
-      ],
-      'cflags_c': ['-std=c99'],
-      'conditions': [
-        ['OS == "solaris"', {
-          'defines': [ '_XOPEN_SOURCE_EXTENDED=0' ]
-        }]
-      ],
-      'direct_dependent_settings': {
-        'include_dirs': [
-          '<(icu_path)/source/common',
-          '<(icu_path)/source/i18n',
-          '<(icu_path)/source/tools/toolutil',
-        ],
-        'conditions': [
-          [ 'OS=="win"', {
-            'link_settings': {
-              'libraries': [ '-lAdvAPI32.lib', '-lUser32.lib' ],
-            },
-          }],
-        ],
-      },
-      'export_dependent_settings': [ 'icu_uconfig' ],
-    },
-    # This tool is needed to rebuild .res files from .txt,
-    # or to build index (res_index.txt) files for small-icu
-    {
-      'target_name': 'genrb',
-      'type': 'executable',
-      'toolsets': [ 'host' ],
-      'dependencies': [ 'icutools', 'icu_implementation' ],
-      'sources': [
-        '<@(icu_src_genrb)'
-      ],
-      # derb is a separate executable
-      # (which is not currently built)
-      'sources!': [
-        '<@(icu_src_derb)',
-        'no-op.cc',
-      ],
-      'conditions': [
-        # Avoid excessive LTO
-        ['enable_lto=="true"', {
-          'ldflags': [ '-fno-lto' ],
-        }],
-        ['node_with_ltcg=="true" or enable_lto=="true" or enable_thin_lto=="true"', {
-          'msvs_settings': {
-            'VCCLCompilerTool': {
-              'AdditionalOptions': ['-fno-lto'],
-            },
-            'VCLinkerTool': {
-              'AdditionalOptions': ['-fno-lto'],
-            },
-          },
-        }],
-      ],
-    },
-    # This tool is used to rebuild res_index.res manifests
-    {
-      'target_name': 'iculslocs',
-      'toolsets': [ 'host' ],
-      'type': 'executable',
-      'dependencies': [ 'icutools' ],
-      'sources': [
-        'iculslocs.cc',
-        'no-op.cc',
-      ],
-      'conditions': [
-        # Avoid excessive LTO
-        ['enable_lto=="true"', {
-          'ldflags': [ '-fno-lto' ],
-        }],
-        ['node_with_ltcg=="true" or enable_lto=="true" or enable_thin_lto=="true"', {
-          'msvs_settings': {
-            'VCCLCompilerTool': {
-              'AdditionalOptions': ['-fno-lto'],
-            },
-            'VCLinkerTool': {
-              'AdditionalOptions': ['-fno-lto'],
-            },
-          },
-        }],
-      ],
-    },
-    # This tool is used to package, unpackage, repackage .dat files
-    # and convert endianesses
-    {
-      'target_name': 'icupkg',
-      'toolsets': [ 'host' ],
-      'type': 'executable',
-      'dependencies': [ 'icutools' ],
-      'sources': [
-        '<@(icu_src_icupkg)',
-        'no-op.cc',
-      ],
-      'conditions': [
-        # Avoid excessive LTO
-        ['enable_lto=="true"', {
-          'ldflags': [ '-fno-lto' ],
-        }],
-        ['node_with_ltcg=="true" or enable_lto=="true" or enable_thin_lto=="true"', {
-          'msvs_settings': {
-            'VCCLCompilerTool': {
-              'AdditionalOptions': ['-fno-lto'],
-            },
-            'VCLinkerTool': {
-              'AdditionalOptions': ['-fno-lto'],
-            },
-          },
-        }],
-      ],
-    },
-    # this is used to convert .dat directly into .obj
-    {
-      'target_name': 'genccode',
-      'toolsets': [ 'host' ],
-      'type': 'executable',
-      'dependencies': [ 'icutools' ],
-      'sources': [
-        '<@(icu_src_genccode)',
-        'no-op.cc',
-      ],
-      'conditions': [
-        # Avoid excessive LTO
-        ['enable_lto=="true"', {
-          'ldflags': [ '-fno-lto' ],
-        }],
-        ['node_with_ltcg=="true" or enable_lto=="true" or enable_thin_lto=="true"', {
-          'msvs_settings': {
-            'VCCLCompilerTool': {
-              'AdditionalOptions': ['-fno-lto'],
-            },
-            'VCLinkerTool': {
-              'AdditionalOptions': ['-fno-lto'],
-            },
-          },
-        }],
-      ],
-    },
-  ],
-}
diff --git a/tools/icu/icu-system.gyp b/tools/icu/icu-system.gyp
deleted file mode 100644
index b3ca0e39b6c..00000000000
--- a/tools/icu/icu-system.gyp
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright (c) 2014 IBM Corporation and Others. All Rights Reserved.
-
-# This variant is used for the '--with-intl=system-icu' option.
-# 'configure' has already set 'libs' and 'cflags' - so,
-# there's nothing to do in these targets.
-
-{
-  'targets': [
-    {
-      'target_name': 'icuuc',
-      'type': 'none',
-      'toolsets': [ 'host', 'target' ],
-    },
-    {
-      'target_name': 'icui18n',
-      'type': 'none',
-      'toolsets': [ 'host', 'target' ],
-    },
-  ],
-}
diff --git a/tools/icu/icu_small.json b/tools/icu/icu_small.json
deleted file mode 100644
index 712998f2ade..00000000000
--- a/tools/icu/icu_small.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
-  "copyright": "Copyright (c) 2014 IBM Corporation and Others. All Rights Reserved.",
-  "comment": "icutrim.py config: Trim down ICU to just a certain locale set, needed for node.js use.",
-  "variables": {
-    "none": {
-      "only": []
-    },
-    "locales": {
-      "only": [
-        "root",
-        "en"
-      ]
-    },
-    "leavealone": {
-    }
-  },
-  "trees": {
-    "ROOT": "locales",
-    "brkitr": "none",
-    "coll": "locales",
-    "curr": "locales",
-    "lang": "none",
-    "rbnf": "none",
-    "region": "none",
-    "zone": "locales",
-    "converters": "none",
-    "stringprep": "locales",
-    "translit": "locales",
-    "brkfiles": "none",
-    "brkdict": "none",
-    "confusables": "none",
-    "unit": "locales"
-  },
-  "remove": [
-    "cnvalias.icu",
-    "postalCodeData.res",
-    "genderList.res",
-    "brkitr/root.res",
-    "unames.icu"
-  ],
-  "keep": [
-    "pool.res",
-    "supplementalData.res",
-    "zoneinfo64.res",
-    "likelySubtags.res"
-  ]
-}
diff --git a/tools/icu/icu_versions.json b/tools/icu/icu_versions.json
deleted file mode 100644
index e635d9b841a..00000000000
--- a/tools/icu/icu_versions.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-    "minimum_icu": 73
-}
diff --git a/tools/icu/iculslocs.cc b/tools/icu/iculslocs.cc
deleted file mode 100644
index 85cf1f77c35..00000000000
--- a/tools/icu/iculslocs.cc
+++ /dev/null
@@ -1,402 +0,0 @@
-/*
-**********************************************************************
-*   Copyright (C) 2014, International Business Machines
-*   Corporation and others.  All Rights Reserved.
-**********************************************************************
-*
-* Created 2014-06-20 by Steven R. Loomis
-*
-* See: http://bugs.icu-project.org/trac/ticket/10922
-*
-*/
-
-/*
-WHAT IS THIS?
-
-Here's the problem: It's difficult to reconfigure ICU from the command
-line without using the full makefiles. You can do a lot, but not
-everything.
-
-Consider:
-
- $ icupkg -r 'ja*' icudt53l.dat
-
-Great, you've now removed the (main) Japanese data. But something's
-still wrong-- res_index (and thus, getAvailable* functions) still
-claim the locale is present.
-
-You are reading the source to a tool (using only public API C code)
-that can solve this problem. Use as follows:
-
- $ iculslocs -i . -N icudt53l -b res_index.txt
-
-.. Generates a NEW res_index.txt (by looking at the .dat file, and
-figuring out which locales are actually available. Has commented out
-the ones which are no longer available:
-
-          ...
-          it_SM {""}
-//        ja {""}
-//        ja_JP {""}
-          jgo {""}
-          ...
-
-Then you can build and in-place patch it with existing ICU tools:
- $ genrb res_index.txt
- $ icupkg -a res_index.res icudt53l.dat
-
-.. Now you have a patched icudt539.dat that not only doesn't have
-Japanese, it doesn't *claim* to have Japanese.
-
-*/
-
-#include 
-#include "charstr.h"  // ICU internal header
-#include 
-#include 
-#include 
-#include 
-
-const char* PROG = "iculslocs";
-const char* NAME = U_ICUDATA_NAME;  // assume ICU data
-const char* TREE = "ROOT";
-int VERBOSE = 0;
-
-#define RES_INDEX "res_index"
-#define INSTALLEDLOCALES "InstalledLocales"
-
-icu::CharString packageName;
-const char* locale = RES_INDEX;  // locale referring to our index
-
-void usage() {
-  printf("Usage: %s [options]\n", PROG);
-  printf(
-      "This program lists and optionally regenerates the locale "
-      "manifests\n"
-      " in ICU 'res_index.res' files.\n");
-  printf(
-      "  -i ICUDATA  Set ICUDATA dir to ICUDATA.\n"
-      "    NOTE: this must be the first option given.\n");
-  printf("  -h          This Help\n");
-  printf("  -v          Verbose Mode on\n");
-  printf("  -l          List locales to stdout\n");
-  printf(
-      "               if Verbose mode, then missing (unopenable)"
-      "locales\n"
-      "               will be listed preceded by a '#'.\n");
-  printf(
-      "  -b res_index.txt  Write 'corrected' bundle "
-      "to res_index.txt\n"
-      "                    missing bundles will be "
-      "OMITTED\n");
-  printf(
-      "  -T TREE     Choose tree TREE\n"
-      "         (TREE should be one of: \n"
-      "    ROOT, brkitr, coll, curr, lang, rbnf, region, zone)\n");
-  // see ureslocs.h and elsewhere
-  printf(
-      "  -N NAME     Choose name NAME\n"
-      "         (default: '%s')\n",
-      U_ICUDATA_NAME);
-  printf(
-      "\nNOTE: for best results, this tool ought to be "
-      "linked against\n"
-      "stubdata. i.e. '%s -l' SHOULD return an error with "
-      " no data.\n",
-      PROG);
-}
-
-#define ASSERT_SUCCESS(status, what)      \
-  if (U_FAILURE(*status)) {               \
-    printf("%s:%d: %s: ERROR: %s %s\n", \
-             __FILE__,                    \
-             __LINE__,                    \
-             PROG,                        \
-             u_errorName(*status),        \
-             what);                       \
-    return 1;                             \
-  }
-
-/**
- * @param status changed from reference to pointer to match node.js style
- */
-void calculatePackageName(UErrorCode* status) {
-  packageName.clear();
-  if (strcmp(NAME, "NONE")) {
-    packageName.append(NAME, *status);
-    if (strcmp(TREE, "ROOT")) {
-      packageName.append(U_TREE_SEPARATOR_STRING, *status);
-      packageName.append(TREE, *status);
-    }
-  }
-  if (VERBOSE) {
-    printf("packageName: %s\n", packageName.data());
-  }
-}
-
-/**
- * Does the locale exist?
- * return zero for false, or nonzero if it was openable.
- * Assumes calculatePackageName was called.
- * @param exists set to TRUE if exists, FALSE otherwise.
- * Changed from reference to pointer to match node.js style
- * @returns 0 on "OK" (success or resource-missing),
- * 1 on "FAILURE" (unexpected error)
- */
-int localeExists(const char* loc, UBool* exists) {
-  UErrorCode status = U_ZERO_ERROR;
-  if (VERBOSE > 1) {
-    printf("Trying to open %s:%s\n", packageName.data(), loc);
-  }
-  icu::LocalUResourceBundlePointer aResource(
-      ures_openDirect(packageName.data(), loc, &status));
-  *exists = false;
-  if (U_SUCCESS(status)) {
-    *exists = true;
-    if (VERBOSE > 1) {
-      printf("%s:%s existed!\n", packageName.data(), loc);
-    }
-    return 0;
-  } else if (status == U_MISSING_RESOURCE_ERROR) {
-    *exists = false;
-    if (VERBOSE > 1) {
-      printf("%s:%s did NOT exist (%s)!\n",
-             packageName.data(),
-             loc,
-             u_errorName(status));
-    }
-    return 0;  // "good" failure
-  } else {
-    // some other failure..
-    printf("%s:%d: %s: ERROR %s opening %s for test.\n",
-           __FILE__,
-           __LINE__,
-           u_errorName(status),
-           packageName.data(),
-           loc);
-    return 1;  // abort
-  }
-}
-
-void printIndent(FILE* bf, int indent) {
-  for (int i = 0; i < indent + 1; i++) {
-    fprintf(bf, "    ");
-  }
-}
-
-/**
- * Dumps a table resource contents
- * if lev==0, skips INSTALLEDLOCALES
- * @returns 0 for OK, 1 for err
- */
-int dumpAllButInstalledLocales(int lev,
-                               icu::LocalUResourceBundlePointer* bund,
-                               FILE* bf,
-                               UErrorCode* status) {
-  ures_resetIterator(bund->getAlias());
-  icu::LocalUResourceBundlePointer t;
-  while (U_SUCCESS(*status) && ures_hasNext(bund->getAlias())) {
-    t.adoptInstead(ures_getNextResource(bund->getAlias(), t.orphan(), status));
-    ASSERT_SUCCESS(status, "while processing table");
-    const char* key = ures_getKey(t.getAlias());
-    if (VERBOSE > 1) {
-      printf("dump@%d: got key %s\n", lev, key);
-    }
-    if (lev == 0 && !strcmp(key, INSTALLEDLOCALES)) {
-      if (VERBOSE > 1) {
-        printf("dump: skipping '%s' as it must be evaluated.\n", key);
-      }
-    } else {
-      printIndent(bf, lev);
-      fprintf(bf, "%s", key);
-      const UResType type = ures_getType(t.getAlias());
-      switch (type) {
-        case URES_STRING: {
-          int32_t len = 0;
-          const UChar* s = ures_getString(t.getAlias(), &len, status);
-          ASSERT_SUCCESS(status, "getting string");
-          fprintf(bf, ":string {\"");
-          fwrite(s, len, 1, bf);
-          fprintf(bf, "\"}");
-        } break;
-        case URES_TABLE: {
-          fprintf(bf, ":table {\n");
-          dumpAllButInstalledLocales(lev+1, &t, bf, status);
-          printIndent(bf, lev);
-          fprintf(bf, "}\n");
-        } break;
-        default: {
-          printf("ERROR: unhandled type %d for key %s "
-                 "in dumpAllButInstalledLocales().\n",
-                 static_cast(type), key);
-          return 1;
-        } break;
-      }
-      fprintf(bf, "\n");
-    }
-  }
-  return 0;
-}
-
-int list(const char* toBundle) {
-  UErrorCode status = U_ZERO_ERROR;
-
-  FILE* bf = nullptr;
-
-  if (toBundle != nullptr) {
-    if (VERBOSE) {
-      printf("writing to bundle %s\n", toBundle);
-    }
-    bf = fopen(toBundle, "wb");
-    if (bf == nullptr) {
-      printf("ERROR: Could not open '%s' for writing.\n", toBundle);
-      return 1;
-    }
-    fprintf(bf, "\xEF\xBB\xBF");  // write UTF-8 BOM
-    fprintf(bf, "// -*- Coding: utf-8; -*-\n//\n");
-  }
-
-  // first, calculate the bundle name.
-  calculatePackageName(&status);
-  ASSERT_SUCCESS(&status, "calculating package name");
-
-  if (VERBOSE) {
-    printf("\"locale\": %s\n", locale);
-  }
-
-  icu::LocalUResourceBundlePointer bund(
-      ures_openDirect(packageName.data(), locale, &status));
-  ASSERT_SUCCESS(&status, "while opening the bundle");
-  icu::LocalUResourceBundlePointer installedLocales(
-      // NOLINTNEXTLINE (readability/null_usage)
-      ures_getByKey(bund.getAlias(), INSTALLEDLOCALES, nullptr, &status));
-  ASSERT_SUCCESS(&status, "while fetching installed locales");
-
-  int32_t count = ures_getSize(installedLocales.getAlias());
-  if (VERBOSE) {
-    printf("Locales: %d\n", count);
-  }
-
-  if (bf != nullptr) {
-    // write the HEADER
-    fprintf(bf,
-            "// NOTE: This file was generated during the build process.\n"
-            "// Generator: tools/icu/iculslocs.cc\n"
-            "// Input package-tree/item: %s/%s.res\n",
-            packageName.data(),
-            locale);
-    fprintf(bf,
-            "%s:table(nofallback) {\n"
-            "    // First, everything besides InstalledLocales:\n",
-            locale);
-    if (dumpAllButInstalledLocales(0, &bund, bf, &status)) {
-      printf("Error dumping prolog for %s\n", toBundle);
-      fclose(bf);
-      return 1;
-    }
-    // in case an error was missed
-    ASSERT_SUCCESS(&status, "while writing prolog");
-
-    fprintf(bf,
-            "    %s:table { // %d locales in input %s.res\n",
-            INSTALLEDLOCALES,
-            count,
-            locale);
-  }
-
-  // OK, now list them.
-  icu::LocalUResourceBundlePointer subkey;
-
-  int validCount = 0;
-  for (int32_t i = 0; i < count; i++) {
-    subkey.adoptInstead(ures_getByIndex(
-        installedLocales.getAlias(), i, subkey.orphan(), &status));
-    ASSERT_SUCCESS(&status, "while fetching an installed locale's name");
-
-    const char* key = ures_getKey(subkey.getAlias());
-    if (VERBOSE > 1) {
-      printf("@%d: %s\n", i, key);
-    }
-    // now, see if the locale is installed..
-
-    UBool exists;
-    if (localeExists(key, &exists)) {
-      if (bf != nullptr) fclose(bf);
-      return 1;  // get out.
-    }
-    if (exists) {
-      validCount++;
-      printf("%s\n", key);
-      if (bf != nullptr) {
-        fprintf(bf, "        %s {\"\"}\n", key);
-      }
-    } else {
-      if (bf != nullptr) {
-        fprintf(bf, "//      %s {\"\"}\n", key);
-      }
-      if (VERBOSE) {
-        printf("#%s\n", key);  // verbosity one - '' vs '#'
-      }
-    }
-  }
-
-  if (bf != nullptr) {
-    fprintf(bf, "    } // %d/%d valid\n", validCount, count);
-    // write the HEADER
-    fprintf(bf, "}\n");
-    fclose(bf);
-  }
-
-  return 0;
-}
-
-int main(int argc, const char* argv[]) {
-  PROG = argv[0];
-  for (int i = 1; i < argc; i++) {
-    const char* arg = argv[i];
-    int argsLeft = argc - i - 1; /* how many remain? */
-    if (!strcmp(arg, "-v")) {
-      VERBOSE++;
-    } else if (!strcmp(arg, "-i") && (argsLeft >= 1)) {
-      if (i != 1) {
-        printf("ERROR: -i must be the first argument given.\n");
-        usage();
-        return 1;
-      }
-      const char* dir = argv[++i];
-      u_setDataDirectory(dir);
-      if (VERBOSE) {
-        printf("ICUDATA is now %s\n", dir);
-      }
-    } else if (!strcmp(arg, "-T") && (argsLeft >= 1)) {
-      TREE = argv[++i];
-      if (VERBOSE) {
-        printf("TREE is now %s\n", TREE);
-      }
-    } else if (!strcmp(arg, "-N") && (argsLeft >= 1)) {
-      NAME = argv[++i];
-      if (VERBOSE) {
-        printf("NAME is now %s\n", NAME);
-      }
-    } else if (!strcmp(arg, "-?") || !strcmp(arg, "-h")) {
-      usage();
-      return 0;
-    } else if (!strcmp(arg, "-l")) {
-      if (list(nullptr)) {
-        return 1;
-      }
-    } else if (!strcmp(arg, "-b") && (argsLeft >= 1)) {
-      if (list(argv[++i])) {
-        return 1;
-      }
-    } else {
-      printf("Unknown or malformed option: %s\n", arg);
-      usage();
-      return 1;
-    }
-  }
-}
-
-// Local Variables:
-// compile-command: "icurun iculslocs.cpp"
-// End:
diff --git a/tools/icu/icutrim.py b/tools/icu/icutrim.py
deleted file mode 100755
index 4441550df09..00000000000
--- a/tools/icu/icutrim.py
+++ /dev/null
@@ -1,355 +0,0 @@
-#!/usr/bin/python
-#
-# Copyright (C) 2014 IBM Corporation and Others. All Rights Reserved.
-#
-# @author Steven R. Loomis 
-#
-# This tool slims down an ICU data (.dat) file according to a config file.
-#
-# See: http://bugs.icu-project.org/trac/ticket/10922
-#
-# Usage:
-#  Use "-h" to get help options.
-
-from __future__ import print_function
-
-import io
-import json
-import optparse
-import os
-import re
-import shutil
-import sys
-
-try:
-    # for utf-8 on Python 2
-    reload(sys)
-    sys.setdefaultencoding("utf-8")
-except NameError:
-    pass  # Python 3 already defaults to utf-8
-
-try:
-    basestring        # Python 2
-except NameError:
-    basestring = str  # Python 3
-
-endian=sys.byteorder
-
-parser = optparse.OptionParser(usage="usage: mkdir tmp ; %prog -D ~/Downloads/icudt53l.dat -T tmp -F trim_en.json -O icudt53l.dat" )
-
-parser.add_option("-P","--tool-path",
-                    action="store",
-                    dest="toolpath",
-                    help="set the prefix directory for ICU tools")
-
-parser.add_option("-D","--input-file",
-                    action="store",
-                    dest="datfile",
-                    help="input data file (icudt__.dat)",
-                    )  # required
-
-parser.add_option("-F","--filter-file",
-                    action="store",
-                    dest="filterfile",
-                    help="filter file (JSON format)",
-                    )  # required
-
-parser.add_option("-T","--tmp-dir",
-                    action="store",
-                    dest="tmpdir",
-                    help="working directory.",
-                    )  # required
-
-parser.add_option("--delete-tmp",
-                    action="count",
-                    dest="deltmpdir",
-                    help="delete working directory.",
-                    default=0)
-
-parser.add_option("-O","--outfile",
-                    action="store",
-                    dest="outfile",
-                    help="outfile  (NOT a full path)",
-                    )  # required
-
-parser.add_option("-v","--verbose",
-                    action="count",
-                    default=0)
-
-parser.add_option('-L',"--locales",
-                  action="store",
-                  dest="locales",
-                  help="sets the 'locales.only' variable",
-                  default=None)
-
-parser.add_option('-e', '--endian', action='store', dest='endian', help='endian, big, little or host, your default is "%s".' % endian, default=endian, metavar='endianness')
-
-(options, args) = parser.parse_args()
-
-optVars = vars(options)
-
-for opt in [ "datfile", "filterfile", "tmpdir", "outfile" ]:
-    if optVars[opt] is None:
-        print("Missing required option: %s" % opt)
-        sys.exit(1)
-
-if options.verbose>0:
-    print("Options: "+str(options))
-
-if (os.path.isdir(options.tmpdir) and options.deltmpdir):
-  if options.verbose>1:
-    print("Deleting tmp dir %s.." % (options.tmpdir))
-  shutil.rmtree(options.tmpdir)
-
-if not (os.path.isdir(options.tmpdir)):
-    os.mkdir(options.tmpdir)
-else:
-    print("Please delete tmpdir %s before beginning." % options.tmpdir)
-    sys.exit(1)
-
-if options.endian not in ("big","little","host"):
-    print("Unknown endianness: %s" % options.endian)
-    sys.exit(1)
-
-if options.endian == "host":
-    options.endian = endian
-
-if not os.path.isdir(options.tmpdir):
-    print("Error, tmpdir not a directory: %s" % (options.tmpdir))
-    sys.exit(1)
-
-if not os.path.isfile(options.filterfile):
-    print("Filterfile doesn't exist: %s" % (options.filterfile))
-    sys.exit(1)
-
-if not os.path.isfile(options.datfile):
-    print("Datfile doesn't exist: %s" % (options.datfile))
-    sys.exit(1)
-
-if not options.datfile.endswith(".dat"):
-    print("Datfile doesn't end with .dat: %s" % (options.datfile))
-    sys.exit(1)
-
-outfile = os.path.join(options.tmpdir, options.outfile)
-
-if os.path.isfile(outfile):
-    print("Error, output file does exist: %s" % (outfile))
-    sys.exit(1)
-
-if not options.outfile.endswith(".dat"):
-    print("Outfile doesn't end with .dat: %s" % (options.outfile))
-    sys.exit(1)
-
-dataname=options.outfile[0:-4]
-
-
-## TODO: need to improve this. Quotes, etc.
-def runcmd(tool, cmd, doContinue=False):
-    if(options.toolpath):
-        cmd = os.path.join(options.toolpath, tool) + " " + cmd
-    else:
-        cmd = tool + " " + cmd
-
-    if(options.verbose>4):
-        print("# " + cmd)
-
-    rc = os.system(cmd)
-    if rc != 0 and not doContinue:
-        print("FAILED: %s" % cmd)
-        sys.exit(1)
-    return rc
-
-## STEP 0 - read in json config
-with io.open(options.filterfile, encoding='utf-8') as fi:
-    config = json.load(fi)
-
-if options.locales:
-    config["variables"] = config.get("variables", {})
-    config["variables"]["locales"] = config["variables"].get("locales", {})
-    config["variables"]["locales"]["only"] = options.locales.split(',')
-
-if options.verbose > 6:
-    print(config)
-
-if "comment" in config:
-    print("%s: %s" % (options.filterfile, config["comment"]))
-
-## STEP 1 - copy the data file, swapping endianness
-## The first letter of endian_letter will be 'b' or 'l' for big or little
-endian_letter = options.endian[0]
-
-runcmd("icupkg", "-t%s %s %s""" % (endian_letter, options.datfile, outfile))
-
-## STEP 2 - get listing
-listfile = os.path.join(options.tmpdir,"icudata.lst")
-runcmd("icupkg", "-l %s > %s""" % (outfile, listfile))
-
-with open(listfile, 'rb') as fi:
-    items = [line.strip() for line in fi.read().decode("utf-8").splitlines()]
-itemset = set(items)
-
-if options.verbose > 1:
-    print("input file: %d items" % len(items))
-
-# list of all trees
-trees = {}
-RES_INDX = "res_index.res"
-remove = None
-# remove - always remove these
-if "remove" in config:
-    remove = set(config["remove"])
-else:
-    remove = set()
-
-# keep - always keep these
-if "keep" in config:
-    keep = set(config["keep"])
-else:
-    keep = set()
-
-def queueForRemoval(tree):
-    global remove
-    if tree not in config.get("trees", {}):
-        return
-    mytree = trees[tree]
-    if options.verbose > 0:
-        print("* %s: %d items" % (tree, len(mytree["locs"])))
-    # do varible substitution for this tree here
-    if isinstance(config["trees"][tree], basestring):
-        treeStr = config["trees"][tree]
-        if options.verbose > 5:
-            print(" Substituting $%s for tree %s" % (treeStr, tree))
-        if treeStr not in config.get("variables", {}):
-            print(" ERROR: no variable:  variables.%s for tree %s" % (treeStr, tree))
-            sys.exit(1)
-        config["trees"][tree] = config["variables"][treeStr]
-    myconfig = config["trees"][tree]
-    if options.verbose > 4:
-        print(" Config: %s" % (myconfig))
-    # Process this tree
-    if(len(myconfig)==0 or len(mytree["locs"])==0):
-        if(options.verbose>2):
-            print(" No processing for %s - skipping" % (tree))
-    else:
-        only = None
-        if "only" in myconfig:
-            only = set(myconfig["only"])
-            if (len(only)==0) and (mytree["treeprefix"] != ""):
-                thePool = "%spool.res" % (mytree["treeprefix"])
-                if (thePool in itemset):
-                    if(options.verbose>0):
-                        print("Removing %s because tree %s is empty." % (thePool, tree))
-                    remove.add(thePool)
-        else:
-            print("tree %s - no ONLY")
-        for l in range(len(mytree["locs"])):
-            loc = mytree["locs"][l]
-            if (only is not None) and not loc in only:
-                # REMOVE loc
-                toRemove = "%s%s%s" % (mytree["treeprefix"], loc, mytree["extension"])
-                if(options.verbose>6):
-                    print("Queueing for removal: %s" % toRemove)
-                remove.add(toRemove)
-
-def addTreeByType(tree, mytree):
-    if(options.verbose>1):
-        print("(considering %s): %s" % (tree, mytree))
-    trees[tree] = mytree
-    mytree["locs"]=[]
-    for i in range(len(items)):
-        item = items[i]
-        if item.startswith(mytree["treeprefix"]) and item.endswith(mytree["extension"]):
-            mytree["locs"].append(item[len(mytree["treeprefix"]):-4])
-    # now, process
-    queueForRemoval(tree)
-
-addTreeByType("converters",{"treeprefix":"", "extension":".cnv"})
-addTreeByType("stringprep",{"treeprefix":"", "extension":".spp"})
-addTreeByType("translit",{"treeprefix":"translit/", "extension":".res"})
-addTreeByType("brkfiles",{"treeprefix":"brkitr/", "extension":".brk"})
-addTreeByType("brkdict",{"treeprefix":"brkitr/", "extension":"dict"})
-addTreeByType("confusables",{"treeprefix":"", "extension":".cfu"})
-
-for i in range(len(items)):
-    item = items[i]
-    if item.endswith(RES_INDX):
-        treeprefix = item[0:item.rindex(RES_INDX)]
-        tree = None
-        if treeprefix == "":
-            tree = "ROOT"
-        else:
-            tree = treeprefix[0:-1]
-        if(options.verbose>6):
-            print("procesing %s" % (tree))
-        trees[tree] = { "extension": ".res", "treeprefix": treeprefix, "hasIndex": True }
-        # read in the resource list for the tree
-        treelistfile = os.path.join(options.tmpdir,"%s.lst" % tree)
-        runcmd("iculslocs", "-i %s -N %s -T %s -l > %s" % (outfile, dataname, tree, treelistfile))
-        with io.open(treelistfile, 'r', encoding='utf-8') as fi:
-            treeitems = fi.readlines()
-            trees[tree]["locs"] = [line.strip() for line in treeitems]
-        if tree not in config.get("trees", {}):
-            print(" Warning: filter file %s does not mention trees.%s - will be kept as-is" % (options.filterfile, tree))
-        else:
-            queueForRemoval(tree)
-
-def removeList(count=0):
-    # don't allow "keep" items to creep in here.
-    global remove
-    remove = remove - keep
-    if(count > 10):
-        print("Giving up - %dth attempt at removal." % count)
-        sys.exit(1)
-    if(options.verbose>1):
-        print("%d items to remove - try #%d" % (len(remove),count))
-    if(len(remove)>0):
-        oldcount = len(remove)
-        hackerrfile=os.path.join(options.tmpdir, "REMOVE.err")
-        removefile = os.path.join(options.tmpdir, "REMOVE.lst")
-        with open(removefile, 'wb') as fi:
-            fi.write('\n'.join(remove).encode("utf-8") + b'\n')
-        rc = runcmd("icupkg","-r %s %s 2> %s" %  (removefile,outfile,hackerrfile),True)
-        if rc != 0:
-            if(options.verbose>5):
-                print("## Damage control, trying to parse stderr from icupkg..")
-            fi = open(hackerrfile, 'rb')
-            erritems = fi.readlines()
-            fi.close()
-            #Item zone/zh_Hant_TW.res depends on missing item zone/zh_Hant.res
-            pat = re.compile(br"^Item ([^ ]+) depends on missing item ([^ ]+).*")
-            for i in range(len(erritems)):
-                line = erritems[i].strip()
-                m = pat.match(line)
-                if m:
-                    toDelete = m.group(1).decode("utf-8")
-                    if(options.verbose > 5):
-                        print("<< %s added to delete" % toDelete)
-                    remove.add(toDelete)
-                else:
-                    print("ERROR: could not match errline: %s" % line)
-                    sys.exit(1)
-            if(options.verbose > 5):
-                print(" now %d items to remove" % len(remove))
-            if(oldcount == len(remove)):
-                print(" ERROR: could not add any mor eitems to remove. Fail.")
-                sys.exit(1)
-            removeList(count+1)
-
-# fire it up
-removeList(1)
-
-# now, fixup res_index, one at a time
-for tree, value in trees.items():
-    # skip trees that don't have res_index
-    if "hasIndex" not in value:
-        continue
-    treebunddir = options.tmpdir
-    if(value["treeprefix"]):
-        treebunddir = os.path.join(treebunddir, value["treeprefix"])
-    if not (os.path.isdir(treebunddir)):
-        os.mkdir(treebunddir)
-    treebundres = os.path.join(treebunddir,RES_INDX)
-    treebundtxt = "%s.txt" % (treebundres[0:-4])
-    runcmd("iculslocs", "-i %s -N %s -T %s -b %s" % (outfile, dataname, tree, treebundtxt))
-    runcmd("genrb","-d %s -s %s res_index.txt" % (treebunddir, treebunddir))
-    runcmd("icupkg","-s %s -a %s%s %s" % (options.tmpdir, value["treeprefix"], RES_INDX, outfile))
diff --git a/tools/icu/no-op.cc b/tools/icu/no-op.cc
deleted file mode 100644
index 08d1599a264..00000000000
--- a/tools/icu/no-op.cc
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
-**********************************************************************
-*   Copyright (C) 2014, International Business Machines
-*   Corporation and others.  All Rights Reserved.
-**********************************************************************
-*
-*/
-
-//
-// ICU needs the C++, not the C linker to be used, even if the main function
-// is in C.
-//
-// This is a dummy function just to get gyp to compile some internal
-// tools as C++.
-//
-// It should not appear in production node binaries.
-
-extern void icu_dummy_cxx() {}
diff --git a/tools/icu/patches/75/source/common/unicode/platform.h b/tools/icu/patches/75/source/common/unicode/platform.h
deleted file mode 100644
index 59176005f33..00000000000
--- a/tools/icu/patches/75/source/common/unicode/platform.h
+++ /dev/null
@@ -1,849 +0,0 @@
-// © 2016 and later: Unicode, Inc. and others.
-// License & terms of use: http://www.unicode.org/copyright.html
-/*
-******************************************************************************
-*
-*   Copyright (C) 1997-2016, International Business Machines
-*   Corporation and others.  All Rights Reserved.
-*
-******************************************************************************
-*
-*  FILE NAME : platform.h
-*
-*   Date        Name        Description
-*   05/13/98    nos         Creation (content moved here from ptypes.h).
-*   03/02/99    stephen     Added AS400 support.
-*   03/30/99    stephen     Added Linux support.
-*   04/13/99    stephen     Reworked for autoconf.
-******************************************************************************
-*/
-
-#ifndef _PLATFORM_H
-#define _PLATFORM_H
-
-#include "unicode/uconfig.h"
-#include "unicode/uvernum.h"
-
-/**
- * \file
- * \brief Basic types for the platform.
- *
- * This file used to be generated by autoconf/configure.
- * Starting with ICU 49, platform.h is a normal source file,
- * to simplify cross-compiling and working with non-autoconf/make build systems.
- *
- * When a value in this file does not work on a platform, then please
- * try to derive it from the U_PLATFORM value
- * (for which we might need a new value constant in rare cases)
- * and/or from other macros that are predefined by the compiler
- * or defined in standard (POSIX or platform or compiler) headers.
- *
- * As a temporary workaround, you can add an explicit \#define for some macros
- * before it is first tested, or add an equivalent -D macro definition
- * to the compiler's command line.
- *
- * Note: Some compilers provide ways to show the predefined macros.
- * For example, with gcc you can compile an empty .c file and have the compiler
- * print the predefined macros with
- * \code
- * gcc -E -dM -x c /dev/null | sort
- * \endcode
- * (You can provide an actual empty .c file rather than /dev/null.
- * -x c++ is for C++.)
- */
-
-/**
- * Define some things so that they can be documented.
- * @internal
- */
-#ifdef U_IN_DOXYGEN
-/*
- * Problem: "platform.h:335: warning: documentation for unknown define U_HAVE_STD_STRING found." means that U_HAVE_STD_STRING is not documented.
- * Solution: #define any defines for non @internal API here, so that they are visible in the docs.  If you just set PREDEFINED in Doxyfile.in,  they won't be documented.
- */
-
-/* None for now. */
-#endif
-
-/**
- * \def U_PLATFORM
- * The U_PLATFORM macro defines the platform we're on.
- *
- * We used to define one different, value-less macro per platform.
- * That made it hard to know the set of relevant platforms and macros,
- * and hard to deal with variants of platforms.
- *
- * Starting with ICU 49, we define platforms as numeric macros,
- * with ranges of values for related platforms and their variants.
- * The U_PLATFORM macro is set to one of these values.
- *
- * Historical note from the Solaris Wikipedia article:
- * AT&T and Sun collaborated on a project to merge the most popular Unix variants
- * on the market at that time: BSD, System V, and Xenix.
- * This became Unix System V Release 4 (SVR4).
- *
- * @internal
- */
-
-/** Unknown platform. @internal */
-#define U_PF_UNKNOWN 0
-/** Windows @internal */
-#define U_PF_WINDOWS 1000
-/** MinGW. Windows, calls to Win32 API, but using GNU gcc and binutils. @internal */
-#define U_PF_MINGW 1800
-/**
- * Cygwin. Windows, calls to cygwin1.dll for Posix functions,
- * using MSVC or GNU gcc and binutils.
- * @internal
- */
-#define U_PF_CYGWIN 1900
-/* Reserve 2000 for U_PF_UNIX? */
-/** HP-UX is based on UNIX System V. @internal */
-#define U_PF_HPUX 2100
-/** Solaris is a Unix operating system based on SVR4. @internal */
-#define U_PF_SOLARIS 2600
-/** BSD is a UNIX operating system derivative. @internal */
-#define U_PF_BSD 3000
-/** AIX is based on UNIX System V Releases and 4.3 BSD. @internal */
-#define U_PF_AIX 3100
-/** IRIX is based on UNIX System V with BSD extensions. @internal */
-#define U_PF_IRIX 3200
-/**
- * Darwin is a POSIX-compliant operating system, composed of code developed by Apple,
- * as well as code derived from NeXTSTEP, BSD, and other projects,
- * built around the Mach kernel.
- * Darwin forms the core set of components upon which Mac OS X, Apple TV, and iOS are based.
- * (Original description modified from WikiPedia.)
- * @internal
- */
-#define U_PF_DARWIN 3500
-/** iPhone OS (iOS) is a derivative of Mac OS X. @internal */
-#define U_PF_IPHONE 3550
-/** QNX is a commercial Unix-like real-time operating system related to BSD. @internal */
-#define U_PF_QNX 3700
-/** Linux is a Unix-like operating system. @internal */
-#define U_PF_LINUX 4000
-/**
- * Native Client is pretty close to Linux.
- * See https://developer.chrome.com/native-client and
- *  http://www.chromium.org/nativeclient
- *  @internal
- */
-#define U_PF_BROWSER_NATIVE_CLIENT 4020
-/** Android is based on Linux. @internal */
-#define U_PF_ANDROID 4050
-/** Fuchsia is a POSIX-ish platform. @internal */
-#define U_PF_FUCHSIA 4100
-/* Maximum value for Linux-based platform is 4499 */
-/**
- * Emscripten is a C++ transpiler for the Web that can target asm.js or
- * WebAssembly. It provides some POSIX-compatible wrappers and stubs and
- * some Linux-like functionality, but is not fully compatible with
- * either.
- * @internal
- */
-#define U_PF_EMSCRIPTEN 5010
-/** z/OS is the successor to OS/390 which was the successor to MVS. @internal */
-#define U_PF_OS390 9000
-/** "IBM i" is the current name of what used to be i5/OS and earlier OS/400. @internal */
-#define U_PF_OS400 9400
-
-#ifdef U_PLATFORM
-    /* Use the predefined value. */
-#elif defined(__MINGW32__)
-#   define U_PLATFORM U_PF_MINGW
-#elif defined(__CYGWIN__)
-#   define U_PLATFORM U_PF_CYGWIN
-#elif defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64)
-#   define U_PLATFORM U_PF_WINDOWS
-#elif defined(__ANDROID__)
-#   define U_PLATFORM U_PF_ANDROID
-    /* Android wchar_t support depends on the API level. */
-#   include 
-#elif defined(__pnacl__) || defined(__native_client__)
-#   define U_PLATFORM U_PF_BROWSER_NATIVE_CLIENT
-#elif defined(__Fuchsia__)
-#   define U_PLATFORM U_PF_FUCHSIA
-#elif defined(linux) || defined(__linux__) || defined(__linux)
-#   define U_PLATFORM U_PF_LINUX
-#elif defined(__APPLE__) && defined(__MACH__)
-#   include 
-#   if (defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE) && (defined(TARGET_OS_MACCATALYST) && !TARGET_OS_MACCATALYST)   /* variant of TARGET_OS_MAC */
-#       define U_PLATFORM U_PF_IPHONE
-#   else
-#       define U_PLATFORM U_PF_DARWIN
-#   endif
-#elif defined(BSD) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__MirBSD__)
-#   if defined(__FreeBSD__)
-#       include 
-#   endif
-#   define U_PLATFORM U_PF_BSD
-#elif defined(sun) || defined(__sun)
-    /* Check defined(__SVR4) || defined(__svr4__) to distinguish Solaris from SunOS? */
-#   define U_PLATFORM U_PF_SOLARIS
-#   if defined(__GNUC__)
-        /* Solaris/GCC needs this header file to get the proper endianness. Normally, this
-         * header file is included with stddef.h but on Solairs/GCC, the GCC version of stddef.h
-         *  is included which does not include this header file.
-         */
-#       include 
-#   endif
-#elif defined(_AIX) || defined(__TOS_AIX__)
-#   define U_PLATFORM U_PF_AIX
-#elif defined(_hpux) || defined(hpux) || defined(__hpux)
-#   define U_PLATFORM U_PF_HPUX
-#elif defined(sgi) || defined(__sgi)
-#   define U_PLATFORM U_PF_IRIX
-#elif defined(__QNX__) || defined(__QNXNTO__)
-#   define U_PLATFORM U_PF_QNX
-#elif defined(__TOS_MVS__)
-#   define U_PLATFORM U_PF_OS390
-#elif defined(__OS400__) || defined(__TOS_OS400__)
-#   define U_PLATFORM U_PF_OS400
-#elif defined(__EMSCRIPTEN__)
-#   define U_PLATFORM U_PF_EMSCRIPTEN
-#else
-#   define U_PLATFORM U_PF_UNKNOWN
-#endif
-
-/**
- * \def U_REAL_MSVC
- * Defined if the compiler is the real MSVC compiler (and not something like
- * Clang setting _MSC_VER in order to compile Windows code that requires it).
- * Otherwise undefined.
- * @internal
- */
-#if (defined(_MSC_VER) && !(defined(__clang__) && __clang__)) || defined(U_IN_DOXYGEN)
-#   define U_REAL_MSVC
-#endif
-
-/**
- * \def CYGWINMSVC
- * Defined if this is Windows with Cygwin, but using MSVC rather than gcc.
- * Otherwise undefined.
- * @internal
- */
-/* Commented out because this is already set in mh-cygwin-msvc
-#if U_PLATFORM == U_PF_CYGWIN && defined(_MSC_VER)
-#   define CYGWINMSVC
-#endif
-*/
-#ifdef U_IN_DOXYGEN
-#   define CYGWINMSVC
-#endif
-
-/**
- * \def U_PLATFORM_USES_ONLY_WIN32_API
- * Defines whether the platform uses only the Win32 API.
- * Set to 1 for Windows/MSVC, ClangCL and MinGW but not Cygwin.
- * @internal
- */
-#ifdef U_PLATFORM_USES_ONLY_WIN32_API
-    /* Use the predefined value. */
-#elif (U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_MINGW) || defined(CYGWINMSVC)
-#   define U_PLATFORM_USES_ONLY_WIN32_API 1
-#else
-    /* Cygwin implements POSIX. */
-#   define U_PLATFORM_USES_ONLY_WIN32_API 0
-#endif
-
-/**
- * \def U_PLATFORM_HAS_WIN32_API
- * Defines whether the Win32 API is available on the platform.
- * Set to 1 for Windows/MSVC, ClangCL, MinGW and Cygwin.
- * @internal
- */
-#ifdef U_PLATFORM_HAS_WIN32_API
-    /* Use the predefined value. */
-#elif U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN
-#   define U_PLATFORM_HAS_WIN32_API 1
-#else
-#   define U_PLATFORM_HAS_WIN32_API 0
-#endif
-
-/**
- * \def U_PLATFORM_HAS_WINUWP_API
- * Defines whether target is intended for Universal Windows Platform API
- * Set to 1 for Windows10 Release Solution Configuration
- * @internal
- */
-#ifdef U_PLATFORM_HAS_WINUWP_API
-    /* Use the predefined value. */
-#else
-#   define U_PLATFORM_HAS_WINUWP_API 0
-#endif
-
-/**
- * \def U_PLATFORM_IMPLEMENTS_POSIX
- * Defines whether the platform implements (most of) the POSIX API.
- * Set to 1 for Cygwin and most other platforms.
- * @internal
- */
-#ifdef U_PLATFORM_IMPLEMENTS_POSIX
-    /* Use the predefined value. */
-#elif U_PLATFORM_USES_ONLY_WIN32_API
-#   define U_PLATFORM_IMPLEMENTS_POSIX 0
-#else
-#   define U_PLATFORM_IMPLEMENTS_POSIX 1
-#endif
-
-/**
- * \def U_PLATFORM_IS_LINUX_BASED
- * Defines whether the platform is Linux or one of its derivatives.
- * @internal
- */
-#ifdef U_PLATFORM_IS_LINUX_BASED
-    /* Use the predefined value. */
-#elif U_PF_LINUX <= U_PLATFORM && U_PLATFORM <= 4499
-#   define U_PLATFORM_IS_LINUX_BASED 1
-#else
-#   define U_PLATFORM_IS_LINUX_BASED 0
-#endif
-
-/**
- * \def U_PLATFORM_IS_DARWIN_BASED
- * Defines whether the platform is Darwin or one of its derivatives.
- * @internal
- */
-#ifdef U_PLATFORM_IS_DARWIN_BASED
-    /* Use the predefined value. */
-#elif U_PF_DARWIN <= U_PLATFORM && U_PLATFORM <= U_PF_IPHONE
-#   define U_PLATFORM_IS_DARWIN_BASED 1
-#else
-#   define U_PLATFORM_IS_DARWIN_BASED 0
-#endif
-
-/*===========================================================================*/
-/** @{ Compiler and environment features                                     */
-/*===========================================================================*/
-
-/**
- * \def U_GCC_MAJOR_MINOR
- * Indicates whether the compiler is gcc (test for != 0),
- * and if so, contains its major (times 100) and minor version numbers.
- * If the compiler is not gcc, then U_GCC_MAJOR_MINOR == 0.
- *
- * For example, for testing for whether we have gcc, and whether it's 4.6 or higher,
- * use "#if U_GCC_MAJOR_MINOR >= 406".
- * @internal
- */
-#ifdef __GNUC__
-#   define U_GCC_MAJOR_MINOR (__GNUC__ * 100 + __GNUC_MINOR__)
-#else
-#   define U_GCC_MAJOR_MINOR 0
-#endif
-
-/**
- * \def U_IS_BIG_ENDIAN
- * Determines the endianness of the platform.
- * @internal
- */
-#ifdef U_IS_BIG_ENDIAN
-    /* Use the predefined value. */
-#elif defined(BYTE_ORDER) && defined(BIG_ENDIAN)
-#   define U_IS_BIG_ENDIAN (BYTE_ORDER == BIG_ENDIAN)
-#elif defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__)
-    /* gcc */
-#   define U_IS_BIG_ENDIAN (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
-#elif defined(__BIG_ENDIAN__) || defined(_BIG_ENDIAN)
-#   define U_IS_BIG_ENDIAN 1
-#elif defined(__LITTLE_ENDIAN__) || defined(_LITTLE_ENDIAN)
-#   define U_IS_BIG_ENDIAN 0
-#elif U_PLATFORM == U_PF_OS390 || U_PLATFORM == U_PF_OS400 || defined(__s390__) || defined(__s390x__)
-    /* These platforms do not appear to predefine any endianness macros. */
-#   define U_IS_BIG_ENDIAN 1
-#elif defined(_PA_RISC1_0) || defined(_PA_RISC1_1) || defined(_PA_RISC2_0)
-    /* HPPA do not appear to predefine any endianness macros. */
-#   define U_IS_BIG_ENDIAN 1
-#elif defined(sparc) || defined(__sparc) || defined(__sparc__)
-    /* Some sparc based systems (e.g. Linux) do not predefine any endianness macros. */
-#   define U_IS_BIG_ENDIAN 1
-#else
-#   define U_IS_BIG_ENDIAN 0
-#endif
-
-/**
- * \def U_HAVE_PLACEMENT_NEW
- * Determines whether to override placement new and delete for STL.
- * @stable ICU 2.6
- */
-#ifdef U_HAVE_PLACEMENT_NEW
-    /* Use the predefined value. */
-#elif defined(__BORLANDC__)
-#   define U_HAVE_PLACEMENT_NEW 0
-#else
-#   define U_HAVE_PLACEMENT_NEW 1
-#endif
-
-/**
- * \def U_HAVE_DEBUG_LOCATION_NEW 
- * Define this to define the MFC debug version of the operator new.
- *
- * @stable ICU 3.4
- */
-#ifdef U_HAVE_DEBUG_LOCATION_NEW
-    /* Use the predefined value. */
-#elif defined(_MSC_VER)
-#   define U_HAVE_DEBUG_LOCATION_NEW 1
-#else
-#   define U_HAVE_DEBUG_LOCATION_NEW 0
-#endif
-
-/* Compatibility with compilers other than clang: http://clang.llvm.org/docs/LanguageExtensions.html */
-#ifdef __has_attribute
-#   define UPRV_HAS_ATTRIBUTE(x) __has_attribute(x)
-#else
-#   define UPRV_HAS_ATTRIBUTE(x) 0
-#endif
-#ifdef __has_cpp_attribute
-#   define UPRV_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x)
-#else
-#   define UPRV_HAS_CPP_ATTRIBUTE(x) 0
-#endif
-#ifdef __has_declspec_attribute
-#   define UPRV_HAS_DECLSPEC_ATTRIBUTE(x) __has_declspec_attribute(x)
-#else
-#   define UPRV_HAS_DECLSPEC_ATTRIBUTE(x) 0
-#endif
-#ifdef __has_builtin
-#   define UPRV_HAS_BUILTIN(x) __has_builtin(x)
-#else
-#   define UPRV_HAS_BUILTIN(x) 0
-#endif
-#ifdef __has_feature
-#   define UPRV_HAS_FEATURE(x) __has_feature(x)
-#else
-#   define UPRV_HAS_FEATURE(x) 0
-#endif
-#ifdef __has_extension
-#   define UPRV_HAS_EXTENSION(x) __has_extension(x)
-#else
-#   define UPRV_HAS_EXTENSION(x) 0
-#endif
-#ifdef __has_warning
-#   define UPRV_HAS_WARNING(x) __has_warning(x)
-#else
-#   define UPRV_HAS_WARNING(x) 0
-#endif
-
-
-#if defined(__clang__)
-#define UPRV_NO_SANITIZE_UNDEFINED __attribute__((no_sanitize("undefined")))
-#else
-#define UPRV_NO_SANITIZE_UNDEFINED
-#endif
-
-/**
- * \def U_MALLOC_ATTR
- * Attribute to mark functions as malloc-like
- * @internal
- */
-#if defined(__GNUC__) && __GNUC__>=3
-#    define U_MALLOC_ATTR __attribute__ ((__malloc__))
-#else
-#    define U_MALLOC_ATTR
-#endif
-
-/**
- * \def U_ALLOC_SIZE_ATTR
- * Attribute to specify the size of the allocated buffer for malloc-like functions
- * @internal
- */
-#if (defined(__GNUC__) &&                                            \
-        (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))) || \
-        UPRV_HAS_ATTRIBUTE(alloc_size)
-#   define U_ALLOC_SIZE_ATTR(X) __attribute__ ((alloc_size(X)))
-#   define U_ALLOC_SIZE_ATTR2(X,Y) __attribute__ ((alloc_size(X,Y)))
-#else
-#   define U_ALLOC_SIZE_ATTR(X)
-#   define U_ALLOC_SIZE_ATTR2(X,Y)
-#endif
-
-/**
- * \def U_CPLUSPLUS_VERSION
- * 0 if no C++; 1, 11, 14, ... if C++.
- * Support for specific features cannot always be determined by the C++ version alone.
- * @internal
- */
-#ifdef U_CPLUSPLUS_VERSION
-#   if U_CPLUSPLUS_VERSION != 0 && !defined(__cplusplus)
-#       undef U_CPLUSPLUS_VERSION
-#       define U_CPLUSPLUS_VERSION 0
-#   endif
-    /* Otherwise use the predefined value. */
-#elif !defined(__cplusplus)
-#   define U_CPLUSPLUS_VERSION 0
-#elif __cplusplus >= 201703L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L)
-#   define U_CPLUSPLUS_VERSION 17
-#elif __cplusplus >= 201402L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201402L)
-#   define U_CPLUSPLUS_VERSION 14
-#elif __cplusplus >= 201103L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201103L)
-#   define U_CPLUSPLUS_VERSION 11
-#else
-    // C++98 or C++03
-#   define U_CPLUSPLUS_VERSION 1
-#endif
-
-/**
- * \def U_FALLTHROUGH
- * Annotate intentional fall-through between switch labels.
- * http://clang.llvm.org/docs/AttributeReference.html#fallthrough-clang-fallthrough
- * @internal
- */
-#ifndef __cplusplus
-    // Not for C.
-#elif defined(U_FALLTHROUGH)
-    // Use the predefined value.
-#elif defined(__clang__)
-    // Test for compiler vs. feature separately.
-    // Other compilers might choke on the feature test.
-#    if UPRV_HAS_CPP_ATTRIBUTE(clang::fallthrough) || \
-             (UPRV_HAS_FEATURE(cxx_attributes) &&     \
-             UPRV_HAS_WARNING("-Wimplicit-fallthrough"))
-#       define U_FALLTHROUGH [[clang::fallthrough]]
-#   endif
-#elif defined(__GNUC__) && (__GNUC__ >= 7)
-#   define U_FALLTHROUGH __attribute__((fallthrough))
-#endif
-
-#ifndef U_FALLTHROUGH
-#   define U_FALLTHROUGH
-#endif
-
-/** @} */
-
-/*===========================================================================*/
-/** @{ Character data types                                                  */
-/*===========================================================================*/
-
-/**
- * U_CHARSET_FAMILY is equal to this value when the platform is an ASCII based platform.
- * @stable ICU 2.0
- */
-#define U_ASCII_FAMILY 0
-
-/**
- * U_CHARSET_FAMILY is equal to this value when the platform is an EBCDIC based platform.
- * @stable ICU 2.0
- */
-#define U_EBCDIC_FAMILY 1
-
-/**
- * \def U_CHARSET_FAMILY
- *
- * 

These definitions allow to specify the encoding of text - * in the char data type as defined by the platform and the compiler. - * It is enough to determine the code point values of "invariant characters", - * which are the ones shared by all encodings that are in use - * on a given platform.

- * - *

Those "invariant characters" should be all the uppercase and lowercase - * latin letters, the digits, the space, and "basic punctuation". - * Also, '\\n', '\\r', '\\t' should be available.

- * - *

The list of "invariant characters" is:
- * \code - * A-Z a-z 0-9 SPACE " % & ' ( ) * + , - . / : ; < = > ? _ - * \endcode - *
- * (52 letters + 10 numbers + 20 punc/sym/space = 82 total)

- * - *

This matches the IBM Syntactic Character Set (CS 640).

- * - *

In other words, all the graphic characters in 7-bit ASCII should - * be safely accessible except the following:

- * - * \code - * '\' - * '[' - * ']' - * '{' - * '}' - * '^' - * '~' - * '!' - * '#' - * '|' - * '$' - * '@' - * '`' - * \endcode - * @stable ICU 2.0 - */ -#ifdef U_CHARSET_FAMILY - /* Use the predefined value. */ -#elif U_PLATFORM == U_PF_OS390 && (!defined(__CHARSET_LIB) || !__CHARSET_LIB) -# define U_CHARSET_FAMILY U_EBCDIC_FAMILY -#elif U_PLATFORM == U_PF_OS400 && !defined(__UTF32__) -# define U_CHARSET_FAMILY U_EBCDIC_FAMILY -#else -# define U_CHARSET_FAMILY U_ASCII_FAMILY -#endif - -/** - * \def U_CHARSET_IS_UTF8 - * - * Hardcode the default charset to UTF-8. - * - * If this is set to 1, then - * - ICU will assume that all non-invariant char*, StringPiece, std::string etc. - * contain UTF-8 text, regardless of what the system API uses - * - some ICU code will use fast functions like u_strFromUTF8() - * rather than the more general and more heavy-weight conversion API (ucnv.h) - * - ucnv_getDefaultName() always returns "UTF-8" - * - ucnv_setDefaultName() is disabled and will not change the default charset - * - static builds of ICU are smaller - * - more functionality is available with the UCONFIG_NO_CONVERSION build-time - * configuration option (see unicode/uconfig.h) - * - the UCONFIG_NO_CONVERSION build option in uconfig.h is more usable - * - * @stable ICU 4.2 - * @see UCONFIG_NO_CONVERSION - */ -#ifdef U_CHARSET_IS_UTF8 - /* Use the predefined value. */ -#elif U_PLATFORM_IS_LINUX_BASED || U_PLATFORM_IS_DARWIN_BASED || \ - U_PLATFORM == U_PF_EMSCRIPTEN -# define U_CHARSET_IS_UTF8 1 -#else -# define U_CHARSET_IS_UTF8 0 -#endif - -/** @} */ - -/*===========================================================================*/ -/** @{ Information about wchar support */ -/*===========================================================================*/ - -/** - * \def U_HAVE_WCHAR_H - * Indicates whether is available (1) or not (0). Set to 1 by default. - * - * @stable ICU 2.0 - */ -#ifdef U_HAVE_WCHAR_H - /* Use the predefined value. */ -#elif U_PLATFORM == U_PF_ANDROID && __ANDROID_API__ < 9 - /* - * Android before Gingerbread (Android 2.3, API level 9) did not support wchar_t. - * The type and header existed, but the library functions did not work as expected. - * The size of wchar_t was 1 but L"xyz" string literals had 32-bit units anyway. - */ -# define U_HAVE_WCHAR_H 0 -#else -# define U_HAVE_WCHAR_H 1 -#endif - -/** - * \def U_SIZEOF_WCHAR_T - * U_SIZEOF_WCHAR_T==sizeof(wchar_t) - * - * @stable ICU 2.0 - */ -#ifdef U_SIZEOF_WCHAR_T - /* Use the predefined value. */ -#elif (U_PLATFORM == U_PF_ANDROID && __ANDROID_API__ < 9) - /* - * Classic Mac OS and Mac OS X before 10.3 (Panther) did not support wchar_t or wstring. - * Newer Mac OS X has size 4. - */ -# define U_SIZEOF_WCHAR_T 1 -#elif U_PLATFORM_HAS_WIN32_API || U_PLATFORM == U_PF_CYGWIN -# define U_SIZEOF_WCHAR_T 2 -#elif U_PLATFORM == U_PF_AIX - /* - * AIX 6.1 information, section "Wide character data representation": - * "... the wchar_t datatype is 32-bit in the 64-bit environment and - * 16-bit in the 32-bit environment." - * and - * "All locales use Unicode for their wide character code values (process code), - * except the IBM-eucTW codeset." - */ -# ifdef __64BIT__ -# define U_SIZEOF_WCHAR_T 4 -# else -# define U_SIZEOF_WCHAR_T 2 -# endif -#elif U_PLATFORM == U_PF_OS390 - /* - * z/OS V1R11 information center, section "LP64 | ILP32": - * "In 31-bit mode, the size of long and pointers is 4 bytes and the size of wchar_t is 2 bytes. - * Under LP64, the size of long and pointer is 8 bytes and the size of wchar_t is 4 bytes." - */ -# ifdef _LP64 -# define U_SIZEOF_WCHAR_T 4 -# else -# define U_SIZEOF_WCHAR_T 2 -# endif -#elif U_PLATFORM == U_PF_OS400 -# if defined(__UTF32__) - /* - * LOCALETYPE(*LOCALEUTF) is specified. - * Wide-character strings are in UTF-32, - * narrow-character strings are in UTF-8. - */ -# define U_SIZEOF_WCHAR_T 4 -# elif defined(__UCS2__) - /* - * LOCALETYPE(*LOCALEUCS2) is specified. - * Wide-character strings are in UCS-2, - * narrow-character strings are in EBCDIC. - */ -# define U_SIZEOF_WCHAR_T 2 -# else - /* - * LOCALETYPE(*CLD) or LOCALETYPE(*LOCALE) is specified. - * Wide-character strings are in 16-bit EBCDIC, - * narrow-character strings are in EBCDIC. - */ -# define U_SIZEOF_WCHAR_T 2 -# endif -#else -# define U_SIZEOF_WCHAR_T 4 -#endif - -#ifndef U_HAVE_WCSCPY -#define U_HAVE_WCSCPY U_HAVE_WCHAR_H -#endif - -/** @} */ - -/** - * \def U_HAVE_CHAR16_T - * Defines whether the char16_t type is available for UTF-16 - * and u"abc" UTF-16 string literals are supported. - * This is a new standard type and standard string literal syntax in C++11 - * but has been available in some compilers before. - * @internal - */ -#ifdef U_HAVE_CHAR16_T - /* Use the predefined value. */ -#else - /* - * Notes: - * C++11 and C11 require support for UTF-16 literals - * Doesn't work on Mac C11 (see workaround in ptypes.h). - */ -# if defined(__cplusplus) || !U_PLATFORM_IS_DARWIN_BASED -# define U_HAVE_CHAR16_T 1 -# else -# define U_HAVE_CHAR16_T 0 -# endif -#endif - -/** - * @{ - * \def U_DECLARE_UTF16 - * Do not use this macro because it is not defined on all platforms. - * Use the UNICODE_STRING or U_STRING_DECL macros instead. - * @internal - */ -#ifdef U_DECLARE_UTF16 - /* Use the predefined value. */ -#elif U_HAVE_CHAR16_T \ - || (defined(__xlC__) && defined(__IBM_UTF_LITERAL) && U_SIZEOF_WCHAR_T != 2) \ - || (defined(__HP_aCC) && __HP_aCC >= 035000) \ - || (defined(__HP_cc) && __HP_cc >= 111106) \ - || (defined(U_IN_DOXYGEN)) -# define U_DECLARE_UTF16(string) u ## string -#elif U_SIZEOF_WCHAR_T == 2 \ - && (U_CHARSET_FAMILY == 0 || (U_PF_OS390 <= U_PLATFORM && U_PLATFORM <= U_PF_OS400 && defined(__UCS2__))) -# define U_DECLARE_UTF16(string) L ## string -#else - /* Leave U_DECLARE_UTF16 undefined. See unistr.h. */ -#endif - -/** @} */ - -/*===========================================================================*/ -/** @{ Symbol import-export control */ -/*===========================================================================*/ - -#ifdef U_EXPORT - /* Use the predefined value. */ -#elif defined(U_STATIC_IMPLEMENTATION) -# define U_EXPORT -#elif defined(_MSC_VER) || (UPRV_HAS_DECLSPEC_ATTRIBUTE(__dllexport__) && \ - UPRV_HAS_DECLSPEC_ATTRIBUTE(__dllimport__)) -# define U_EXPORT __declspec(dllexport) -#elif defined(__GNUC__) -# define U_EXPORT __attribute__((visibility("default"))) -#elif (defined(__SUNPRO_CC) && __SUNPRO_CC >= 0x550) \ - || (defined(__SUNPRO_C) && __SUNPRO_C >= 0x550) -# define U_EXPORT __global -/*#elif defined(__HP_aCC) || defined(__HP_cc) -# define U_EXPORT __declspec(dllexport)*/ -#else -# define U_EXPORT -#endif - -/* U_CALLCONV is related to U_EXPORT2 */ -#ifdef U_EXPORT2 - /* Use the predefined value. */ -#elif defined(_MSC_VER) -# define U_EXPORT2 __cdecl -#else -# define U_EXPORT2 -#endif - -#ifdef U_IMPORT - /* Use the predefined value. */ -#elif defined(_MSC_VER) || (UPRV_HAS_DECLSPEC_ATTRIBUTE(__dllexport__) && \ - UPRV_HAS_DECLSPEC_ATTRIBUTE(__dllimport__)) - /* Windows needs to export/import data. */ -# define U_IMPORT __declspec(dllimport) -#else -# define U_IMPORT -#endif - -/** - * \def U_HIDDEN - * This is used to mark internal structs declared within external classes, - * to prevent the internal structs from having the same visibility as the - * class within which they are declared. - * @internal - */ -#ifdef U_HIDDEN - /* Use the predefined value. */ -#elif defined(__GNUC__) -# define U_HIDDEN __attribute__((visibility("hidden"))) -#else -# define U_HIDDEN -#endif - -/** - * \def U_CALLCONV - * Similar to U_CDECL_BEGIN/U_CDECL_END, this qualifier is necessary - * in callback function typedefs to make sure that the calling convention - * is compatible. - * - * This is only used for non-ICU-API functions. - * When a function is a public ICU API, - * you must use the U_CAPI and U_EXPORT2 qualifiers. - * - * Please note, you need to use U_CALLCONV after the *. - * - * NO : "static const char U_CALLCONV *func( . . . )" - * YES: "static const char* U_CALLCONV func( . . . )" - * - * @stable ICU 2.0 - */ -#if U_PLATFORM == U_PF_OS390 && defined(__cplusplus) -# define U_CALLCONV __cdecl -#else -# define U_CALLCONV U_EXPORT2 -#endif - -/** - * \def U_CALLCONV_FPTR - * Similar to U_CALLCONV, but only used on function pointers. - * @internal - */ -#if U_PLATFORM == U_PF_OS390 && defined(__cplusplus) -# define U_CALLCONV_FPTR U_CALLCONV -#else -# define U_CALLCONV_FPTR -#endif -/** @} */ - -#endif // _PLATFORM_H diff --git a/tools/icu/patches/75/source/tools/genccode/genccode.c b/tools/icu/patches/75/source/tools/genccode/genccode.c deleted file mode 100644 index 0f243952a7d..00000000000 --- a/tools/icu/patches/75/source/tools/genccode/genccode.c +++ /dev/null @@ -1,226 +0,0 @@ -// © 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/* - ******************************************************************************* - * Copyright (C) 1999-2016, International Business Machines - * Corporation and others. All Rights Reserved. - ******************************************************************************* - * file name: gennames.c - * encoding: UTF-8 - * tab size: 8 (not used) - * indentation:4 - * - * created on: 1999nov01 - * created by: Markus W. Scherer - * - * This program reads a binary file and creates a C source code file - * with a byte array that contains the data of the binary file. - * - * 12/09/1999 weiv Added multiple file handling - */ - -#include "unicode/utypes.h" - -#if U_PLATFORM_HAS_WIN32_API -# define VC_EXTRALEAN -# define WIN32_LEAN_AND_MEAN -# define NOUSER -# define NOSERVICE -# define NOIME -# define NOMCX -#include -#include -#endif - -#if U_PLATFORM_IS_LINUX_BASED && U_HAVE_ELF_H -# define U_ELF -#endif - -#ifdef U_ELF -# include -# if defined(ELFCLASS64) -# define U_ELF64 -# endif - /* Old elf.h headers may not have EM_X86_64, or have EM_X8664 instead. */ -# ifndef EM_X86_64 -# define EM_X86_64 62 -# endif -# define ICU_ENTRY_OFFSET 0 -#endif - -#include -#include -#include -#include "unicode/putil.h" -#include "cmemory.h" -#include "cstring.h" -#include "filestrm.h" -#include "toolutil.h" -#include "unicode/uclean.h" -#include "uoptions.h" -#include "pkg_genc.h" - -enum { - kOptHelpH = 0, - kOptHelpQuestionMark, - kOptDestDir, - kOptQuiet, - kOptName, - kOptEntryPoint, -#ifdef CAN_GENERATE_OBJECTS - kOptObject, - kOptMatchArch, - kOptCpuArch, - kOptSkipDllExport, -#endif - kOptFilename, - kOptAssembly -}; - -static UOption options[]={ -/*0*/UOPTION_HELP_H, - UOPTION_HELP_QUESTION_MARK, - UOPTION_DESTDIR, - UOPTION_QUIET, - UOPTION_DEF("name", 'n', UOPT_REQUIRES_ARG), - UOPTION_DEF("entrypoint", 'e', UOPT_REQUIRES_ARG), -#ifdef CAN_GENERATE_OBJECTS -/*6*/UOPTION_DEF("object", 'o', UOPT_NO_ARG), - UOPTION_DEF("match-arch", 'm', UOPT_REQUIRES_ARG), - UOPTION_DEF("cpu-arch", 'c', UOPT_REQUIRES_ARG), - UOPTION_DEF("skip-dll-export", '\0', UOPT_NO_ARG), -#endif - UOPTION_DEF("filename", 'f', UOPT_REQUIRES_ARG), - UOPTION_DEF("assembly", 'a', UOPT_REQUIRES_ARG) -}; - -#define CALL_WRITECCODE 'c' -#define CALL_WRITEASSEMBLY 'a' -#define CALL_WRITEOBJECT 'o' -extern int -main(int argc, char* argv[]) { - UBool verbose = true; - char writeCode; - - U_MAIN_INIT_ARGS(argc, argv); - - options[kOptDestDir].value = "."; - - /* read command line options */ - argc=u_parseArgs(argc, argv, UPRV_LENGTHOF(options), options); - - /* error handling, printing usage message */ - if(argc<0) { - fprintf(stderr, - "error in command line argument \"%s\"\n", - argv[-argc]); - } - if(argc<0 || options[kOptHelpH].doesOccur || options[kOptHelpQuestionMark].doesOccur) { - fprintf(stderr, - "usage: %s [-options] filename1 filename2 ...\n" - "\tread each binary input file and \n" - "\tcreate a .c file with a byte array that contains the input file's data\n" - "options:\n" - "\t-h or -? or --help this usage text\n" - "\t-d or --destdir destination directory, followed by the path\n" - "\t-q or --quiet do not display warnings and progress\n" - "\t-n or --name symbol prefix, followed by the prefix\n" - "\t-e or --entrypoint entry point name, followed by the name (_dat will be appended)\n" - "\t-r or --revision Specify a version\n" - , argv[0]); -#ifdef CAN_GENERATE_OBJECTS - fprintf(stderr, - "\t-o or --object write a .obj file instead of .c\n" - "\t-m or --match-arch file.o match the architecture (CPU, 32/64 bits) of the specified .o\n" - "\t ELF format defaults to i386. Windows defaults to the native platform.\n" - "\t-c or --cpu-arch Specify a CPU architecture for which to write a .obj file for ClangCL on Windows\n" - "\t Valid values for this opton are x64, x86 and arm64.\n" - "\t--skip-dll-export Don't export the ICU data entry point symbol (for use when statically linking)\n"); -#endif - fprintf(stderr, - "\t-f or --filename Specify an alternate base filename. (default: symbolname_typ)\n" - "\t-a or --assembly Create assembly file. (possible values are: "); - - printAssemblyHeadersToStdErr(); - } else { - const char *message, *filename; - /* TODO: remove void (*writeCode)(const char *, const char *); */ - - if(options[kOptAssembly].doesOccur) { - message="generating assembly code for %s\n"; - writeCode = CALL_WRITEASSEMBLY; - /* TODO: remove writeCode=&writeAssemblyCode; */ - - if (!checkAssemblyHeaderName(options[kOptAssembly].value)) { - fprintf(stderr, - "Assembly type \"%s\" is unknown.\n", options[kOptAssembly].value); - return -1; - } - } -#ifdef CAN_GENERATE_OBJECTS - else if(options[kOptObject].doesOccur) { - message="generating object code for %s\n"; - writeCode = CALL_WRITEOBJECT; - /* TODO: remove writeCode=&writeObjectCode; */ - } -#endif - else - { - message="generating C code for %s\n"; - writeCode = CALL_WRITECCODE; - /* TODO: remove writeCode=&writeCCode; */ - } - if (options[kOptQuiet].doesOccur) { - verbose = false; - } - while(--argc) { - filename=getLongPathname(argv[argc]); - if (verbose) { - fprintf(stdout, message, filename); - } - - switch (writeCode) { - case CALL_WRITECCODE: - writeCCode(filename, options[kOptDestDir].value, - options[kOptEntryPoint].doesOccur ? options[kOptEntryPoint].value : NULL, - options[kOptName].doesOccur ? options[kOptName].value : NULL, - options[kOptFilename].doesOccur ? options[kOptFilename].value : NULL, - NULL, - 0); - break; - case CALL_WRITEASSEMBLY: - writeAssemblyCode(filename, options[kOptDestDir].value, - options[kOptEntryPoint].doesOccur ? options[kOptEntryPoint].value : NULL, - options[kOptFilename].doesOccur ? options[kOptFilename].value : NULL, - NULL, - 0); - break; -#ifdef CAN_GENERATE_OBJECTS - case CALL_WRITEOBJECT: - if(options[kOptCpuArch].doesOccur) { - if (!checkCpuArchitecture(options[kOptCpuArch].value)) { - fprintf(stderr, - "CPU architecture \"%s\" is unknown.\n", options[kOptCpuArch].value); - return -1; - } - } - writeObjectCode(filename, options[kOptDestDir].value, - options[kOptEntryPoint].doesOccur ? options[kOptEntryPoint].value : NULL, - options[kOptMatchArch].doesOccur ? options[kOptMatchArch].value : NULL, - options[kOptCpuArch].doesOccur ? options[kOptCpuArch].value : NULL, - options[kOptFilename].doesOccur ? options[kOptFilename].value : NULL, - NULL, - 0, - !options[kOptSkipDllExport].doesOccur); - break; -#endif - default: - /* Should never occur. */ - break; - } - /* TODO: remove writeCode(filename, options[kOptDestDir].value); */ - } - } - - return 0; -} diff --git a/tools/icu/patches/75/source/tools/genccode/pkg_genc.h b/tools/icu/patches/75/source/tools/genccode/pkg_genc.h deleted file mode 100644 index 76474ec7df6..00000000000 --- a/tools/icu/patches/75/source/tools/genccode/pkg_genc.h +++ /dev/null @@ -1,111 +0,0 @@ -// © 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/****************************************************************************** - * Copyright (C) 2008-2011, International Business Machines - * Corporation and others. All Rights Reserved. - ******************************************************************************* - */ - -#ifndef __PKG_GENC_H__ -#define __PKG_GENC_H__ - -#include "unicode/utypes.h" -#include "toolutil.h" - -#include "unicode/putil.h" -#include "putilimp.h" - -/*** Platform #defines move here ***/ -#if U_PLATFORM_HAS_WIN32_API -#ifdef __GNUC__ -#define WINDOWS_WITH_GNUC -#else -#define WINDOWS_WITH_MSVC -#endif -#endif - - -#if !defined(WINDOWS_WITH_MSVC) -#define BUILD_DATA_WITHOUT_ASSEMBLY -#endif - -#ifndef U_DISABLE_OBJ_CODE /* testing */ -#if defined(WINDOWS_WITH_MSVC) || U_PLATFORM_IS_LINUX_BASED -#define CAN_WRITE_OBJ_CODE -#endif -#if U_PLATFORM_HAS_WIN32_API || defined(U_ELF) -#define CAN_GENERATE_OBJECTS -#endif -#endif - -#if U_PLATFORM == U_PF_CYGWIN || defined(CYGWINMSVC) -#define USING_CYGWIN -#endif - -/* - * When building the data library without assembly, - * some platforms use a single c code file for all of - * the data to generate the final data library. This can - * increase the performance of the pkdata tool. - */ -#if U_PLATFORM == U_PF_OS400 -#define USE_SINGLE_CCODE_FILE -#endif - -/* Need to fix the file seperator character when using MinGW. */ -#if defined(WINDOWS_WITH_GNUC) || defined(USING_CYGWIN) -#define PKGDATA_FILE_SEP_STRING "/" -#else -#define PKGDATA_FILE_SEP_STRING U_FILE_SEP_STRING -#endif - -#define LARGE_BUFFER_MAX_SIZE 2048 -#define SMALL_BUFFER_MAX_SIZE 512 -#define SMALL_BUFFER_FLAG_NAMES 32 -#define BUFFER_PADDING_SIZE 20 - -/** End platform defines **/ - - - -U_CAPI void U_EXPORT2 -printAssemblyHeadersToStdErr(void); - -U_CAPI UBool U_EXPORT2 -checkAssemblyHeaderName(const char* optAssembly); - -U_CAPI UBool U_EXPORT2 -checkCpuArchitecture(const char* optCpuArch); - -U_CAPI void U_EXPORT2 -writeCCode( - const char *filename, - const char *destdir, - const char *optEntryPoint, - const char *optName, - const char *optFilename, - char *outFilePath, - size_t outFilePathCapacity); - -U_CAPI void U_EXPORT2 -writeAssemblyCode( - const char *filename, - const char *destdir, - const char *optEntryPoint, - const char *optFilename, - char *outFilePath, - size_t outFilePathCapacity); - -U_CAPI void U_EXPORT2 -writeObjectCode( - const char *filename, - const char *destdir, - const char *optEntryPoint, - const char *optMatchArch, - const char *optCpuArch, - const char *optFilename, - char *outFilePath, - size_t outFilePathCapacity, - UBool optWinDllExport); - -#endif diff --git a/tools/icu/patches/75/source/tools/pkgdata/pkgdata.cpp b/tools/icu/patches/75/source/tools/pkgdata/pkgdata.cpp deleted file mode 100644 index 51452a51bb3..00000000000 --- a/tools/icu/patches/75/source/tools/pkgdata/pkgdata.cpp +++ /dev/null @@ -1,2292 +0,0 @@ -// © 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/****************************************************************************** - * Copyright (C) 2000-2016, International Business Machines - * Corporation and others. All Rights Reserved. - ******************************************************************************* - * file name: pkgdata.cpp - * encoding: ANSI X3.4 (1968) - * tab size: 8 (not used) - * indentation:4 - * - * created on: 2000may15 - * created by: Steven \u24C7 Loomis - * - * This program packages the ICU data into different forms - * (DLL, common data, etc.) - */ - -// Defines _XOPEN_SOURCE for access to POSIX functions. -// Must be before any other #includes. -#include "uposixdefs.h" - -#include "unicode/utypes.h" - -#include "unicode/putil.h" -#include "putilimp.h" - -#if U_HAVE_POPEN -#if (U_PF_MINGW <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN) && defined(__STRICT_ANSI__) -/* popen/pclose aren't defined in strict ANSI on Cygwin and MinGW */ -#undef __STRICT_ANSI__ -#endif -#endif - -#include "cmemory.h" -#include "cstring.h" -#include "filestrm.h" -#include "toolutil.h" -#include "unicode/uclean.h" -#include "unewdata.h" -#include "uoptions.h" -#include "package.h" -#include "pkg_icu.h" -#include "pkg_genc.h" -#include "pkg_gencmn.h" -#include "flagparser.h" -#include "filetools.h" -#include "charstr.h" -#include "uassert.h" - -#if U_HAVE_POPEN -# include -#endif - -#include -#include - -U_CDECL_BEGIN -#include "pkgtypes.h" -U_CDECL_END - -#if U_HAVE_POPEN -U_NAMESPACE_BEGIN -U_DEFINE_LOCAL_OPEN_POINTER(LocalPipeFilePointer, FILE, pclose); -U_NAMESPACE_END -#endif - -using icu::LocalMemory; - -static void loadLists(UPKGOptions *o, UErrorCode *status); - -static int32_t pkg_executeOptions(UPKGOptions *o); - -#ifdef WINDOWS_WITH_MSVC -static int32_t pkg_createWindowsDLL(const char mode, const char *gencFilePath, UPKGOptions *o); -#endif -static int32_t pkg_createSymLinks(const char *targetDir, UBool specialHandling=false); -static int32_t pkg_installLibrary(const char *installDir, const char *dir, UBool noVersion); -static int32_t pkg_installFileMode(const char *installDir, const char *srcDir, const char *fileListName); -static int32_t pkg_installCommonMode(const char *installDir, const char *fileName); - -#ifdef BUILD_DATA_WITHOUT_ASSEMBLY -static int32_t pkg_createWithoutAssemblyCode(UPKGOptions *o, const char *targetDir, const char mode); -#endif - -#ifdef CAN_WRITE_OBJ_CODE -static void pkg_createOptMatchArch(char *optMatchArch); -static void pkg_destroyOptMatchArch(char *optMatchArch); -#endif - -static int32_t pkg_createWithAssemblyCode(const char *targetDir, const char mode, const char *gencFilePath); -static int32_t pkg_generateLibraryFile(const char *targetDir, const char mode, const char *objectFile, char *command = nullptr, UBool specialHandling=false); -static int32_t pkg_archiveLibrary(const char *targetDir, const char *version, UBool reverseExt); -static void createFileNames(UPKGOptions *o, const char mode, const char *version_major, const char *version, const char *libName, const UBool reverseExt, UBool noVersion); -static int32_t initializePkgDataFlags(UPKGOptions *o); - -static int32_t pkg_getPkgDataPath(UBool verbose, UOption *option); -static int runCommand(const char* command, UBool specialHandling=false); - -#define IN_COMMON_MODE(mode) (mode == 'a' || mode == 'c') -#define IN_DLL_MODE(mode) (mode == 'd' || mode == 'l') -#define IN_STATIC_MODE(mode) (mode == 's') -#define IN_FILES_MODE(mode) (mode == 'f') - -enum { - NAME, - BLDOPT, - MODE, - HELP, - HELP_QUESTION_MARK, - VERBOSE, - COPYRIGHT, - COMMENT, - DESTDIR, - REBUILD, - TEMPDIR, - INSTALL, - SOURCEDIR, - ENTRYPOINT, - REVISION, - FORCE_PREFIX, - LIBNAME, - QUIET, - WITHOUT_ASSEMBLY, - PDS_BUILD, - WIN_UWP_BUILD, - WIN_DLL_ARCH, - WIN_DYNAMICBASE -}; - -/* This sets the modes that are available */ -static struct { - const char *name, *alt_name; - const char *desc; -} modes[] = { - { "files", nullptr, "Uses raw data files (no effect). Installation copies all files to the target location." }, -#if U_PLATFORM_HAS_WIN32_API - { "dll", "library", "Generates one common data file and one shared library, .dll"}, - { "common", "archive", "Generates just the common file, .dat"}, - { "static", "static", "Generates one statically linked library, " LIB_PREFIX "" UDATA_LIB_SUFFIX } -#else -#ifdef UDATA_SO_SUFFIX - { "dll", "library", "Generates one shared library, " UDATA_SO_SUFFIX }, -#endif - { "common", "archive", "Generates one common data file, .dat" }, - { "static", "static", "Generates one statically linked library, " LIB_PREFIX "" UDATA_LIB_SUFFIX } -#endif -}; - -static UOption options[]={ - /*00*/ UOPTION_DEF( "name", 'p', UOPT_REQUIRES_ARG), - /*01*/ UOPTION_DEF( "bldopt", 'O', UOPT_REQUIRES_ARG), /* on Win32 it is release or debug */ - /*02*/ UOPTION_DEF( "mode", 'm', UOPT_REQUIRES_ARG), - /*03*/ UOPTION_HELP_H, /* -h */ - /*04*/ UOPTION_HELP_QUESTION_MARK, /* -? */ - /*05*/ UOPTION_VERBOSE, /* -v */ - /*06*/ UOPTION_COPYRIGHT, /* -c */ - /*07*/ UOPTION_DEF( "comment", 'C', UOPT_REQUIRES_ARG), - /*08*/ UOPTION_DESTDIR, /* -d */ - /*11*/ UOPTION_DEF( "rebuild", 'F', UOPT_NO_ARG), - /*12*/ UOPTION_DEF( "tempdir", 'T', UOPT_REQUIRES_ARG), - /*13*/ UOPTION_DEF( "install", 'I', UOPT_REQUIRES_ARG), - /*14*/ UOPTION_SOURCEDIR , - /*15*/ UOPTION_DEF( "entrypoint", 'e', UOPT_REQUIRES_ARG), - /*16*/ UOPTION_DEF( "revision", 'r', UOPT_REQUIRES_ARG), - /*17*/ UOPTION_DEF( "force-prefix", 'f', UOPT_NO_ARG), - /*18*/ UOPTION_DEF( "libname", 'L', UOPT_REQUIRES_ARG), - /*19*/ UOPTION_DEF( "quiet", 'q', UOPT_NO_ARG), - /*20*/ UOPTION_DEF( "without-assembly", 'w', UOPT_NO_ARG), - /*21*/ UOPTION_DEF("zos-pds-build", 'z', UOPT_NO_ARG), - /*22*/ UOPTION_DEF("windows-uwp-build", 'u', UOPT_NO_ARG), - /*23*/ UOPTION_DEF("windows-DLL-arch", 'a', UOPT_REQUIRES_ARG), - /*24*/ UOPTION_DEF("windows-dynamicbase", 'b', UOPT_NO_ARG), -}; - -/* This enum and the following char array should be kept in sync. */ -enum { - GENCCODE_ASSEMBLY_TYPE, - SO_EXT, - SOBJ_EXT, - A_EXT, - LIBPREFIX, - LIB_EXT_ORDER, - COMPILER, - LIBFLAGS, - GENLIB, - LDICUDTFLAGS, - LD_SONAME, - RPATH_FLAGS, - BIR_FLAGS, - AR, - ARFLAGS, - RANLIB, - INSTALL_CMD, - PKGDATA_FLAGS_SIZE -}; -static const char* FLAG_NAMES[PKGDATA_FLAGS_SIZE] = { - "GENCCODE_ASSEMBLY_TYPE", - "SO", - "SOBJ", - "A", - "LIBPREFIX", - "LIB_EXT_ORDER", - "COMPILE", - "LIBFLAGS", - "GENLIB", - "LDICUDTFLAGS", - "LD_SONAME", - "RPATH_FLAGS", - "BIR_LDFLAGS", - "AR", - "ARFLAGS", - "RANLIB", - "INSTALL_CMD" -}; -static char **pkgDataFlags = nullptr; - -enum { - LIB_FILE, - LIB_FILE_VERSION_MAJOR, - LIB_FILE_VERSION, - LIB_FILE_VERSION_TMP, -#if U_PLATFORM == U_PF_CYGWIN - LIB_FILE_CYGWIN, - LIB_FILE_CYGWIN_VERSION, -#elif U_PLATFORM == U_PF_MINGW - LIB_FILE_MINGW, -#elif U_PLATFORM == U_PF_OS390 - LIB_FILE_OS390BATCH_MAJOR, - LIB_FILE_OS390BATCH_VERSION, -#endif - LIB_FILENAMES_SIZE -}; -static char libFileNames[LIB_FILENAMES_SIZE][256]; - -static UPKGOptions *pkg_checkFlag(UPKGOptions *o); - -const char options_help[][320]={ - "Set the data name", -#ifdef U_MAKE_IS_NMAKE - "The directory where the ICU is located (e.g. which contains the bin directory)", -#else - "Specify options for the builder.", -#endif - "Specify the mode of building (see below; default: common)", - "This usage text", - "This usage text", - "Make the output verbose", - "Use the standard ICU copyright", - "Use a custom comment (instead of the copyright)", - "Specify the destination directory for files", - "Force rebuilding of all data", - "Specify temporary dir (default: output dir)", - "Install the data (specify target)", - "Specify a custom source directory", - "Specify a custom entrypoint name (default: short name)", - "Specify a version when packaging in dll or static mode", - "Add package to all file names if not present", - "Library name to build (if different than package name)", - "Quiet mode. (e.g. Do not output a readme file for static libraries)", - "Build the data without assembly code", - "Build PDS dataset (zOS build only)", - "Build for Universal Windows Platform (Windows build only)", - "Specify the DLL machine architecture for LINK.exe (Windows build only)", - "Ignored. Enable DYNAMICBASE on the DLL. This is now the default. (Windows build only)", -}; - -const char *progname = "PKGDATA"; - -int -main(int argc, char* argv[]) { - int result = 0; - /* FileStream *out; */ - UPKGOptions o; - CharList *tail; - UBool needsHelp = false; - UErrorCode status = U_ZERO_ERROR; - /* char tmp[1024]; */ - uint32_t i; - int32_t n; - - U_MAIN_INIT_ARGS(argc, argv); - - progname = argv[0]; - - options[MODE].value = "common"; - - /* read command line options */ - argc=u_parseArgs(argc, argv, UPRV_LENGTHOF(options), options); - - /* error handling, printing usage message */ - /* I've decided to simply print an error and quit. This tool has too - many options to just display them all of the time. */ - - if(options[HELP].doesOccur || options[HELP_QUESTION_MARK].doesOccur) { - needsHelp = true; - } - else { - if(!needsHelp && argc<0) { - fprintf(stderr, - "%s: error in command line argument \"%s\"\n", - progname, - argv[-argc]); - fprintf(stderr, "Run '%s --help' for help.\n", progname); - return 1; - } - - -#if !defined(WINDOWS_WITH_MSVC) || defined(USING_CYGWIN) - if(!options[BLDOPT].doesOccur && uprv_strcmp(options[MODE].value, "common") != 0) { - if (pkg_getPkgDataPath(options[VERBOSE].doesOccur, &options[BLDOPT]) != 0) { - fprintf(stderr, " required parameter is missing: -O is required for static and shared builds.\n"); - fprintf(stderr, "Run '%s --help' for help.\n", progname); - return 1; - } - } -#else - if(options[BLDOPT].doesOccur) { - fprintf(stdout, "Warning: You are using the -O option which is not needed for MSVC build on Windows.\n"); - } -#endif - - if(!options[NAME].doesOccur) /* -O we already have - don't report it. */ - { - fprintf(stderr, " required parameter -p is missing \n"); - fprintf(stderr, "Run '%s --help' for help.\n", progname); - return 1; - } - - if(argc == 1) { - fprintf(stderr, - "No input files specified.\n" - "Run '%s --help' for help.\n", progname); - return 1; - } - } /* end !needsHelp */ - - if(argc<0 || needsHelp ) { - fprintf(stderr, - "usage: %s [-options] [-] [packageFile] \n" - "\tProduce packaged ICU data from the given list(s) of files.\n" - "\t'-' by itself means to read from stdin.\n" - "\tpackageFile is a text file containing the list of files to package.\n", - progname); - - fprintf(stderr, "\n options:\n"); - for(i=0;i(strlen(command)); - - if (len == 0) { - return 0; - } - - if (!specialHandling) { -#if defined(USING_CYGWIN) || U_PLATFORM == U_PF_MINGW || U_PLATFORM == U_PF_OS400 - int32_t buff_len; - if ((len + BUFFER_PADDING_SIZE) >= SMALL_BUFFER_MAX_SIZE) { - cmd = (char *)uprv_malloc(len + BUFFER_PADDING_SIZE); - buff_len = len + BUFFER_PADDING_SIZE; - } else { - cmd = cmdBuffer; - buff_len = SMALL_BUFFER_MAX_SIZE; - } -#if defined(USING_CYGWIN) || U_PLATFORM == U_PF_MINGW - snprintf(cmd, buff_len, "bash -c \"%s\"", command); - -#elif U_PLATFORM == U_PF_OS400 - snprintf(cmd, buff_len "QSH CMD('%s')", command); -#endif -#else - goto normal_command_mode; -#endif - } else { -#if !(defined(USING_CYGWIN) || U_PLATFORM == U_PF_MINGW || U_PLATFORM == U_PF_OS400) -normal_command_mode: -#endif - cmd = (char *)command; - } - - printf("pkgdata: %s\n", cmd); - int result = system(cmd); - if (result != 0) { - fprintf(stderr, "-- return status = %d\n", result); - result = 1; // system() result code is platform specific. - } - - if (cmd != cmdBuffer && cmd != command) { - uprv_free(cmd); - } - - return result; -} - -#define LN_CMD "ln -s" -#define RM_CMD "rm -f" - -static int32_t pkg_executeOptions(UPKGOptions *o) { - int32_t result = 0; - - const char mode = o->mode[0]; - char targetDir[SMALL_BUFFER_MAX_SIZE] = ""; - char tmpDir[SMALL_BUFFER_MAX_SIZE] = ""; - char datFileName[SMALL_BUFFER_MAX_SIZE] = ""; - char datFileNamePath[LARGE_BUFFER_MAX_SIZE] = ""; - char checkLibFile[LARGE_BUFFER_MAX_SIZE] = ""; - - initializePkgDataFlags(o); - - if (IN_FILES_MODE(mode)) { - /* Copy the raw data to the installation directory. */ - if (o->install != nullptr) { - uprv_strcpy(targetDir, o->install); - if (o->shortName != nullptr) { - uprv_strcat(targetDir, PKGDATA_FILE_SEP_STRING); - uprv_strcat(targetDir, o->shortName); - } - - if(o->verbose) { - fprintf(stdout, "# Install: Files mode, copying files to %s..\n", targetDir); - } - result = pkg_installFileMode(targetDir, o->srcDir, o->fileListFiles->str); - } - return result; - } else /* if (IN_COMMON_MODE(mode) || IN_DLL_MODE(mode) || IN_STATIC_MODE(mode)) */ { - UBool noVersion = false; - - uprv_strcpy(targetDir, o->targetDir); - uprv_strcat(targetDir, PKGDATA_FILE_SEP_STRING); - - uprv_strcpy(tmpDir, o->tmpDir); - uprv_strcat(tmpDir, PKGDATA_FILE_SEP_STRING); - - uprv_strcpy(datFileNamePath, tmpDir); - - uprv_strcpy(datFileName, o->shortName); - uprv_strcat(datFileName, UDATA_CMN_SUFFIX); - - uprv_strcat(datFileNamePath, datFileName); - - if(o->verbose) { - fprintf(stdout, "# Writing package file %s ..\n", datFileNamePath); - } - result = writePackageDatFile(datFileNamePath, o->comment, o->srcDir, o->fileListFiles->str, nullptr, U_CHARSET_FAMILY ? 'e' : U_IS_BIG_ENDIAN ? 'b' : 'l'); - if (result != 0) { - fprintf(stderr,"Error writing package dat file.\n"); - return result; - } - - if (IN_COMMON_MODE(mode)) { - char targetFileNamePath[LARGE_BUFFER_MAX_SIZE] = ""; - - uprv_strcpy(targetFileNamePath, targetDir); - uprv_strcat(targetFileNamePath, datFileName); - - /* Move the dat file created to the target directory. */ - if (uprv_strcmp(datFileNamePath, targetFileNamePath) != 0) { - if (T_FileStream_file_exists(targetFileNamePath)) { - if ((result = remove(targetFileNamePath)) != 0) { - fprintf(stderr, "Unable to remove old dat file: %s\n", - targetFileNamePath); - return result; - } - } - - result = rename(datFileNamePath, targetFileNamePath); - - if (o->verbose) { - fprintf(stdout, "# Moving package file to %s ..\n", - targetFileNamePath); - } - if (result != 0) { - fprintf( - stderr, - "Unable to move dat file (%s) to target location (%s).\n", - datFileNamePath, targetFileNamePath); - return result; - } - } - - if (o->install != nullptr) { - result = pkg_installCommonMode(o->install, targetFileNamePath); - } - - return result; - } else /* if (IN_STATIC_MODE(mode) || IN_DLL_MODE(mode)) */ { - char gencFilePath[SMALL_BUFFER_MAX_SIZE] = ""; - char version_major[10] = ""; - UBool reverseExt = false; - -#if !defined(WINDOWS_WITH_MSVC) || defined(USING_CYGWIN) - /* Get the version major number. */ - if (o->version != nullptr) { - for (uint32_t i = 0;i < sizeof(version_major);i++) { - if (o->version[i] == '.') { - version_major[i] = 0; - break; - } - version_major[i] = o->version[i]; - } - } else { - noVersion = true; - if (IN_DLL_MODE(mode)) { - fprintf(stdout, "Warning: Providing a revision number with the -r option is recommended when packaging data in the current mode.\n"); - } - } - -#if U_PLATFORM != U_PF_OS400 - /* Certain platforms have different library extension ordering. (e.g. libicudata.##.so vs libicudata.so.##) - * reverseExt is false if the suffix should be the version number. - */ - if (pkgDataFlags[LIB_EXT_ORDER][uprv_strlen(pkgDataFlags[LIB_EXT_ORDER])-1] == pkgDataFlags[SO_EXT][uprv_strlen(pkgDataFlags[SO_EXT])-1]) { - reverseExt = true; - } -#endif - /* Using the base libName and version number, generate the library file names. */ - createFileNames(o, mode, version_major, o->version == nullptr ? "" : o->version, o->libName, reverseExt, noVersion); - - if ((o->version!=nullptr || IN_STATIC_MODE(mode)) && o->rebuild == false && o->pdsbuild == false) { - /* Check to see if a previous built data library file exists and check if it is the latest. */ - snprintf(checkLibFile, sizeof(checkLibFile), "%s%s", targetDir, libFileNames[LIB_FILE_VERSION]); - if (T_FileStream_file_exists(checkLibFile)) { - if (isFileModTimeLater(checkLibFile, o->srcDir, true) && isFileModTimeLater(checkLibFile, o->options)) { - if (o->install != nullptr) { - if(o->verbose) { - fprintf(stdout, "# Installing already-built library into %s\n", o->install); - } - result = pkg_installLibrary(o->install, targetDir, noVersion); - } else { - if(o->verbose) { - printf("# Not rebuilding %s - up to date.\n", checkLibFile); - } - } - return result; - } else if (o->verbose && (o->install!=nullptr)) { - fprintf(stdout, "# Not installing up-to-date library %s into %s\n", checkLibFile, o->install); - } - } else if(o->verbose && (o->install!=nullptr)) { - fprintf(stdout, "# Not installing missing %s into %s\n", checkLibFile, o->install); - } - } - - if (pkg_checkFlag(o) == nullptr) { - /* Error occurred. */ - return result; - } -#endif - - if (!o->withoutAssembly && pkgDataFlags[GENCCODE_ASSEMBLY_TYPE][0] != 0) { - const char* genccodeAssembly = pkgDataFlags[GENCCODE_ASSEMBLY_TYPE]; - - if(o->verbose) { - fprintf(stdout, "# Generating assembly code %s of type %s ..\n", gencFilePath, genccodeAssembly); - } - - /* Offset genccodeAssembly by 3 because "-a " */ - if (genccodeAssembly && - (uprv_strlen(genccodeAssembly)>3) && - checkAssemblyHeaderName(genccodeAssembly+3)) { - writeAssemblyCode( - datFileNamePath, - o->tmpDir, - o->entryName, - nullptr, - gencFilePath, - sizeof(gencFilePath)); - - result = pkg_createWithAssemblyCode(targetDir, mode, gencFilePath); - if (result != 0) { - fprintf(stderr, "Error generating assembly code for data.\n"); - return result; - } else if (IN_STATIC_MODE(mode)) { - if(o->install != nullptr) { - if(o->verbose) { - fprintf(stdout, "# Installing static library into %s\n", o->install); - } - result = pkg_installLibrary(o->install, targetDir, noVersion); - } - return result; - } - } else { - fprintf(stderr,"Assembly type \"%s\" is unknown.\n", genccodeAssembly); - return -1; - } - } else { - if(o->verbose) { - fprintf(stdout, "# Writing object code to %s ..\n", gencFilePath); - } - if (o->withoutAssembly) { -#ifdef BUILD_DATA_WITHOUT_ASSEMBLY - result = pkg_createWithoutAssemblyCode(o, targetDir, mode); -#else - /* This error should not occur. */ - fprintf(stderr, "Error- BUILD_DATA_WITHOUT_ASSEMBLY is not defined. Internal error.\n"); -#endif - } else { -#ifdef CAN_WRITE_OBJ_CODE - /* Try to detect the arch type, use nullptr if unsuccessful */ - char optMatchArch[10] = { 0 }; - pkg_createOptMatchArch(optMatchArch); - writeObjectCode( - datFileNamePath, - o->tmpDir, - o->entryName, - (optMatchArch[0] == 0 ? nullptr : optMatchArch), - nullptr, - nullptr, - gencFilePath, - sizeof(gencFilePath), - true); - pkg_destroyOptMatchArch(optMatchArch); -#if U_PLATFORM_IS_LINUX_BASED - result = pkg_generateLibraryFile(targetDir, mode, gencFilePath); -#elif defined(WINDOWS_WITH_MSVC) - result = pkg_createWindowsDLL(mode, gencFilePath, o); -#endif -#elif defined(BUILD_DATA_WITHOUT_ASSEMBLY) - result = pkg_createWithoutAssemblyCode(o, targetDir, mode); -#else - fprintf(stderr, "Error- neither CAN_WRITE_OBJ_CODE nor BUILD_DATA_WITHOUT_ASSEMBLY are defined. Internal error.\n"); - return 1; -#endif - } - - if (result != 0) { - fprintf(stderr, "Error generating package data.\n"); - return result; - } - } -#if !U_PLATFORM_USES_ONLY_WIN32_API - if(!IN_STATIC_MODE(mode)) { - /* Certain platforms uses archive library. (e.g. AIX) */ - if(o->verbose) { - fprintf(stdout, "# Creating data archive library file ..\n"); - } - result = pkg_archiveLibrary(targetDir, o->version, reverseExt); - if (result != 0) { - fprintf(stderr, "Error creating data archive library file.\n"); - return result; - } -#if U_PLATFORM != U_PF_OS400 - if (!noVersion) { - /* Create symbolic links for the final library file. */ -#if U_PLATFORM == U_PF_OS390 - result = pkg_createSymLinks(targetDir, o->pdsbuild); -#else - result = pkg_createSymLinks(targetDir, noVersion); -#endif - if (result != 0) { - fprintf(stderr, "Error creating symbolic links of the data library file.\n"); - return result; - } - } -#endif - } /* !IN_STATIC_MODE */ -#endif - -#if !U_PLATFORM_USES_ONLY_WIN32_API - /* Install the libraries if option was set. */ - if (o->install != nullptr) { - if(o->verbose) { - fprintf(stdout, "# Installing library file to %s ..\n", o->install); - } - result = pkg_installLibrary(o->install, targetDir, noVersion); - if (result != 0) { - fprintf(stderr, "Error installing the data library.\n"); - return result; - } - } -#endif - } - } - return result; -} - -/* Initialize the pkgDataFlags with the option file given. */ -static int32_t initializePkgDataFlags(UPKGOptions *o) { - UErrorCode status = U_ZERO_ERROR; - int32_t result = 0; - int32_t currentBufferSize = SMALL_BUFFER_MAX_SIZE; - int32_t tmpResult = 0; - - /* Initialize pkgdataFlags */ - pkgDataFlags = (char**)uprv_malloc(sizeof(char*) * PKGDATA_FLAGS_SIZE); - - /* If we run out of space, allocate more */ -#if !defined(WINDOWS_WITH_MSVC) || defined(USING_CYGWIN) - do { -#endif - if (pkgDataFlags != nullptr) { - for (int32_t i = 0; i < PKGDATA_FLAGS_SIZE; i++) { - pkgDataFlags[i] = (char*)uprv_malloc(sizeof(char) * currentBufferSize); - if (pkgDataFlags[i] != nullptr) { - pkgDataFlags[i][0] = 0; - } else { - fprintf(stderr,"Error allocating memory for pkgDataFlags.\n"); - /* If an error occurs, ensure that the rest of the array is nullptr */ - for (int32_t n = i + 1; n < PKGDATA_FLAGS_SIZE; n++) { - pkgDataFlags[n] = nullptr; - } - return -1; - } - } - } else { - fprintf(stderr,"Error allocating memory for pkgDataFlags.\n"); - return -1; - } - - if (o->options == nullptr) { - return result; - } - -#if !defined(WINDOWS_WITH_MSVC) || defined(USING_CYGWIN) - /* Read in options file. */ - if(o->verbose) { - fprintf(stdout, "# Reading options file %s\n", o->options); - } - status = U_ZERO_ERROR; - tmpResult = parseFlagsFile(o->options, pkgDataFlags, currentBufferSize, FLAG_NAMES, (int32_t)PKGDATA_FLAGS_SIZE, &status); - if (status == U_BUFFER_OVERFLOW_ERROR) { - for (int32_t i = 0; i < PKGDATA_FLAGS_SIZE; i++) { - if (pkgDataFlags[i]) { - uprv_free(pkgDataFlags[i]); - pkgDataFlags[i] = nullptr; - } - } - currentBufferSize = tmpResult; - } else if (U_FAILURE(status)) { - fprintf(stderr,"Unable to open or read \"%s\" option file. status = %s\n", o->options, u_errorName(status)); - return -1; - } -#endif - if(o->verbose) { - fprintf(stdout, "# pkgDataFlags=\n"); - for(int32_t i=0;iverbose) { - fprintf(stdout, "# libFileName[LIB_FILE] = %s\n", libFileNames[LIB_FILE]); - } - -#if U_PLATFORM == U_PF_MINGW - // Name the import library lib*.dll.a - snprintf(libFileNames[LIB_FILE_MINGW], sizeof(libFileNames[LIB_FILE_MINGW]), "lib%s.dll.a", libName); -#elif U_PLATFORM == U_PF_CYGWIN - snprintf(libFileNames[LIB_FILE_CYGWIN], sizeof(libFileNames[LIB_FILE_CYGWIN]), "cyg%s%s%s", - libName, - FILE_EXTENSION_SEP, - pkgDataFlags[SO_EXT]); - snprintf(libFileNames[LIB_FILE_CYGWIN_VERSION], sizeof(libFileNames[LIB_FILE_CYGWIN_VERSION]), "cyg%s%s%s%s", - libName, - version_major, - FILE_EXTENSION_SEP, - pkgDataFlags[SO_EXT]); - - uprv_strcat(pkgDataFlags[SO_EXT], "."); - uprv_strcat(pkgDataFlags[SO_EXT], pkgDataFlags[A_EXT]); -#elif U_PLATFORM == U_PF_OS400 || defined(_AIX) - snprintf(libFileNames[LIB_FILE_VERSION_TMP], sizeof(libFileNames[LIB_FILE_VERSION_TMP]), "%s%s%s", - libFileNames[LIB_FILE], - FILE_EXTENSION_SEP, - pkgDataFlags[SOBJ_EXT]); -#elif U_PLATFORM == U_PF_OS390 - snprintf(libFileNames[LIB_FILE_VERSION_TMP], sizeof(libFileNames[LIB_FILE_VERSION_TMP]), "%s%s%s%s%s", - libFileNames[LIB_FILE], - pkgDataFlags[LIB_EXT_ORDER][0] == '.' ? "." : "", - reverseExt ? version : pkgDataFlags[SOBJ_EXT], - FILE_EXTENSION_SEP, - reverseExt ? pkgDataFlags[SOBJ_EXT] : version); - - snprintf(libFileNames[LIB_FILE_OS390BATCH_VERSION], sizeof(libFileNames[LIB_FILE_OS390BATCH_VERSION]), "%s%s.x", - libFileNames[LIB_FILE], - version); - snprintf(libFileNames[LIB_FILE_OS390BATCH_MAJOR], sizeof(libFileNames[LIB_FILE_OS390BATCH_MAJOR]), "%s%s.x", - libFileNames[LIB_FILE], - version_major); -#else - if (noVersion && !reverseExt) { - snprintf(libFileNames[LIB_FILE_VERSION_TMP], sizeof(libFileNames[LIB_FILE_VERSION_TMP]), "%s%s%s", - libFileNames[LIB_FILE], - FILE_SUFFIX, - pkgDataFlags[SOBJ_EXT]); - } else { - snprintf(libFileNames[LIB_FILE_VERSION_TMP], sizeof(libFileNames[LIB_FILE_VERSION_TMP]), "%s%s%s%s%s", - libFileNames[LIB_FILE], - FILE_SUFFIX, - reverseExt ? version : pkgDataFlags[SOBJ_EXT], - FILE_EXTENSION_SEP, - reverseExt ? pkgDataFlags[SOBJ_EXT] : version); - } -#endif - if (noVersion && !reverseExt) { - snprintf(libFileNames[LIB_FILE_VERSION_MAJOR], sizeof(libFileNames[LIB_FILE_VERSION_TMP]), "%s%s%s", - libFileNames[LIB_FILE], - FILE_SUFFIX, - pkgDataFlags[SO_EXT]); - - snprintf(libFileNames[LIB_FILE_VERSION], sizeof(libFileNames[LIB_FILE_VERSION]), "%s%s%s", - libFileNames[LIB_FILE], - FILE_SUFFIX, - pkgDataFlags[SO_EXT]); - } else { - snprintf(libFileNames[LIB_FILE_VERSION_MAJOR], sizeof(libFileNames[LIB_FILE_VERSION_MAJOR]), "%s%s%s%s%s", - libFileNames[LIB_FILE], - FILE_SUFFIX, - reverseExt ? version_major : pkgDataFlags[SO_EXT], - FILE_EXTENSION_SEP, - reverseExt ? pkgDataFlags[SO_EXT] : version_major); - - snprintf(libFileNames[LIB_FILE_VERSION], sizeof(libFileNames[LIB_FILE_VERSION]), "%s%s%s%s%s", - libFileNames[LIB_FILE], - FILE_SUFFIX, - reverseExt ? version : pkgDataFlags[SO_EXT], - FILE_EXTENSION_SEP, - reverseExt ? pkgDataFlags[SO_EXT] : version); - } - - if(o->verbose) { - fprintf(stdout, "# libFileName[LIB_FILE_VERSION] = %s\n", libFileNames[LIB_FILE_VERSION]); - } - -#if U_PF_MINGW <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN - /* Cygwin and MinGW only deals with the version major number. */ - uprv_strcpy(libFileNames[LIB_FILE_VERSION_TMP], libFileNames[LIB_FILE_VERSION_MAJOR]); -#endif - - if(IN_STATIC_MODE(mode)) { - snprintf(libFileNames[LIB_FILE_VERSION], sizeof(libFileNames[LIB_FILE_VERSION]), "%s.%s", libFileNames[LIB_FILE], pkgDataFlags[A_EXT]); - libFileNames[LIB_FILE_VERSION_MAJOR][0]=0; - if(o->verbose) { - fprintf(stdout, "# libFileName[LIB_FILE_VERSION] = %s (static)\n", libFileNames[LIB_FILE_VERSION]); - } - } -} - -/* Create the symbolic links for the final library file. */ -static int32_t pkg_createSymLinks(const char *targetDir, UBool specialHandling) { - int32_t result = 0; - char cmd[LARGE_BUFFER_MAX_SIZE]; - char name1[SMALL_BUFFER_MAX_SIZE]; /* symlink file name */ - char name2[SMALL_BUFFER_MAX_SIZE]; /* file name to symlink */ - const char* FILE_EXTENSION_SEP = uprv_strlen(pkgDataFlags[SO_EXT]) == 0 ? "" : "."; - -#if U_PLATFORM != U_PF_CYGWIN - /* No symbolic link to make. */ - if (uprv_strlen(libFileNames[LIB_FILE_VERSION]) == 0 || uprv_strlen(libFileNames[LIB_FILE_VERSION_MAJOR]) == 0 || - uprv_strcmp(libFileNames[LIB_FILE_VERSION], libFileNames[LIB_FILE_VERSION_MAJOR]) == 0) { - return result; - } - - snprintf(cmd, sizeof(cmd), "cd %s && %s %s && %s %s %s", - targetDir, - RM_CMD, - libFileNames[LIB_FILE_VERSION_MAJOR], - LN_CMD, - libFileNames[LIB_FILE_VERSION], - libFileNames[LIB_FILE_VERSION_MAJOR]); - result = runCommand(cmd); - if (result != 0) { - fprintf(stderr, "Error creating symbolic links. Failed command: %s\n", cmd); - return result; - } -#endif - - if (specialHandling) { -#if U_PLATFORM == U_PF_CYGWIN - snprintf(name1, sizeof(name1), "%s", libFileNames[LIB_FILE_CYGWIN]); - snprintf(name2, sizeof(name2), "%s", libFileNames[LIB_FILE_CYGWIN_VERSION]); -#elif U_PLATFORM == U_PF_OS390 - /* Create the symbolic links for the import data */ - /* Use the cmd buffer to store path to import data file to check its existence */ - snprintf(cmd, sizeof(cmd), "%s/%s", targetDir, libFileNames[LIB_FILE_OS390BATCH_VERSION]); - if (T_FileStream_file_exists(cmd)) { - snprintf(cmd, sizeof(cmd), "cd %s && %s %s && %s %s %s", - targetDir, - RM_CMD, - libFileNames[LIB_FILE_OS390BATCH_MAJOR], - LN_CMD, - libFileNames[LIB_FILE_OS390BATCH_VERSION], - libFileNames[LIB_FILE_OS390BATCH_MAJOR]); - result = runCommand(cmd); - if (result != 0) { - fprintf(stderr, "Error creating symbolic links. Failed command: %s\n", cmd); - return result; - } - - snprintf(cmd, sizeof(cmd), "cd %s && %s %s.x && %s %s %s.x", - targetDir, - RM_CMD, - libFileNames[LIB_FILE], - LN_CMD, - libFileNames[LIB_FILE_OS390BATCH_VERSION], - libFileNames[LIB_FILE]); - result = runCommand(cmd); - if (result != 0) { - fprintf(stderr, "Error creating symbolic links. Failed command: %s\n", cmd); - return result; - } - } - - /* Needs to be set here because special handling skips it */ - snprintf(name1, sizeof(name1), "%s%s%s", libFileNames[LIB_FILE], FILE_EXTENSION_SEP, pkgDataFlags[SO_EXT]); - snprintf(name2, sizeof(name2), "%s", libFileNames[LIB_FILE_VERSION]); -#else - goto normal_symlink_mode; -#endif - } else { -#if U_PLATFORM != U_PF_CYGWIN -normal_symlink_mode: -#endif - snprintf(name1, sizeof(name1), "%s%s%s", libFileNames[LIB_FILE], FILE_EXTENSION_SEP, pkgDataFlags[SO_EXT]); - snprintf(name2, sizeof(name2), "%s", libFileNames[LIB_FILE_VERSION]); - } - - snprintf(cmd, sizeof(cmd), "cd %s && %s %s && %s %s %s", - targetDir, - RM_CMD, - name1, - LN_CMD, - name2, - name1); - - result = runCommand(cmd); - - return result; -} - -static int32_t pkg_installLibrary(const char *installDir, const char *targetDir, UBool noVersion) { - int32_t result = 0; - char cmd[SMALL_BUFFER_MAX_SIZE]; - - auto ret = snprintf(cmd, - sizeof(cmd), - "cd %s && %s %s %s%s%s", - targetDir, - pkgDataFlags[INSTALL_CMD], - libFileNames[LIB_FILE_VERSION], - installDir, PKGDATA_FILE_SEP_STRING, libFileNames[LIB_FILE_VERSION]); - (void)ret; - U_ASSERT(0 <= ret && ret < SMALL_BUFFER_MAX_SIZE); - - result = runCommand(cmd); - - if (result != 0) { - fprintf(stderr, "Error installing library. Failed command: %s\n", cmd); - return result; - } - -#ifdef CYGWINMSVC - snprintf(cmd, sizeof(cmd), "cd %s && %s %s.lib %s", - targetDir, - pkgDataFlags[INSTALL_CMD], - libFileNames[LIB_FILE], - installDir - ); - result = runCommand(cmd); - - if (result != 0) { - fprintf(stderr, "Error installing library. Failed command: %s\n", cmd); - return result; - } -#elif U_PLATFORM == U_PF_CYGWIN - snprintf(cmd, sizeof(cmd), "cd %s && %s %s %s", - targetDir, - pkgDataFlags[INSTALL_CMD], - libFileNames[LIB_FILE_CYGWIN_VERSION], - installDir - ); - result = runCommand(cmd); - - if (result != 0) { - fprintf(stderr, "Error installing library. Failed command: %s\n", cmd); - return result; - } - -#elif U_PLATFORM == U_PF_OS390 - if (T_FileStream_file_exists(libFileNames[LIB_FILE_OS390BATCH_VERSION])) { - snprintf(cmd, sizeof(cmd), "%s %s %s", - pkgDataFlags[INSTALL_CMD], - libFileNames[LIB_FILE_OS390BATCH_VERSION], - installDir - ); - result = runCommand(cmd); - - if (result != 0) { - fprintf(stderr, "Error installing library. Failed command: %s\n", cmd); - return result; - } - } -#endif - - if (noVersion) { - return result; - } else { - return pkg_createSymLinks(installDir, true); - } -} - -static int32_t pkg_installCommonMode(const char *installDir, const char *fileName) { - int32_t result = 0; - char cmd[SMALL_BUFFER_MAX_SIZE] = ""; - - if (!T_FileStream_file_exists(installDir)) { - UErrorCode status = U_ZERO_ERROR; - - uprv_mkdir(installDir, &status); - if (U_FAILURE(status)) { - fprintf(stderr, "Error creating installation directory: %s\n", installDir); - return -1; - } - } -#ifndef U_WINDOWS_WITH_MSVC - snprintf(cmd, sizeof(cmd), "%s %s %s", pkgDataFlags[INSTALL_CMD], fileName, installDir); -#else - snprintf(cmd, sizeof(cmd), "%s %s %s %s", WIN_INSTALL_CMD, fileName, installDir, WIN_INSTALL_CMD_FLAGS); -#endif - - result = runCommand(cmd); - if (result != 0) { - fprintf(stderr, "Failed to install data file with command: %s\n", cmd); - } - - return result; -} - -#ifdef U_WINDOWS_MSVC -/* Copy commands for installing the raw data files on Windows. */ -#define WIN_INSTALL_CMD "xcopy" -#define WIN_INSTALL_CMD_FLAGS "/E /Y /K" -#endif -static int32_t pkg_installFileMode(const char *installDir, const char *srcDir, const char *fileListName) { - int32_t result = 0; - char cmd[SMALL_BUFFER_MAX_SIZE] = ""; - - if (!T_FileStream_file_exists(installDir)) { - UErrorCode status = U_ZERO_ERROR; - - uprv_mkdir(installDir, &status); - if (U_FAILURE(status)) { - fprintf(stderr, "Error creating installation directory: %s\n", installDir); - return -1; - } - } -#ifndef U_WINDOWS_WITH_MSVC - char buffer[SMALL_BUFFER_MAX_SIZE] = ""; - int32_t bufferLength = 0; - - FileStream *f = T_FileStream_open(fileListName, "r"); - if (f != nullptr) { - for(;;) { - if (T_FileStream_readLine(f, buffer, SMALL_BUFFER_MAX_SIZE) != nullptr) { - bufferLength = static_cast(uprv_strlen(buffer)); - /* Remove new line character. */ - if (bufferLength > 0) { - buffer[bufferLength-1] = 0; - } - - auto ret = snprintf(cmd, - sizeof(cmd), - "%s %s%s%s %s%s%s", - pkgDataFlags[INSTALL_CMD], - srcDir, PKGDATA_FILE_SEP_STRING, buffer, - installDir, PKGDATA_FILE_SEP_STRING, buffer); - (void)ret; - U_ASSERT(0 <= ret && ret < SMALL_BUFFER_MAX_SIZE); - - result = runCommand(cmd); - if (result != 0) { - fprintf(stderr, "Failed to install data file with command: %s\n", cmd); - break; - } - } else { - if (!T_FileStream_eof(f)) { - fprintf(stderr, "Failed to read line from file: %s\n", fileListName); - result = -1; - } - break; - } - } - T_FileStream_close(f); - } else { - result = -1; - fprintf(stderr, "Unable to open list file: %s\n", fileListName); - } -#else - snprintf(cmd, sizeof(cmd), "%s %s %s %s", WIN_INSTALL_CMD, srcDir, installDir, WIN_INSTALL_CMD_FLAGS); - result = runCommand(cmd); - if (result != 0) { - fprintf(stderr, "Failed to install data file with command: %s\n", cmd); - } -#endif - - return result; -} - -/* Archiving of the library file may be needed depending on the platform and options given. - * If archiving is not needed, copy over the library file name. - */ -static int32_t pkg_archiveLibrary(const char *targetDir, const char *version, UBool reverseExt) { - int32_t result = 0; - char cmd[LARGE_BUFFER_MAX_SIZE]; - - /* If the shared object suffix and the final object suffix is different and the final object suffix and the - * archive file suffix is the same, then the final library needs to be archived. - */ - if (uprv_strcmp(pkgDataFlags[SOBJ_EXT], pkgDataFlags[SO_EXT]) != 0 && uprv_strcmp(pkgDataFlags[A_EXT], pkgDataFlags[SO_EXT]) == 0) { - snprintf(libFileNames[LIB_FILE_VERSION], sizeof(libFileNames[LIB_FILE_VERSION]), "%s%s%s.%s", - libFileNames[LIB_FILE], - pkgDataFlags[LIB_EXT_ORDER][0] == '.' ? "." : "", - reverseExt ? version : pkgDataFlags[SO_EXT], - reverseExt ? pkgDataFlags[SO_EXT] : version); - - snprintf(cmd, sizeof(cmd), "%s %s %s%s %s%s", - pkgDataFlags[AR], - pkgDataFlags[ARFLAGS], - targetDir, - libFileNames[LIB_FILE_VERSION], - targetDir, - libFileNames[LIB_FILE_VERSION_TMP]); - - result = runCommand(cmd); - if (result != 0) { - fprintf(stderr, "Error creating archive library. Failed command: %s\n", cmd); - return result; - } - - snprintf(cmd, sizeof(cmd), "%s %s%s", - pkgDataFlags[RANLIB], - targetDir, - libFileNames[LIB_FILE_VERSION]); - - result = runCommand(cmd); - if (result != 0) { - fprintf(stderr, "Error creating archive library. Failed command: %s\n", cmd); - return result; - } - - /* Remove unneeded library file. */ - snprintf(cmd, sizeof(cmd), "%s %s%s", - RM_CMD, - targetDir, - libFileNames[LIB_FILE_VERSION_TMP]); - - result = runCommand(cmd); - if (result != 0) { - fprintf(stderr, "Error creating archive library. Failed command: %s\n", cmd); - return result; - } - - } else { - uprv_strcpy(libFileNames[LIB_FILE_VERSION], libFileNames[LIB_FILE_VERSION_TMP]); - } - - return result; -} - -/* - * Using the compiler information from the configuration file set by -O option, generate the library file. - * command may be given to allow for a larger buffer for cmd. - */ -static int32_t pkg_generateLibraryFile(const char *targetDir, const char mode, const char *objectFile, char *command, UBool specialHandling) { - int32_t result = 0; - char *cmd = nullptr; - UBool freeCmd = false; - int32_t length = 0; - - (void)specialHandling; // Suppress unused variable compiler warnings on platforms where all usage - // of this parameter is #ifdefed out. - - /* This is necessary because if packaging is done without assembly code, objectFile might be extremely large - * containing many object files and so the calling function should supply a command buffer that is large - * enough to handle this. Otherwise, use the default size. - */ - if (command != nullptr) { - cmd = command; - } - - if (IN_STATIC_MODE(mode)) { - if (cmd == nullptr) { - length = static_cast(uprv_strlen(pkgDataFlags[AR]) + uprv_strlen(pkgDataFlags[ARFLAGS]) + uprv_strlen(targetDir) + - uprv_strlen(libFileNames[LIB_FILE_VERSION]) + uprv_strlen(objectFile) + uprv_strlen(pkgDataFlags[RANLIB]) + BUFFER_PADDING_SIZE); - if ((cmd = (char *)uprv_malloc(sizeof(char) * length)) == nullptr) { - fprintf(stderr, "Unable to allocate memory for command.\n"); - return -1; - } - freeCmd = true; - } - sprintf(cmd, "%s %s %s%s %s", - pkgDataFlags[AR], - pkgDataFlags[ARFLAGS], - targetDir, - libFileNames[LIB_FILE_VERSION], - objectFile); - - result = runCommand(cmd); - if (result == 0) { - sprintf(cmd, "%s %s%s", - pkgDataFlags[RANLIB], - targetDir, - libFileNames[LIB_FILE_VERSION]); - - result = runCommand(cmd); - } - } else /* if (IN_DLL_MODE(mode)) */ { - if (cmd == nullptr) { - length = static_cast(uprv_strlen(pkgDataFlags[GENLIB]) + uprv_strlen(pkgDataFlags[LDICUDTFLAGS]) + - ((uprv_strlen(targetDir) + uprv_strlen(libFileNames[LIB_FILE_VERSION_TMP])) * 2) + - uprv_strlen(objectFile) + uprv_strlen(pkgDataFlags[LD_SONAME]) + - uprv_strlen(pkgDataFlags[LD_SONAME][0] == 0 ? "" : libFileNames[LIB_FILE_VERSION_MAJOR]) + - uprv_strlen(pkgDataFlags[RPATH_FLAGS]) + uprv_strlen(pkgDataFlags[BIR_FLAGS]) + BUFFER_PADDING_SIZE); -#if U_PLATFORM == U_PF_CYGWIN - length += static_cast(uprv_strlen(targetDir) + uprv_strlen(libFileNames[LIB_FILE_CYGWIN_VERSION])); -#elif U_PLATFORM == U_PF_MINGW - length += static_cast(uprv_strlen(targetDir) + uprv_strlen(libFileNames[LIB_FILE_MINGW])); -#endif - if ((cmd = (char *)uprv_malloc(sizeof(char) * length)) == nullptr) { - fprintf(stderr, "Unable to allocate memory for command.\n"); - return -1; - } - freeCmd = true; - } -#if U_PLATFORM == U_PF_MINGW - sprintf(cmd, "%s%s%s %s -o %s%s %s %s%s %s %s", - pkgDataFlags[GENLIB], - targetDir, - libFileNames[LIB_FILE_MINGW], - pkgDataFlags[LDICUDTFLAGS], - targetDir, - libFileNames[LIB_FILE_VERSION_TMP], -#elif U_PLATFORM == U_PF_CYGWIN - sprintf(cmd, "%s%s%s %s -o %s%s %s %s%s %s %s", - pkgDataFlags[GENLIB], - targetDir, - libFileNames[LIB_FILE_VERSION_TMP], - pkgDataFlags[LDICUDTFLAGS], - targetDir, - libFileNames[LIB_FILE_CYGWIN_VERSION], -#elif U_PLATFORM == U_PF_AIX - sprintf(cmd, "%s %s%s;%s %s -o %s%s %s %s%s %s %s", - RM_CMD, - targetDir, - libFileNames[LIB_FILE_VERSION_TMP], - pkgDataFlags[GENLIB], - pkgDataFlags[LDICUDTFLAGS], - targetDir, - libFileNames[LIB_FILE_VERSION_TMP], -#else - sprintf(cmd, "%s %s -o %s%s %s %s%s %s %s", - pkgDataFlags[GENLIB], - pkgDataFlags[LDICUDTFLAGS], - targetDir, - libFileNames[LIB_FILE_VERSION_TMP], -#endif - objectFile, - pkgDataFlags[LD_SONAME], - pkgDataFlags[LD_SONAME][0] == 0 ? "" : libFileNames[LIB_FILE_VERSION_MAJOR], - pkgDataFlags[RPATH_FLAGS], - pkgDataFlags[BIR_FLAGS]); - - /* Generate the library file. */ - result = runCommand(cmd); - -#if U_PLATFORM == U_PF_OS390 - char *env_tmp; - char PDS_LibName[512]; - char PDS_Name[512]; - - PDS_Name[0] = 0; - PDS_LibName[0] = 0; - if (specialHandling && uprv_strcmp(libFileNames[LIB_FILE],"libicudata") == 0) { - if (env_tmp = getenv("ICU_PDS_NAME")) { - sprintf(PDS_Name, "%s%s", - env_tmp, - "DA"); - strcat(PDS_Name, getenv("ICU_PDS_NAME_SUFFIX")); - } else if (env_tmp = getenv("PDS_NAME_PREFIX")) { - sprintf(PDS_Name, "%s%s", - env_tmp, - U_ICU_VERSION_SHORT "DA"); - } else { - sprintf(PDS_Name, "%s%s", - "IXMI", - U_ICU_VERSION_SHORT "DA"); - } - } else if (!specialHandling && uprv_strcmp(libFileNames[LIB_FILE],"libicudata_stub") == 0) { - if (env_tmp = getenv("ICU_PDS_NAME")) { - sprintf(PDS_Name, "%s%s", - env_tmp, - "D1"); - strcat(PDS_Name, getenv("ICU_PDS_NAME_SUFFIX")); - } else if (env_tmp = getenv("PDS_NAME_PREFIX")) { - sprintf(PDS_Name, "%s%s", - env_tmp, - U_ICU_VERSION_SHORT "D1"); - } else { - sprintf(PDS_Name, "%s%s", - "IXMI", - U_ICU_VERSION_SHORT "D1"); - } - } - - if (PDS_Name[0]) { - sprintf(PDS_LibName,"%s%s%s%s%s", - "\"//'", - getenv("LOADMOD"), - "(", - PDS_Name, - ")'\""); - sprintf(cmd, "%s %s -o %s %s %s%s %s %s", - pkgDataFlags[GENLIB], - pkgDataFlags[LDICUDTFLAGS], - PDS_LibName, - objectFile, - pkgDataFlags[LD_SONAME], - pkgDataFlags[LD_SONAME][0] == 0 ? "" : libFileNames[LIB_FILE_VERSION_MAJOR], - pkgDataFlags[RPATH_FLAGS], - pkgDataFlags[BIR_FLAGS]); - - result = runCommand(cmd); - } -#endif - } - - if (result != 0) { - fprintf(stderr, "Error generating library file. Failed command: %s\n", cmd); - } - - if (freeCmd) { - uprv_free(cmd); - } - - return result; -} - -static int32_t pkg_createWithAssemblyCode(const char *targetDir, const char mode, const char *gencFilePath) { - char tempObjectFile[SMALL_BUFFER_MAX_SIZE] = ""; - int32_t result = 0; - int32_t length = 0; - - /* Remove the ending .s and replace it with .o for the new object file. */ - uprv_strcpy(tempObjectFile, gencFilePath); - tempObjectFile[uprv_strlen(tempObjectFile)-1] = 'o'; - - length = static_cast(uprv_strlen(pkgDataFlags[COMPILER]) + uprv_strlen(pkgDataFlags[LIBFLAGS]) - + uprv_strlen(tempObjectFile) + uprv_strlen(gencFilePath) + BUFFER_PADDING_SIZE); - - LocalMemory cmd((char *)uprv_malloc(sizeof(char) * length)); - if (cmd.isNull()) { - return -1; - } - - /* Generate the object file. */ - snprintf(cmd.getAlias(), length, "%s %s -o %s %s", - pkgDataFlags[COMPILER], - pkgDataFlags[LIBFLAGS], - tempObjectFile, - gencFilePath); - - result = runCommand(cmd.getAlias()); - - if (result != 0) { - fprintf(stderr, "Error creating with assembly code. Failed command: %s\n", cmd.getAlias()); - return result; - } - - return pkg_generateLibraryFile(targetDir, mode, tempObjectFile); -} - -#ifdef BUILD_DATA_WITHOUT_ASSEMBLY -/* - * Generation of the data library without assembly code needs to compile each data file - * individually and then link it all together. - * Note: Any update to the directory structure of the data needs to be reflected here. - */ -enum { - DATA_PREFIX_BRKITR, - DATA_PREFIX_COLL, - DATA_PREFIX_CURR, - DATA_PREFIX_LANG, - DATA_PREFIX_RBNF, - DATA_PREFIX_REGION, - DATA_PREFIX_TRANSLIT, - DATA_PREFIX_ZONE, - DATA_PREFIX_UNIT, - DATA_PREFIX_LENGTH -}; - -const static char DATA_PREFIX[DATA_PREFIX_LENGTH][10] = { - "brkitr", - "coll", - "curr", - "lang", - "rbnf", - "region", - "translit", - "zone", - "unit" -}; - -static int32_t pkg_createWithoutAssemblyCode(UPKGOptions *o, const char *targetDir, const char mode) { - int32_t result = 0; - CharList *list = o->filePaths; - CharList *listNames = o->files; - int32_t listSize = pkg_countCharList(list); - char *buffer; - char *cmd; - char gencmnFile[SMALL_BUFFER_MAX_SIZE] = ""; - char tempObjectFile[SMALL_BUFFER_MAX_SIZE] = ""; -#ifdef USE_SINGLE_CCODE_FILE - char icudtAll[SMALL_BUFFER_MAX_SIZE] = ""; - FileStream *icudtAllFile = nullptr; - - snprintf(icudtAll, sizeof(icudtAll), "%s%s%sall.c", - o->tmpDir, - PKGDATA_FILE_SEP_STRING, - libFileNames[LIB_FILE]); - /* Remove previous icudtall.c file. */ - if (T_FileStream_file_exists(icudtAll) && (result = remove(icudtAll)) != 0) { - fprintf(stderr, "Unable to remove old icudtall file: %s\n", icudtAll); - return result; - } - - if((icudtAllFile = T_FileStream_open(icudtAll, "w"))==nullptr) { - fprintf(stderr, "Unable to write to icudtall file: %s\n", icudtAll); - return result; - } -#endif - - if (list == nullptr || listNames == nullptr) { - /* list and listNames should never be nullptr since we are looping through the CharList with - * the given size. - */ - return -1; - } - - if ((cmd = (char *)uprv_malloc((listSize + 2) * SMALL_BUFFER_MAX_SIZE)) == nullptr) { - fprintf(stderr, "Unable to allocate memory for cmd.\n"); - return -1; - } else if ((buffer = (char *)uprv_malloc((listSize + 1) * SMALL_BUFFER_MAX_SIZE)) == nullptr) { - fprintf(stderr, "Unable to allocate memory for buffer.\n"); - uprv_free(cmd); - return -1; - } - - for (int32_t i = 0; i < (listSize + 1); i++) { - const char *file ; - const char *name; - - if (i == 0) { - /* The first iteration calls the gencmn function and initializes the buffer. */ - createCommonDataFile(o->tmpDir, o->shortName, o->entryName, nullptr, o->srcDir, o->comment, o->fileListFiles->str, 0, true, o->verbose, gencmnFile); - buffer[0] = 0; -#ifdef USE_SINGLE_CCODE_FILE - uprv_strcpy(tempObjectFile, gencmnFile); - tempObjectFile[uprv_strlen(tempObjectFile) - 1] = 'o'; - - sprintf(cmd, "%s %s -o %s %s", - pkgDataFlags[COMPILER], - pkgDataFlags[LIBFLAGS], - tempObjectFile, - gencmnFile); - - result = runCommand(cmd); - if (result != 0) { - break; - } - - sprintf(buffer, "%s",tempObjectFile); -#endif - } else { - char newName[SMALL_BUFFER_MAX_SIZE]; - char dataName[SMALL_BUFFER_MAX_SIZE]; - char dataDirName[SMALL_BUFFER_MAX_SIZE]; - const char *pSubstring; - file = list->str; - name = listNames->str; - - newName[0] = dataName[0] = 0; - for (int32_t n = 0; n < DATA_PREFIX_LENGTH; n++) { - dataDirName[0] = 0; - sprintf(dataDirName, "%s%s", DATA_PREFIX[n], PKGDATA_FILE_SEP_STRING); - /* If the name contains a prefix (indicating directory), alter the new name accordingly. */ - pSubstring = uprv_strstr(name, dataDirName); - if (pSubstring != nullptr) { - char newNameTmp[SMALL_BUFFER_MAX_SIZE] = ""; - const char *p = name + uprv_strlen(dataDirName); - for (int32_t i = 0;;i++) { - if (p[i] == '.') { - newNameTmp[i] = '_'; - continue; - } - newNameTmp[i] = p[i]; - if (p[i] == 0) { - break; - } - } - auto ret = snprintf(newName, - sizeof(newName), - "%s_%s", - DATA_PREFIX[n], - newNameTmp); - (void)ret; - U_ASSERT(0 <= ret && ret < SMALL_BUFFER_MAX_SIZE); - ret = snprintf(dataName, - sizeof(dataName), - "%s_%s", - o->shortName, - DATA_PREFIX[n]); - (void)ret; - U_ASSERT(0 <= ret && ret < SMALL_BUFFER_MAX_SIZE); - } - if (newName[0] != 0) { - break; - } - } - - if(o->verbose) { - printf("# Generating %s \n", gencmnFile); - } - - writeCCode( - file, - o->tmpDir, - nullptr, - dataName[0] != 0 ? dataName : o->shortName, - newName[0] != 0 ? newName : nullptr, - gencmnFile, - sizeof(gencmnFile)); - -#ifdef USE_SINGLE_CCODE_FILE - sprintf(cmd, "#include \"%s\"\n", gencmnFile); - T_FileStream_writeLine(icudtAllFile, cmd); - /* don't delete the file */ -#endif - } - -#ifndef USE_SINGLE_CCODE_FILE - uprv_strcpy(tempObjectFile, gencmnFile); - tempObjectFile[uprv_strlen(tempObjectFile) - 1] = 'o'; - - sprintf(cmd, "%s %s -o %s %s", - pkgDataFlags[COMPILER], - pkgDataFlags[LIBFLAGS], - tempObjectFile, - gencmnFile); - result = runCommand(cmd); - if (result != 0) { - fprintf(stderr, "Error creating library without assembly code. Failed command: %s\n", cmd); - break; - } - - uprv_strcat(buffer, " "); - uprv_strcat(buffer, tempObjectFile); - -#endif - - if (i > 0) { - list = list->next; - listNames = listNames->next; - } - } - -#ifdef USE_SINGLE_CCODE_FILE - T_FileStream_close(icudtAllFile); - uprv_strcpy(tempObjectFile, icudtAll); - tempObjectFile[uprv_strlen(tempObjectFile) - 1] = 'o'; - - sprintf(cmd, "%s %s -I. -o %s %s", - pkgDataFlags[COMPILER], - pkgDataFlags[LIBFLAGS], - tempObjectFile, - icudtAll); - - result = runCommand(cmd); - if (result == 0) { - uprv_strcat(buffer, " "); - uprv_strcat(buffer, tempObjectFile); - } else { - fprintf(stderr, "Error creating library without assembly code. Failed command: %s\n", cmd); - } -#endif - - if (result == 0) { - /* Generate the library file. */ -#if U_PLATFORM == U_PF_OS390 - result = pkg_generateLibraryFile(targetDir, mode, buffer, cmd, (o->pdsbuild && IN_DLL_MODE(mode))); -#else - result = pkg_generateLibraryFile(targetDir,mode, buffer, cmd); -#endif - } - - uprv_free(buffer); - uprv_free(cmd); - - return result; -} -#endif - -#ifdef WINDOWS_WITH_MSVC -#define LINK_CMD "link.exe /nologo /release /out:" -#define LINK_FLAGS "/NXCOMPAT /DYNAMICBASE /DLL /NOENTRY /MANIFEST:NO /implib:" - -#define LINK_EXTRA_UWP_FLAGS "/APPCONTAINER " -#define LINK_EXTRA_UWP_FLAGS_X86_ONLY "/SAFESEH " - -#define LINK_EXTRA_FLAGS_MACHINE "/MACHINE:" -#define LIB_CMD "LIB.exe /nologo /out:" -#define LIB_FILE "icudt.lib" -#define LIB_EXT UDATA_LIB_SUFFIX -#define DLL_EXT UDATA_SO_SUFFIX - -static int32_t pkg_createWindowsDLL(const char mode, const char *gencFilePath, UPKGOptions *o) { - int32_t result = 0; - char cmd[LARGE_BUFFER_MAX_SIZE]; - if (IN_STATIC_MODE(mode)) { - char staticLibFilePath[SMALL_BUFFER_MAX_SIZE] = ""; - -#ifdef CYGWINMSVC - snprintf(staticLibFilePath, sizeof(staticLibFilePath), "%s%s%s%s%s", - o->targetDir, - PKGDATA_FILE_SEP_STRING, - pkgDataFlags[LIBPREFIX], - o->libName, - LIB_EXT); -#else - snprintf(staticLibFilePath, sizeof(staticLibFilePath), "%s%s%s%s%s", - o->targetDir, - PKGDATA_FILE_SEP_STRING, - (strstr(o->libName, "icudt") ? "s" : ""), - o->libName, - LIB_EXT); -#endif - - snprintf(cmd, sizeof(cmd), "%s\"%s\" \"%s\"", - LIB_CMD, - staticLibFilePath, - gencFilePath); - } else if (IN_DLL_MODE(mode)) { - char dllFilePath[SMALL_BUFFER_MAX_SIZE] = ""; - char libFilePath[SMALL_BUFFER_MAX_SIZE] = ""; - char resFilePath[SMALL_BUFFER_MAX_SIZE] = ""; - char tmpResFilePath[SMALL_BUFFER_MAX_SIZE] = ""; - -#ifdef CYGWINMSVC - uprv_strcpy(dllFilePath, o->targetDir); -#else - uprv_strcpy(dllFilePath, o->srcDir); -#endif - uprv_strcat(dllFilePath, PKGDATA_FILE_SEP_STRING); - uprv_strcpy(libFilePath, dllFilePath); - -#ifdef CYGWINMSVC - uprv_strcat(libFilePath, o->libName); - uprv_strcat(libFilePath, ".lib"); - - uprv_strcat(dllFilePath, o->libName); - uprv_strcat(dllFilePath, o->version); -#else - if (strstr(o->libName, "icudt")) { - uprv_strcat(libFilePath, LIB_FILE); - } else { - uprv_strcat(libFilePath, o->libName); - uprv_strcat(libFilePath, ".lib"); - } - uprv_strcat(dllFilePath, o->entryName); -#endif - uprv_strcat(dllFilePath, DLL_EXT); - - uprv_strcpy(tmpResFilePath, o->tmpDir); - uprv_strcat(tmpResFilePath, PKGDATA_FILE_SEP_STRING); - uprv_strcat(tmpResFilePath, ICUDATA_RES_FILE); - - if (T_FileStream_file_exists(tmpResFilePath)) { - snprintf(resFilePath, sizeof(resFilePath), "\"%s\"", tmpResFilePath); - } - - /* Check if dll file and lib file exists and that it is not newer than genc file. */ - if (!o->rebuild && (T_FileStream_file_exists(dllFilePath) && isFileModTimeLater(dllFilePath, gencFilePath)) && - (T_FileStream_file_exists(libFilePath) && isFileModTimeLater(libFilePath, gencFilePath))) { - if(o->verbose) { - printf("# Not rebuilding %s - up to date.\n", gencFilePath); - } - return 0; - } - - char extraFlags[SMALL_BUFFER_MAX_SIZE] = ""; -#ifdef WINDOWS_WITH_MSVC - if (options[WIN_UWP_BUILD].doesOccur) { - uprv_strcat(extraFlags, LINK_EXTRA_UWP_FLAGS); - - if (options[WIN_DLL_ARCH].doesOccur) { - if (uprv_strcmp(options[WIN_DLL_ARCH].value, "X86") == 0) { - uprv_strcat(extraFlags, LINK_EXTRA_UWP_FLAGS_X86_ONLY); - } - } - } - - if (options[WIN_DLL_ARCH].doesOccur) { - uprv_strcat(extraFlags, LINK_EXTRA_FLAGS_MACHINE); - uprv_strcat(extraFlags, options[WIN_DLL_ARCH].value); - } - -#endif - snprintf(cmd, sizeof(cmd), "%s\"%s\" %s %s\"%s\" \"%s\" %s", - LINK_CMD, - dllFilePath, - extraFlags, - LINK_FLAGS, - libFilePath, - gencFilePath, - resFilePath - ); - } - - result = runCommand(cmd, true); - if (result != 0) { - fprintf(stderr, "Error creating Windows DLL library. Failed command: %s\n", cmd); - } - - return result; -} -#endif - -static UPKGOptions *pkg_checkFlag(UPKGOptions *o) { -#if U_PLATFORM == U_PF_AIX - /* AIX needs a map file. */ - char *flag = nullptr; - int32_t length = 0; - char tmpbuffer[SMALL_BUFFER_MAX_SIZE]; - const char MAP_FILE_EXT[] = ".map"; - FileStream *f = nullptr; - char mapFile[SMALL_BUFFER_MAX_SIZE] = ""; - int32_t start = -1; - uint32_t count = 0; - const char rm_cmd[] = "rm -f all ;"; - - flag = pkgDataFlags[GENLIB]; - - /* This portion of the code removes 'rm -f all' in the GENLIB. - * Only occurs in AIX. - */ - if (uprv_strstr(flag, rm_cmd) != nullptr) { - char *tmpGenlibFlagBuffer = nullptr; - int32_t i, offset; - - length = static_cast(uprv_strlen(flag) + 1); - tmpGenlibFlagBuffer = (char *)uprv_malloc(length); - if (tmpGenlibFlagBuffer == nullptr) { - /* Memory allocation error */ - fprintf(stderr,"Unable to allocate buffer of size: %d.\n", length); - return nullptr; - } - - uprv_strcpy(tmpGenlibFlagBuffer, flag); - - offset = static_cast(uprv_strlen(rm_cmd)); - - for (i = 0; i < (length - offset); i++) { - flag[i] = tmpGenlibFlagBuffer[offset + i]; - } - - /* Zero terminate the string */ - flag[i] = 0; - - uprv_free(tmpGenlibFlagBuffer); - } - - flag = pkgDataFlags[BIR_FLAGS]; - length = static_cast(uprv_strlen(pkgDataFlags[BIR_FLAGS])); - - for (int32_t i = 0; i < length; i++) { - if (flag[i] == MAP_FILE_EXT[count]) { - if (count == 0) { - start = i; - } - count++; - } else { - count = 0; - } - - if (count == uprv_strlen(MAP_FILE_EXT)) { - break; - } - } - - if (start >= 0) { - int32_t index = 0; - for (int32_t i = 0;;i++) { - if (i == start) { - for (int32_t n = 0;;n++) { - if (o->shortName[n] == 0) { - break; - } - tmpbuffer[index++] = o->shortName[n]; - } - } - - tmpbuffer[index++] = flag[i]; - - if (flag[i] == 0) { - break; - } - } - - uprv_memset(flag, 0, length); - uprv_strcpy(flag, tmpbuffer); - - uprv_strcpy(mapFile, o->shortName); - uprv_strcat(mapFile, MAP_FILE_EXT); - - f = T_FileStream_open(mapFile, "w"); - if (f == nullptr) { - fprintf(stderr,"Unable to create map file: %s.\n", mapFile); - return nullptr; - } else { - snprintf(tmpbuffer, sizeof(tmpbuffer), "%s%s ", o->entryName, UDATA_CMN_INTERMEDIATE_SUFFIX); - - T_FileStream_writeLine(f, tmpbuffer); - - T_FileStream_close(f); - } - } -#elif U_PLATFORM == U_PF_CYGWIN || U_PLATFORM == U_PF_MINGW - /* Cygwin needs to change flag options. */ - char *flag = nullptr; - int32_t length = 0; - - flag = pkgDataFlags[GENLIB]; - length = static_cast(uprv_strlen(pkgDataFlags[GENLIB])); - - int32_t position = length - 1; - - for(;position >= 0;position--) { - if (flag[position] == '=') { - position++; - break; - } - } - - uprv_memset(flag + position, 0, length - position); -#elif U_PLATFORM == U_PF_OS400 - /* OS/400 needs to fix the ld options (swap single quote with double quote) */ - char *flag = nullptr; - int32_t length = 0; - - flag = pkgDataFlags[GENLIB]; - length = static_cast(uprv_strlen(pkgDataFlags[GENLIB])); - - int32_t position = length - 1; - - for(int32_t i = 0; i < length; i++) { - if (flag[i] == '\'') { - flag[i] = '\"'; - } - } -#endif - // Don't really need a return value, just need to stop compiler warnings about - // the unused parameter 'o' on platforms where it is not otherwise used. - return o; -} - -static void loadLists(UPKGOptions *o, UErrorCode *status) -{ - CharList *l, *tail = nullptr, *tail2 = nullptr; - FileStream *in; - char line[16384]; - char *linePtr, *lineNext; - const uint32_t lineMax = 16300; - char *tmp; - int32_t tmpLength = 0; - char *s; - int32_t ln=0; /* line number */ - - for(l = o->fileListFiles; l; l = l->next) { - if(o->verbose) { - fprintf(stdout, "# pkgdata: Reading %s..\n", l->str); - } - /* TODO: stdin */ - in = T_FileStream_open(l->str, "r"); /* open files list */ - - if(!in) { - fprintf(stderr, "Error opening <%s>.\n", l->str); - *status = U_FILE_ACCESS_ERROR; - return; - } - - while(T_FileStream_readLine(in, line, sizeof(line))!=nullptr) { /* for each line */ - ln++; - if(uprv_strlen(line)>lineMax) { - fprintf(stderr, "%s:%d - line too long (over %d chars)\n", l->str, (int)ln, (int)lineMax); - exit(1); - } - /* remove spaces at the beginning */ - linePtr = line; - /* On z/OS, disable call to isspace (#9996). Investigate using uprv_isspace instead (#9999) */ -#if U_PLATFORM != U_PF_OS390 - while(isspace(*linePtr)) { - linePtr++; - } -#endif - s=linePtr; - /* remove trailing newline characters */ - while(*s!=0) { - if(*s=='\r' || *s=='\n') { - *s=0; - break; - } - ++s; - } - if((*linePtr == 0) || (*linePtr == '#')) { - continue; /* comment or empty line */ - } - - /* Now, process the line */ - lineNext = nullptr; - - while(linePtr && *linePtr) { /* process space-separated items */ - while(*linePtr == ' ') { - linePtr++; - } - /* Find the next quote */ - if(linePtr[0] == '"') - { - lineNext = uprv_strchr(linePtr+1, '"'); - if(lineNext == nullptr) { - fprintf(stderr, "%s:%d - missing trailing double quote (\")\n", - l->str, (int)ln); - exit(1); - } else { - lineNext++; - if(*lineNext) { - if(*lineNext != ' ') { - fprintf(stderr, "%s:%d - malformed quoted line at position %d, expected ' ' got '%c'\n", - l->str, (int)ln, (int)(lineNext-line), (*lineNext)?*lineNext:'0'); - exit(1); - } - *lineNext = 0; - lineNext++; - } - } - } else { - lineNext = uprv_strchr(linePtr, ' '); - if(lineNext) { - *lineNext = 0; /* terminate at space */ - lineNext++; - } - } - - /* add the file */ - s = (char*)getLongPathname(linePtr); - - /* normal mode.. o->files is just the bare list without package names */ - o->files = pkg_appendToList(o->files, &tail, uprv_strdup(linePtr)); - if(uprv_pathIsAbsolute(s) || s[0] == '.') { - fprintf(stderr, "pkgdata: Error: absolute path encountered. Old style paths are not supported. Use relative paths such as 'fur.res' or 'translit%cfur.res'.\n\tBad path: '%s'\n", U_FILE_SEP_CHAR, s); - exit(U_ILLEGAL_ARGUMENT_ERROR); - } - /* The +5 is to add a little extra space for, among other things, PKGDATA_FILE_SEP_STRING */ - tmpLength = static_cast(uprv_strlen(o->srcDir) + uprv_strlen(s) + 5); - if((tmp = (char *)uprv_malloc(tmpLength)) == nullptr) { - fprintf(stderr, "pkgdata: Error: Unable to allocate tmp buffer size: %d\n", tmpLength); - exit(U_MEMORY_ALLOCATION_ERROR); - } - uprv_strcpy(tmp, o->srcDir); - uprv_strcat(tmp, o->srcDir[uprv_strlen(o->srcDir)-1] == U_FILE_SEP_CHAR ? "" : PKGDATA_FILE_SEP_STRING); - uprv_strcat(tmp, s); - o->filePaths = pkg_appendToList(o->filePaths, &tail2, tmp); - linePtr = lineNext; - } /* for each entry on line */ - } /* for each line */ - T_FileStream_close(in); - } /* for each file list file */ -} - -/* Helper for pkg_getPkgDataPath() */ -#if U_HAVE_POPEN -static UBool getPkgDataPath(const char *cmd, UBool verbose, char *buf, size_t items) { - icu::CharString cmdBuf; - UErrorCode status = U_ZERO_ERROR; - icu::LocalPipeFilePointer p; - size_t n; - - cmdBuf.append(cmd, status); - if (verbose) { - fprintf(stdout, "# Calling: %s\n", cmdBuf.data()); - } - p.adoptInstead( popen(cmdBuf.data(), "r") ); - - if (p.isNull() || (n = fread(buf, 1, items-1, p.getAlias())) <= 0) { - fprintf(stderr, "%s: Error calling '%s'\n", progname, cmd); - *buf = 0; - return false; - } - - return true; -} -#endif - -/* Get path to pkgdata.inc. Try pkg-config first, falling back to icu-config. */ -static int32_t pkg_getPkgDataPath(UBool verbose, UOption *option) { -#if U_HAVE_POPEN - static char buf[512] = ""; - UBool pkgconfigIsValid = true; - const char *pkgconfigCmd = "pkg-config --variable=pkglibdir icu-uc"; - const char *icuconfigCmd = "icu-config --incpkgdatafile"; - const char *pkgdata = "pkgdata.inc"; - - if (!getPkgDataPath(pkgconfigCmd, verbose, buf, UPRV_LENGTHOF(buf))) { - if (!getPkgDataPath(icuconfigCmd, verbose, buf, UPRV_LENGTHOF(buf))) { - fprintf(stderr, "%s: icu-config not found. Fix PATH or specify -O option\n", progname); - return -1; - } - - pkgconfigIsValid = false; - } - - for (int32_t length = strlen(buf) - 1; length >= 0; length--) { - if (buf[length] == '\n' || buf[length] == ' ') { - buf[length] = 0; - } else { - break; - } - } - - if (!*buf) { - fprintf(stderr, "%s: Unable to locate pkgdata.inc. Unable to parse the results of '%s'. Check paths or use the -O option to specify the path to pkgdata.inc.\n", progname, pkgconfigIsValid ? pkgconfigCmd : icuconfigCmd); - return -1; - } - - if (pkgconfigIsValid) { - uprv_strcat(buf, U_FILE_SEP_STRING); - uprv_strcat(buf, pkgdata); - } - - buf[strlen(buf)] = 0; - - option->value = buf; - option->doesOccur = true; - - return 0; -#else - return -1; -#endif -} - -#ifdef CAN_WRITE_OBJ_CODE - /* Create optMatchArch for genccode architecture detection */ -static void pkg_createOptMatchArch(char *optMatchArch) { -#if !defined(WINDOWS_WITH_MSVC) || defined(USING_CYGWIN) - const char* code = "void oma(){}"; - const char* source = "oma.c"; - const char* obj = "oma.obj"; - FileStream* stream = nullptr; - - stream = T_FileStream_open(source,"w"); - if (stream != nullptr) { - T_FileStream_writeLine(stream, code); - T_FileStream_close(stream); - - char cmd[LARGE_BUFFER_MAX_SIZE]; - snprintf(cmd, sizeof(cmd), "%s %s -o %s", - pkgDataFlags[COMPILER], - source, - obj); - - if (runCommand(cmd) == 0){ - sprintf(optMatchArch, "%s", obj); - } - else { - fprintf(stderr, "Failed to compile %s\n", source); - } - if(!T_FileStream_remove(source)){ - fprintf(stderr, "T_FileStream_remove failed to delete %s\n", source); - } - } - else { - fprintf(stderr, "T_FileStream_open failed to open %s for writing\n", source); - } -#endif -} -static void pkg_destroyOptMatchArch(char *optMatchArch) { - if(T_FileStream_file_exists(optMatchArch) && !T_FileStream_remove(optMatchArch)){ - fprintf(stderr, "T_FileStream_remove failed to delete %s\n", optMatchArch); - } -} -#endif diff --git a/tools/icu/patches/75/source/tools/toolutil/pkg_genc.cpp b/tools/icu/patches/75/source/tools/toolutil/pkg_genc.cpp deleted file mode 100644 index d51a52c8fff..00000000000 --- a/tools/icu/patches/75/source/tools/toolutil/pkg_genc.cpp +++ /dev/null @@ -1,1428 +0,0 @@ -// © 2016 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -/****************************************************************************** - * Copyright (C) 2009-2016, International Business Machines - * Corporation and others. All Rights Reserved. - ******************************************************************************* - */ -#include "unicode/utypes.h" - -#if U_PLATFORM_HAS_WIN32_API -# define VC_EXTRALEAN -# define WIN32_LEAN_AND_MEAN -# define NOUSER -# define NOSERVICE -# define NOIME -# define NOMCX -#include -#include -# if defined(__clang__) -# include -# endif -# ifdef __GNUC__ -# define WINDOWS_WITH_GNUC -# endif -#endif - -#if U_PLATFORM_IS_LINUX_BASED && U_HAVE_ELF_H -# define U_ELF -#endif - -#ifdef U_ELF -# include -# if defined(ELFCLASS64) -# define U_ELF64 -# endif - /* Old elf.h headers may not have EM_X86_64, or have EM_X8664 instead. */ -# ifndef EM_X86_64 -# define EM_X86_64 62 -# endif -# define ICU_ENTRY_OFFSET 0 -#endif - -#include -#include -#include "unicode/putil.h" -#include "cmemory.h" -#include "cstring.h" -#include "filestrm.h" -#include "toolutil.h" -#include "unicode/uclean.h" -#include "uoptions.h" -#include "pkg_genc.h" -#include "filetools.h" -#include "charstr.h" -#include "unicode/errorcode.h" - -#define MAX_COLUMN ((uint32_t)(0xFFFFFFFFU)) - -#define HEX_0X 0 /* 0x1234 */ -#define HEX_0H 1 /* 01234h */ - -/* prototypes --------------------------------------------------------------- */ -static void -getOutFilename( - const char *inFilename, - const char *destdir, - char *outFilename, - int32_t outFilenameCapacity, - char *entryName, - int32_t entryNameCapacity, - const char *newSuffix, - const char *optFilename); - -static uint32_t -write8(FileStream *out, uint8_t byte, uint32_t column); - -static uint32_t -write32(FileStream *out, uint32_t byte, uint32_t column); - -#if U_PLATFORM == U_PF_OS400 -static uint32_t -write8str(FileStream *out, uint8_t byte, uint32_t column); -#endif -/* -------------------------------------------------------------------------- */ - -/* -Creating Template Files for New Platforms - -Let the cc compiler help you get started. -Compile this program - const unsigned int x[5] = {1, 2, 0xdeadbeef, 0xffffffff, 16}; -with the -S option to produce assembly output. - -For example, this will generate array.s: -gcc -S array.c - -This will produce a .s file that may look like this: - - .file "array.c" - .version "01.01" -gcc2_compiled.: - .globl x - .section .rodata - .align 4 - .type x,@object - .size x,20 -x: - .long 1 - .long 2 - .long -559038737 - .long -1 - .long 16 - .ident "GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-85)" - -which gives a starting point that will compile, and can be transformed -to become the template, generally with some consulting of as docs and -some experimentation. - -If you want ICU to automatically use this assembly, you should -specify "GENCCODE_ASSEMBLY=-a name" in the specific config/mh-* file, -where the name is the compiler or platform that you used in this -assemblyHeader data structure. -*/ -static const struct AssemblyType { - const char *name; - const char *header; - const char *beginLine; - const char *footer; - int8_t hexType; /* HEX_0X or HEX_0h */ -} assemblyHeader[] = { - /* For gcc assemblers, the meaning of .align changes depending on the */ - /* hardware, so we use .balign 16 which always means 16 bytes. */ - /* https://sourceware.org/binutils/docs/as/Pseudo-Ops.html */ - {"gcc", - ".globl %s\n" - "\t.section .note.GNU-stack,\"\",%%progbits\n" - "#ifdef __CET__\n" - "# include \n" - "#endif\n" - "\t.section .rodata\n" - "\t.balign 16\n" - "#ifdef U_HIDE_DATA_SYMBOL\n" - "\t.hidden %s\n" - "#endif\n" - "\t.type %s,%%object\n" - "%s:\n\n", - - ".long ",".size %s, .-%s\n",HEX_0X - }, - {"gcc-darwin", - /*"\t.section __TEXT,__text,regular,pure_instructions\n" - "\t.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32\n"*/ - ".globl _%s\n" - "#ifdef U_HIDE_DATA_SYMBOL\n" - "\t.private_extern _%s\n" - "#endif\n" - "\t.data\n" - "\t.const\n" - "\t.balign 16\n" - "_%s:\n\n", - - ".long ","",HEX_0X - }, - /* macOS PPC should use `.p2align 4` instead `.balign 16` because is - * unknown pseudo ops for such legacy system*/ - {"gcc-darwin-ppc", - /*"\t.section __TEXT,__text,regular,pure_instructions\n" - "\t.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32\n"*/ - ".globl _%s\n" - "#ifdef U_HIDE_DATA_SYMBOL\n" - "\t.private_extern _%s\n" - "#endif\n" - "\t.data\n" - "\t.const\n" - "\t.p2align 4\n" - "_%s:\n\n", - - ".long ","",HEX_0X - }, - {"gcc-cygwin", - ".globl _%s\n" - "\t.section .rodata\n" - "\t.balign 16\n" - "_%s:\n\n", - - ".long ","",HEX_0X - }, - {"gcc-mingw64", - ".globl %s\n" - "\t.section .rodata\n" - "\t.balign 16\n" - "%s:\n\n", - - ".long ","",HEX_0X - }, -/* 16 bytes alignment. */ -/* http://docs.oracle.com/cd/E19641-01/802-1947/802-1947.pdf */ - {"sun", - "\t.section \".rodata\"\n" - "\t.align 16\n" - ".globl %s\n" - "%s:\n", - - ".word ","",HEX_0X - }, -/* 16 bytes alignment for sun-x86. */ -/* http://docs.oracle.com/cd/E19963-01/html/821-1608/eoiyg.html */ - {"sun-x86", - "Drodata.rodata:\n" - "\t.type Drodata.rodata,@object\n" - "\t.size Drodata.rodata,0\n" - "\t.globl %s\n" - "\t.align 16\n" - "%s:\n", - - ".4byte ","",HEX_0X - }, -/* 1<<4 bit alignment for aix. */ -/* http://pic.dhe.ibm.com/infocenter/aix/v6r1/index.jsp?topic=%2Fcom.ibm.aix.aixassem%2Fdoc%2Falangref%2Fidalangref_csect_pseudoop.htm */ - {"xlc", - ".globl %s{RO}\n" - "\t.toc\n" - "%s:\n" - "\t.csect %s{RO}, 4\n", - - ".long ","",HEX_0X - }, - {"aCC-ia64", - "\t.file \"%s.s\"\n" - "\t.type %s,@object\n" - "\t.global %s\n" - "\t.secalias .abe$0.rodata, \".rodata\"\n" - "\t.section .abe$0.rodata = \"a\", \"progbits\"\n" - "\t.align 16\n" - "%s::\t", - - "data4 ","",HEX_0X - }, - {"aCC-parisc", - "\t.SPACE $TEXT$\n" - "\t.SUBSPA $LIT$\n" - "%s\n" - "\t.EXPORT %s\n" - "\t.ALIGN 16\n", - - ".WORD ","",HEX_0X - }, -/* align 16 bytes */ -/* http://msdn.microsoft.com/en-us/library/dwa9fwef.aspx */ - {"nasm", - "global %s\n" -#if defined(_WIN32) - "section .rdata align=16\n" -#else - "section .rodata align=16\n" -#endif - "%s:\n", - " dd ","",HEX_0X - }, - { "masm", - "\tTITLE %s\n" - "; generated by genccode\n" - ".386\n" - ".model flat\n" - "\tPUBLIC _%s\n" - "ICUDATA_%s\tSEGMENT READONLY PARA PUBLIC FLAT 'DATA'\n" - "\tALIGN 16\n" - "_%s\tLABEL DWORD\n", - "\tDWORD ","\nICUDATA_%s\tENDS\n\tEND\n",HEX_0H - }, - { "masm64", - "\tTITLE %s\n" - "; generated by genccode\n" - "\tPUBLIC _%s\n" - "ICUDATA_%s\tSEGMENT READONLY 'DATA'\n" - "\tALIGN 16\n" - "_%s\tLABEL DWORD\n", - "\tDWORD ","\nICUDATA_%s\tENDS\n\tEND\n",HEX_0H - } -}; - -static int32_t assemblyHeaderIndex = -1; -static int32_t hexType = HEX_0X; - -U_CAPI UBool U_EXPORT2 -checkAssemblyHeaderName(const char* optAssembly) { - int32_t idx; - assemblyHeaderIndex = -1; - for (idx = 0; idx < UPRV_LENGTHOF(assemblyHeader); idx++) { - if (uprv_strcmp(optAssembly, assemblyHeader[idx].name) == 0) { - assemblyHeaderIndex = idx; - hexType = assemblyHeader[idx].hexType; /* set the hex type */ - return true; - } - } - - return false; -} - -U_CAPI UBool U_EXPORT2 -checkCpuArchitecture(const char* optCpuArch) { - return strcmp(optCpuArch, "x64") == 0 || strcmp(optCpuArch, "x86") == 0 || strcmp(optCpuArch, "arm64") == 0; -} - - -U_CAPI void U_EXPORT2 -printAssemblyHeadersToStdErr() { - int32_t idx; - fprintf(stderr, "%s", assemblyHeader[0].name); - for (idx = 1; idx < UPRV_LENGTHOF(assemblyHeader); idx++) { - fprintf(stderr, ", %s", assemblyHeader[idx].name); - } - fprintf(stderr, - ")\n"); -} - -U_CAPI void U_EXPORT2 -writeAssemblyCode( - const char *filename, - const char *destdir, - const char *optEntryPoint, - const char *optFilename, - char *outFilePath, - size_t outFilePathCapacity) { - uint32_t column = MAX_COLUMN; - char entry[96]; - union { - uint32_t uint32s[1024]; - char chars[4096]; - } buffer; - FileStream *in, *out; - size_t i, length, count; - - in=T_FileStream_open(filename, "rb"); - if(in==nullptr) { - fprintf(stderr, "genccode: unable to open input file %s\n", filename); - exit(U_FILE_ACCESS_ERROR); - } - - const char* newSuffix = nullptr; - - if (uprv_strcmp(assemblyHeader[assemblyHeaderIndex].name, "masm") == 0) { - newSuffix = ".masm"; - } - else if (uprv_strcmp(assemblyHeader[assemblyHeaderIndex].name, "nasm") == 0) { - newSuffix = ".asm"; - } else { - newSuffix = ".S"; - } - - getOutFilename( - filename, - destdir, - buffer.chars, - sizeof(buffer.chars), - entry, - sizeof(entry), - newSuffix, - optFilename); - out=T_FileStream_open(buffer.chars, "w"); - if(out==nullptr) { - fprintf(stderr, "genccode: unable to open output file %s\n", buffer.chars); - exit(U_FILE_ACCESS_ERROR); - } - - if (outFilePath != nullptr) { - if (uprv_strlen(buffer.chars) >= outFilePathCapacity) { - fprintf(stderr, "genccode: filename too long\n"); - exit(U_ILLEGAL_ARGUMENT_ERROR); - } - uprv_strcpy(outFilePath, buffer.chars); -#if defined (WINDOWS_WITH_GNUC) && U_PLATFORM != U_PF_CYGWIN - /* Need to fix the file separator character when using MinGW. */ - swapFileSepChar(outFilePath, U_FILE_SEP_CHAR, '/'); -#endif - } - - if(optEntryPoint != nullptr) { - uprv_strcpy(entry, optEntryPoint); - uprv_strcat(entry, "_dat"); - } - - /* turn dashes or dots in the entry name into underscores */ - length=uprv_strlen(entry); - for(i=0; i= sizeof(buffer.chars)) { - fprintf(stderr, "genccode: entry name too long (long filename?)\n"); - exit(U_ILLEGAL_ARGUMENT_ERROR); - } - T_FileStream_writeLine(out, buffer.chars); - T_FileStream_writeLine(out, assemblyHeader[assemblyHeaderIndex].beginLine); - - for(;;) { - memset(buffer.uint32s, 0, sizeof(buffer.uint32s)); - length=T_FileStream_read(in, buffer.uint32s, sizeof(buffer.uint32s)); - if(length==0) { - break; - } - for(i=0; i<(length/sizeof(buffer.uint32s[0])); i++) { - // TODO: What if the last read sees length not as a multiple of 4? - column = write32(out, buffer.uint32s[i], column); - } - } - - T_FileStream_writeLine(out, "\n"); - - count = snprintf( - buffer.chars, sizeof(buffer.chars), - assemblyHeader[assemblyHeaderIndex].footer, - entry, entry, entry, entry, - entry, entry, entry, entry); - if (count >= sizeof(buffer.chars)) { - fprintf(stderr, "genccode: entry name too long (long filename?)\n"); - exit(U_ILLEGAL_ARGUMENT_ERROR); - } - T_FileStream_writeLine(out, buffer.chars); - - if(T_FileStream_error(in)) { - fprintf(stderr, "genccode: file read error while generating from file %s\n", filename); - exit(U_FILE_ACCESS_ERROR); - } - - if(T_FileStream_error(out)) { - fprintf(stderr, "genccode: file write error while generating from file %s\n", filename); - exit(U_FILE_ACCESS_ERROR); - } - - T_FileStream_close(out); - T_FileStream_close(in); -} - -U_CAPI void U_EXPORT2 -writeCCode( - const char *filename, - const char *destdir, - const char *optEntryPoint, - const char *optName, - const char *optFilename, - char *outFilePath, - size_t outFilePathCapacity) { - uint32_t column = MAX_COLUMN; - char buffer[4096], entry[96]; - FileStream *in, *out; - size_t i, length, count; - - in=T_FileStream_open(filename, "rb"); - if(in==nullptr) { - fprintf(stderr, "genccode: unable to open input file %s\n", filename); - exit(U_FILE_ACCESS_ERROR); - } - - if(optName != nullptr) { /* prepend 'icudt28_' */ - // +2 includes the _ and the NUL - if (uprv_strlen(optName) + 2 > sizeof(entry)) { - fprintf(stderr, "genccode: entry name too long (long filename?)\n"); - exit(U_ILLEGAL_ARGUMENT_ERROR); - } - strcpy(entry, optName); - strcat(entry, "_"); - } else { - entry[0] = 0; - } - - getOutFilename( - filename, - destdir, - buffer, - static_cast(sizeof(buffer)), - entry + uprv_strlen(entry), - static_cast(sizeof(entry) - uprv_strlen(entry)), - ".c", - optFilename); - - if (outFilePath != nullptr) { - if (uprv_strlen(buffer) >= outFilePathCapacity) { - fprintf(stderr, "genccode: filename too long\n"); - exit(U_ILLEGAL_ARGUMENT_ERROR); - } - uprv_strcpy(outFilePath, buffer); -#if defined (WINDOWS_WITH_GNUC) && U_PLATFORM != U_PF_CYGWIN - /* Need to fix the file separator character when using MinGW. */ - swapFileSepChar(outFilePath, U_FILE_SEP_CHAR, '/'); -#endif - } - - out=T_FileStream_open(buffer, "w"); - if(out==nullptr) { - fprintf(stderr, "genccode: unable to open output file %s\n", buffer); - exit(U_FILE_ACCESS_ERROR); - } - - if(optEntryPoint != nullptr) { - uprv_strcpy(entry, optEntryPoint); - uprv_strcat(entry, "_dat"); - } - - /* turn dashes or dots in the entry name into underscores */ - length=uprv_strlen(entry); - for(i=0; i= sizeof(buffer)) { - fprintf(stderr, "genccode: entry name too long (long filename?)\n"); - exit(U_ILLEGAL_ARGUMENT_ERROR); - } - T_FileStream_writeLine(out, buffer); - - for(;;) { - length=T_FileStream_read(in, buffer, sizeof(buffer)); - if(length==0) { - break; - } - for(i=0; i= sizeof(buffer)) { - fprintf(stderr, "genccode: entry name too long (long filename?)\n"); - exit(U_ILLEGAL_ARGUMENT_ERROR); - } - T_FileStream_writeLine(out, buffer); - - for(;;) { - length=T_FileStream_read(in, buffer, sizeof(buffer)); - if(length==0) { - break; - } - for(i=0; i= 0 ; i--) -#endif - { - uint8_t value = ptrIdx[i]; - if (value || seenNonZero) { - *(s++)=hexToStr[value>>4]; - *(s++)=hexToStr[value&0xF]; - seenNonZero = 1; - } - } - if(hexType==HEX_0H) { - *(s++)='h'; - } - } - - *(s++)=0; - T_FileStream_writeLine(out, bitFieldStr); - return column; -} - -static uint32_t -write8(FileStream *out, uint8_t byte, uint32_t column) { - char s[4]; - int i=0; - - /* convert the byte value to a string */ - if(byte>=100) { - s[i++]=(char)('0'+byte/100); - byte%=100; - } - if(i>0 || byte>=10) { - s[i++]=(char)('0'+byte/10); - byte%=10; - } - s[i++]=(char)('0'+byte); - s[i]=0; - - /* write the value, possibly with comma and newline */ - if(column==MAX_COLUMN) { - /* first byte */ - column=1; - } else if(column<16) { - T_FileStream_writeLine(out, ","); - ++column; - } else { - T_FileStream_writeLine(out, ",\n"); - column=1; - } - T_FileStream_writeLine(out, s); - return column; -} - -#if U_PLATFORM == U_PF_OS400 -static uint32_t -write8str(FileStream *out, uint8_t byte, uint32_t column) { - char s[8]; - - if (byte > 7) - snprintf(s, sizeof(s), "\\x%X", byte); - else - snprintf(s, sizeof(s), "\\%X", byte); - - /* write the value, possibly with comma and newline */ - if(column==MAX_COLUMN) { - /* first byte */ - column=1; - T_FileStream_writeLine(out, "\""); - } else if(column<24) { - ++column; - } else { - T_FileStream_writeLine(out, "\"\n\""); - column=1; - } - T_FileStream_writeLine(out, s); - return column; -} -#endif - -static void -getOutFilename( - const char *inFilename, - const char *destdir, - char *outFilename, - int32_t outFilenameCapacity, - char *entryName, - int32_t entryNameCapacity, - const char *newSuffix, - const char *optFilename) { - const char *basename=findBasename(inFilename), *suffix=uprv_strrchr(basename, '.'); - - icu::CharString outFilenameBuilder; - icu::CharString entryNameBuilder; - icu::ErrorCode status; - - /* copy path */ - if(destdir!=nullptr && *destdir!=0) { - outFilenameBuilder.append(destdir, status); - outFilenameBuilder.ensureEndsWithFileSeparator(status); - } else { - outFilenameBuilder.append(inFilename, static_cast(basename - inFilename), status); - } - inFilename=basename; - - if(suffix==nullptr) { - /* the filename does not have a suffix */ - entryNameBuilder.append(inFilename, status); - if(optFilename != nullptr) { - outFilenameBuilder.append(optFilename, status); - } else { - outFilenameBuilder.append(inFilename, status); - } - outFilenameBuilder.append(newSuffix, status); - } else { - int32_t saveOutFilenameLength = outFilenameBuilder.length(); - /* copy basename */ - while(inFilename= outFilenameCapacity) { - fprintf(stderr, "genccode: output filename too long\n"); - exit(U_ILLEGAL_ARGUMENT_ERROR); - } - - if (entryNameBuilder.length() >= entryNameCapacity) { - fprintf(stderr, "genccode: entry name too long (long filename?)\n"); - exit(U_ILLEGAL_ARGUMENT_ERROR); - } - - outFilenameBuilder.extract(outFilename, outFilenameCapacity, status); - entryNameBuilder.extract(entryName, entryNameCapacity, status); -} - -#ifdef CAN_GENERATE_OBJECTS -static void -getArchitecture( - uint16_t *pCPU, - uint16_t *pBits, - UBool *pIsBigEndian, - const char *optMatchArch, - [[maybe_unused]] const char *optCpuArch) { - union { - char bytes[2048]; -#ifdef U_ELF - Elf32_Ehdr header32; - /* Elf32_Ehdr and ELF64_Ehdr are identical for the necessary fields. */ -#elif U_PLATFORM_HAS_WIN32_API - IMAGE_FILE_HEADER header; -#endif - } buffer; - - const char *filename; - FileStream *in; - int32_t length; - -#ifdef U_ELF - -#elif U_PLATFORM_HAS_WIN32_API - const IMAGE_FILE_HEADER *pHeader; -#else -# error "Unknown platform for CAN_GENERATE_OBJECTS." -#endif - - if(optMatchArch != nullptr) { - filename=optMatchArch; - } else { - /* set defaults */ -#ifdef U_ELF - /* set EM_386 because elf.h does not provide better defaults */ - *pCPU=EM_386; - *pBits=32; - *pIsBigEndian=(UBool)(U_IS_BIG_ENDIAN ? ELFDATA2MSB : ELFDATA2LSB); -#elif U_PLATFORM_HAS_WIN32_API - // Windows always runs in little-endian mode. - *pIsBigEndian = false; - - // Note: The various _M_ macros are predefined by the MSVC compiler based - // on the target compilation architecture. - // https://docs.microsoft.com/cpp/preprocessor/predefined-macros - - // link.exe will link an IMAGE_FILE_MACHINE_UNKNOWN data-only .obj file - // no matter what architecture it is targeting (though other values are - // required to match). Unfortunately, the variable name decoration/mangling - // is slightly different on x86, which means we can't use the UNKNOWN type - // for all architectures though. -# if defined(_M_IX86) - *pCPU = IMAGE_FILE_MACHINE_I386; -# else - // Linker for ClangCL doesn't handle IMAGE_FILE_MACHINE_UNKNOWN the same as - // linker for MSVC. Because of this optCpuArch is used to define the CPU - // architecture in that case. While _M_AMD64 and _M_ARM64 could be used, - // this would potentially be problematic when cross-compiling as this code - // would most likely be ran on host machine to generate the .obj file for - // the target architecture. -# if defined(__clang__) - if (strcmp(optCpuArch, "x64") == 0) { - *pCPU = IMAGE_FILE_MACHINE_AMD64; - } else if (strcmp(optCpuArch, "x86") == 0) { - *pCPU = IMAGE_FILE_MACHINE_I386; - } else if (strcmp(optCpuArch, "arm64") == 0) { - *pCPU = IMAGE_FILE_MACHINE_ARM64; - } else { - std::terminate(); // Unreachable. - } -# else - *pCPU = IMAGE_FILE_MACHINE_UNKNOWN; -# endif -# endif -# if defined(_M_IA64) || defined(_M_AMD64) || defined (_M_ARM64) - *pBits = 64; // Doesn't seem to be used for anything interesting though? -# elif defined(_M_IX86) || defined(_M_ARM) - *pBits = 32; -# else -# error "Unknown platform for CAN_GENERATE_OBJECTS." -# endif -#else -# error "Unknown platform for CAN_GENERATE_OBJECTS." -#endif - return; - } - - in=T_FileStream_open(filename, "rb"); - if(in==nullptr) { - fprintf(stderr, "genccode: unable to open match-arch file %s\n", filename); - exit(U_FILE_ACCESS_ERROR); - } - length=T_FileStream_read(in, buffer.bytes, sizeof(buffer.bytes)); - -#ifdef U_ELF - if(length<(int32_t)sizeof(Elf32_Ehdr)) { - fprintf(stderr, "genccode: match-arch file %s is too short\n", filename); - exit(U_UNSUPPORTED_ERROR); - } - if( - buffer.header32.e_ident[0]!=ELFMAG0 || - buffer.header32.e_ident[1]!=ELFMAG1 || - buffer.header32.e_ident[2]!=ELFMAG2 || - buffer.header32.e_ident[3]!=ELFMAG3 || - buffer.header32.e_ident[EI_CLASS]ELFCLASS64 - ) { - fprintf(stderr, "genccode: match-arch file %s is not an ELF object file, or not supported\n", filename); - exit(U_UNSUPPORTED_ERROR); - } - - *pBits= buffer.header32.e_ident[EI_CLASS]==ELFCLASS32 ? 32 : 64; /* only 32 or 64: see check above */ -#ifdef U_ELF64 - if(*pBits!=32 && *pBits!=64) { - fprintf(stderr, "genccode: currently only supports 32-bit and 64-bit ELF format\n"); - exit(U_UNSUPPORTED_ERROR); - } -#else - if(*pBits!=32) { - fprintf(stderr, "genccode: built with elf.h missing 64-bit definitions\n"); - exit(U_UNSUPPORTED_ERROR); - } -#endif - - *pIsBigEndian=(UBool)(buffer.header32.e_ident[EI_DATA]==ELFDATA2MSB); - if(*pIsBigEndian!=U_IS_BIG_ENDIAN) { - fprintf(stderr, "genccode: currently only same-endianness ELF formats are supported\n"); - exit(U_UNSUPPORTED_ERROR); - } - /* TODO: Support byte swapping */ - - *pCPU=buffer.header32.e_machine; -#elif U_PLATFORM_HAS_WIN32_API - if(lengthMachine; - /* - * The number of bits is implicit with the Machine value. - * *pBits is ignored in the calling code, so this need not be precise. - */ - *pBits= *pCPU==IMAGE_FILE_MACHINE_I386 ? 32 : 64; - /* Windows always runs on little-endian CPUs. */ - *pIsBigEndian=false; -#else -# error "Unknown platform for CAN_GENERATE_OBJECTS." -#endif - - T_FileStream_close(in); -} - -U_CAPI void U_EXPORT2 -writeObjectCode( - const char *filename, - const char *destdir, - const char *optEntryPoint, - const char *optMatchArch, - const char *optCpuArch, - const char *optFilename, - char *outFilePath, - size_t outFilePathCapacity, - UBool optWinDllExport) { - /* common variables */ - char buffer[4096], entry[96]={ 0 }; - FileStream *in, *out; - const char *newSuffix; - int32_t i, entryLength, length, size, entryOffset=0, entryLengthOffset=0; - - uint16_t cpu, bits; - UBool makeBigEndian; - - (void)optWinDllExport; /* unused except Windows */ - - /* platform-specific variables and initialization code */ -#ifdef U_ELF - /* 32-bit Elf file header */ - static Elf32_Ehdr header32={ - { - /* e_ident[] */ - ELFMAG0, ELFMAG1, ELFMAG2, ELFMAG3, - ELFCLASS32, - U_IS_BIG_ENDIAN ? ELFDATA2MSB : ELFDATA2LSB, - EV_CURRENT /* EI_VERSION */ - }, - ET_REL, - EM_386, - EV_CURRENT, /* e_version */ - 0, /* e_entry */ - 0, /* e_phoff */ - (Elf32_Off)sizeof(Elf32_Ehdr), /* e_shoff */ - 0, /* e_flags */ - (Elf32_Half)sizeof(Elf32_Ehdr), /* eh_size */ - 0, /* e_phentsize */ - 0, /* e_phnum */ - (Elf32_Half)sizeof(Elf32_Shdr), /* e_shentsize */ - 5, /* e_shnum */ - 2 /* e_shstrndx */ - }; - - /* 32-bit Elf section header table */ - static Elf32_Shdr sectionHeaders32[5]={ - { /* SHN_UNDEF */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { /* .symtab */ - 1, /* sh_name */ - SHT_SYMTAB, - 0, /* sh_flags */ - 0, /* sh_addr */ - (Elf32_Off)(sizeof(header32)+sizeof(sectionHeaders32)), /* sh_offset */ - (Elf32_Word)(2*sizeof(Elf32_Sym)), /* sh_size */ - 3, /* sh_link=sect hdr index of .strtab */ - 1, /* sh_info=One greater than the symbol table index of the last - * local symbol (with STB_LOCAL). */ - 4, /* sh_addralign */ - (Elf32_Word)(sizeof(Elf32_Sym)) /* sh_entsize */ - }, - { /* .shstrtab */ - 9, /* sh_name */ - SHT_STRTAB, - 0, /* sh_flags */ - 0, /* sh_addr */ - (Elf32_Off)(sizeof(header32)+sizeof(sectionHeaders32)+2*sizeof(Elf32_Sym)), /* sh_offset */ - 40, /* sh_size */ - 0, /* sh_link */ - 0, /* sh_info */ - 1, /* sh_addralign */ - 0 /* sh_entsize */ - }, - { /* .strtab */ - 19, /* sh_name */ - SHT_STRTAB, - 0, /* sh_flags */ - 0, /* sh_addr */ - (Elf32_Off)(sizeof(header32)+sizeof(sectionHeaders32)+2*sizeof(Elf32_Sym)+40), /* sh_offset */ - (Elf32_Word)sizeof(entry), /* sh_size */ - 0, /* sh_link */ - 0, /* sh_info */ - 1, /* sh_addralign */ - 0 /* sh_entsize */ - }, - { /* .rodata */ - 27, /* sh_name */ - SHT_PROGBITS, - SHF_ALLOC, /* sh_flags */ - 0, /* sh_addr */ - (Elf32_Off)(sizeof(header32)+sizeof(sectionHeaders32)+2*sizeof(Elf32_Sym)+40+sizeof(entry)), /* sh_offset */ - 0, /* sh_size */ - 0, /* sh_link */ - 0, /* sh_info */ - 16, /* sh_addralign */ - 0 /* sh_entsize */ - } - }; - - /* symbol table */ - static Elf32_Sym symbols32[2]={ - { /* STN_UNDEF */ - 0, 0, 0, 0, 0, 0 - }, - { /* data entry point */ - 1, /* st_name */ - 0, /* st_value */ - 0, /* st_size */ - ELF64_ST_INFO(STB_GLOBAL, STT_OBJECT), - 0, /* st_other */ - 4 /* st_shndx=index of related section table entry */ - } - }; - - /* section header string table, with decimal string offsets */ - static const char sectionStrings[40]= - /* 0 */ "\0" - /* 1 */ ".symtab\0" - /* 9 */ ".shstrtab\0" - /* 19 */ ".strtab\0" - /* 27 */ ".rodata\0" - /* 35 */ "\0\0\0\0"; /* contains terminating NUL */ - /* 40: padded to multiple of 8 bytes */ - - /* - * Use entry[] for the string table which will contain only the - * entry point name. - * entry[0] must be 0 (NUL) - * The entry point name can be up to 38 characters long (sizeof(entry)-2). - */ - - /* 16-align .rodata in the .o file, just in case */ - static const char padding[16]={ 0 }; - int32_t paddingSize; - -#ifdef U_ELF64 - /* 64-bit Elf file header */ - static Elf64_Ehdr header64={ - { - /* e_ident[] */ - ELFMAG0, ELFMAG1, ELFMAG2, ELFMAG3, - ELFCLASS64, - U_IS_BIG_ENDIAN ? ELFDATA2MSB : ELFDATA2LSB, - EV_CURRENT /* EI_VERSION */ - }, - ET_REL, - EM_X86_64, - EV_CURRENT, /* e_version */ - 0, /* e_entry */ - 0, /* e_phoff */ - (Elf64_Off)sizeof(Elf64_Ehdr), /* e_shoff */ - 0, /* e_flags */ - (Elf64_Half)sizeof(Elf64_Ehdr), /* eh_size */ - 0, /* e_phentsize */ - 0, /* e_phnum */ - (Elf64_Half)sizeof(Elf64_Shdr), /* e_shentsize */ - 5, /* e_shnum */ - 2 /* e_shstrndx */ - }; - - /* 64-bit Elf section header table */ - static Elf64_Shdr sectionHeaders64[5]={ - { /* SHN_UNDEF */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { /* .symtab */ - 1, /* sh_name */ - SHT_SYMTAB, - 0, /* sh_flags */ - 0, /* sh_addr */ - (Elf64_Off)(sizeof(header64)+sizeof(sectionHeaders64)), /* sh_offset */ - (Elf64_Xword)(2*sizeof(Elf64_Sym)), /* sh_size */ - 3, /* sh_link=sect hdr index of .strtab */ - 1, /* sh_info=One greater than the symbol table index of the last - * local symbol (with STB_LOCAL). */ - 4, /* sh_addralign */ - (Elf64_Xword)(sizeof(Elf64_Sym)) /* sh_entsize */ - }, - { /* .shstrtab */ - 9, /* sh_name */ - SHT_STRTAB, - 0, /* sh_flags */ - 0, /* sh_addr */ - (Elf64_Off)(sizeof(header64)+sizeof(sectionHeaders64)+2*sizeof(Elf64_Sym)), /* sh_offset */ - 40, /* sh_size */ - 0, /* sh_link */ - 0, /* sh_info */ - 1, /* sh_addralign */ - 0 /* sh_entsize */ - }, - { /* .strtab */ - 19, /* sh_name */ - SHT_STRTAB, - 0, /* sh_flags */ - 0, /* sh_addr */ - (Elf64_Off)(sizeof(header64)+sizeof(sectionHeaders64)+2*sizeof(Elf64_Sym)+40), /* sh_offset */ - (Elf64_Xword)sizeof(entry), /* sh_size */ - 0, /* sh_link */ - 0, /* sh_info */ - 1, /* sh_addralign */ - 0 /* sh_entsize */ - }, - { /* .rodata */ - 27, /* sh_name */ - SHT_PROGBITS, - SHF_ALLOC, /* sh_flags */ - 0, /* sh_addr */ - (Elf64_Off)(sizeof(header64)+sizeof(sectionHeaders64)+2*sizeof(Elf64_Sym)+40+sizeof(entry)), /* sh_offset */ - 0, /* sh_size */ - 0, /* sh_link */ - 0, /* sh_info */ - 16, /* sh_addralign */ - 0 /* sh_entsize */ - } - }; - - /* - * 64-bit symbol table - * careful: different order of items compared with Elf32_sym! - */ - static Elf64_Sym symbols64[2]={ - { /* STN_UNDEF */ - 0, 0, 0, 0, 0, 0 - }, - { /* data entry point */ - 1, /* st_name */ - ELF64_ST_INFO(STB_GLOBAL, STT_OBJECT), - 0, /* st_other */ - 4, /* st_shndx=index of related section table entry */ - 0, /* st_value */ - 0 /* st_size */ - } - }; - -#endif /* U_ELF64 */ - - /* entry[] have a leading NUL */ - entryOffset=1; - - /* in the common code, count entryLength from after the NUL */ - entryLengthOffset=1; - - newSuffix=".o"; - -#elif U_PLATFORM_HAS_WIN32_API - struct { - IMAGE_FILE_HEADER fileHeader; - IMAGE_SECTION_HEADER sections[2]; - char linkerOptions[100]; - } objHeader; - IMAGE_SYMBOL symbols[1]; - struct { - DWORD sizeofLongNames; - char longNames[100]; - } symbolNames; - - /* - * entry sometimes have a leading '_' - * overwritten if entryOffset==0 depending on the target platform - * see check for cpu below - */ - entry[0]='_'; - - newSuffix=".obj"; -#else -# error "Unknown platform for CAN_GENERATE_OBJECTS." -#endif - - /* deal with options, files and the entry point name */ - getArchitecture(&cpu, &bits, &makeBigEndian, optMatchArch, optCpuArch); - if (optMatchArch) - { - printf("genccode: --match-arch cpu=%hu bits=%hu big-endian=%d\n", cpu, bits, makeBigEndian); - } - else - { - printf("genccode: using architecture cpu=%hu bits=%hu big-endian=%d\n", cpu, bits, makeBigEndian); - } -#if U_PLATFORM_HAS_WIN32_API - if(cpu==IMAGE_FILE_MACHINE_I386) { - entryOffset=1; - } -#endif - - in=T_FileStream_open(filename, "rb"); - if(in==nullptr) { - fprintf(stderr, "genccode: unable to open input file %s\n", filename); - exit(U_FILE_ACCESS_ERROR); - } - size=T_FileStream_size(in); - - getOutFilename( - filename, - destdir, - buffer, - sizeof(buffer), - entry + entryOffset, - sizeof(entry) - entryOffset, - newSuffix, - optFilename); - - if (outFilePath != nullptr) { - if (uprv_strlen(buffer) >= outFilePathCapacity) { - fprintf(stderr, "genccode: filename too long\n"); - exit(U_ILLEGAL_ARGUMENT_ERROR); - } - uprv_strcpy(outFilePath, buffer); - } - - if(optEntryPoint != nullptr) { - uprv_strcpy(entry+entryOffset, optEntryPoint); - uprv_strcat(entry+entryOffset, "_dat"); - } - /* turn dashes in the entry name into underscores */ - entryLength=(int32_t)uprv_strlen(entry+entryLengthOffset); - for(i=0; i - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_FORMATTING -#include "unicode/ustring.h" -#include "unicode/localpointer.h" -#include "unicode/dtfmtsym.h" -#include "unicode/errorcode.h" -#include "unicode/smpdtfmt.h" -#include "unicode/msgfmt.h" -#include "unicode/numsys.h" -#include "unicode/tznames.h" -#include "cpputils.h" -#include "umutex.h" -#include "cmemory.h" -#include "cstring.h" -#include "charstr.h" -#include "erarules.h" -#include "dt_impl.h" -#include "locbased.h" -#include "gregoimp.h" -#include "hash.h" -#include "uassert.h" -#include "uresimp.h" -#include "ureslocs.h" -#include "uvector.h" -#include "shareddateformatsymbols.h" -#include "unicode/calendar.h" -#include "unifiedcache.h" - -// ***************************************************************************** -// class DateFormatSymbols -// ***************************************************************************** - -/** - * These are static arrays we use only in the case where we have no - * resource data. - */ - -#if UDAT_HAS_PATTERN_CHAR_FOR_TIME_SEPARATOR -#define PATTERN_CHARS_LEN 38 -#else -#define PATTERN_CHARS_LEN 37 -#endif - -/** - * Unlocalized date-time pattern characters. For example: 'y', 'd', etc. All - * locales use the same these unlocalized pattern characters. - */ -static const char16_t gPatternChars[] = { - // if UDAT_HAS_PATTERN_CHAR_FOR_TIME_SEPARATOR: - // GyMdkHmsSEDFwWahKzYeugAZvcLQqVUOXxrbB: - // else: - // GyMdkHmsSEDFwWahKzYeugAZvcLQqVUOXxrbB - - 0x47, 0x79, 0x4D, 0x64, 0x6B, 0x48, 0x6D, 0x73, 0x53, 0x45, - 0x44, 0x46, 0x77, 0x57, 0x61, 0x68, 0x4B, 0x7A, 0x59, 0x65, - 0x75, 0x67, 0x41, 0x5A, 0x76, 0x63, 0x4c, 0x51, 0x71, 0x56, - 0x55, 0x4F, 0x58, 0x78, 0x72, 0x62, 0x42, -#if UDAT_HAS_PATTERN_CHAR_FOR_TIME_SEPARATOR - 0x3a, -#endif - 0 -}; - -/** - * Map of each ASCII character to its corresponding index in the table above if - * it is a pattern character and -1 otherwise. - */ -static const int8_t gLookupPatternChars[] = { - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - // - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - // ! " # $ % & ' ( ) * + , - . / - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -#if UDAT_HAS_PATTERN_CHAR_FOR_TIME_SEPARATOR - // 0 1 2 3 4 5 6 7 8 9 : ; < = > ? - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 37, -1, -1, -1, -1, -1, -#else - // 0 1 2 3 4 5 6 7 8 9 : ; < = > ? - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -#endif - // @ A B C D E F G H I J K L M N O - -1, 22, 36, -1, 10, 9, 11, 0, 5, -1, -1, 16, 26, 2, -1, 31, - // P Q R S T U V W X Y Z [ \ ] ^ _ - -1, 27, -1, 8, -1, 30, 29, 13, 32, 18, 23, -1, -1, -1, -1, -1, - // ` a b c d e f g h i j k l m n o - -1, 14, 35, 25, 3, 19, -1, 21, 15, -1, -1, 4, -1, 6, -1, -1, - // p q r s t u v w x y z { | } ~ - -1, 28, 34, 7, -1, 20, 24, 12, 33, 1, 17, -1, -1, -1, -1, -1 -}; - -//------------------------------------------------------ -// Strings of last resort. These are only used if we have no resource -// files. They aren't designed for actual use, just for backup. - -// These are the month names and abbreviations of last resort. -static const char16_t gLastResortMonthNames[13][3] = -{ - {0x0030, 0x0031, 0x0000}, /* "01" */ - {0x0030, 0x0032, 0x0000}, /* "02" */ - {0x0030, 0x0033, 0x0000}, /* "03" */ - {0x0030, 0x0034, 0x0000}, /* "04" */ - {0x0030, 0x0035, 0x0000}, /* "05" */ - {0x0030, 0x0036, 0x0000}, /* "06" */ - {0x0030, 0x0037, 0x0000}, /* "07" */ - {0x0030, 0x0038, 0x0000}, /* "08" */ - {0x0030, 0x0039, 0x0000}, /* "09" */ - {0x0031, 0x0030, 0x0000}, /* "10" */ - {0x0031, 0x0031, 0x0000}, /* "11" */ - {0x0031, 0x0032, 0x0000}, /* "12" */ - {0x0031, 0x0033, 0x0000} /* "13" */ -}; - -// These are the weekday names and abbreviations of last resort. -static const char16_t gLastResortDayNames[8][2] = -{ - {0x0030, 0x0000}, /* "0" */ - {0x0031, 0x0000}, /* "1" */ - {0x0032, 0x0000}, /* "2" */ - {0x0033, 0x0000}, /* "3" */ - {0x0034, 0x0000}, /* "4" */ - {0x0035, 0x0000}, /* "5" */ - {0x0036, 0x0000}, /* "6" */ - {0x0037, 0x0000} /* "7" */ -}; - -// These are the quarter names and abbreviations of last resort. -static const char16_t gLastResortQuarters[4][2] = -{ - {0x0031, 0x0000}, /* "1" */ - {0x0032, 0x0000}, /* "2" */ - {0x0033, 0x0000}, /* "3" */ - {0x0034, 0x0000}, /* "4" */ -}; - -// These are the am/pm and BC/AD markers of last resort. -static const char16_t gLastResortAmPmMarkers[2][3] = -{ - {0x0041, 0x004D, 0x0000}, /* "AM" */ - {0x0050, 0x004D, 0x0000} /* "PM" */ -}; - -static const char16_t gLastResortEras[2][3] = -{ - {0x0042, 0x0043, 0x0000}, /* "BC" */ - {0x0041, 0x0044, 0x0000} /* "AD" */ -}; - -/* Sizes for the last resort string arrays */ -typedef enum LastResortSize { - kMonthNum = 13, - kMonthLen = 3, - - kDayNum = 8, - kDayLen = 2, - - kAmPmNum = 2, - kAmPmLen = 3, - - kQuarterNum = 4, - kQuarterLen = 2, - - kEraNum = 2, - kEraLen = 3, - - kZoneNum = 5, - kZoneLen = 4, - - kGmtHourNum = 4, - kGmtHourLen = 10 -} LastResortSize; - -U_NAMESPACE_BEGIN - -SharedDateFormatSymbols::~SharedDateFormatSymbols() { -} - -template<> U_I18N_API -const SharedDateFormatSymbols * - LocaleCacheKey::createObject( - const void * /*unusedContext*/, UErrorCode &status) const { - char type[256]; - Calendar::getCalendarTypeFromLocale(fLoc, type, UPRV_LENGTHOF(type), status); - if (U_FAILURE(status)) { - return nullptr; - } - SharedDateFormatSymbols *shared - = new SharedDateFormatSymbols(fLoc, type, status); - if (shared == nullptr) { - status = U_MEMORY_ALLOCATION_ERROR; - return nullptr; - } - if (U_FAILURE(status)) { - delete shared; - return nullptr; - } - shared->addRef(); - return shared; -} - -UOBJECT_DEFINE_RTTI_IMPLEMENTATION(DateFormatSymbols) - -#define kSUPPLEMENTAL "supplementalData" - -/** - * These are the tags we expect to see in normal resource bundle files associated - * with a locale and calendar - */ -static const char gCalendarTag[]="calendar"; -static const char gGregorianTag[]="gregorian"; -static const char gErasTag[]="eras"; -static const char gCyclicNameSetsTag[]="cyclicNameSets"; -static const char gNameSetYearsTag[]="years"; -static const char gNameSetZodiacsTag[]="zodiacs"; -static const char gMonthNamesTag[]="monthNames"; -static const char gMonthPatternsTag[]="monthPatterns"; -static const char gDayNamesTag[]="dayNames"; -static const char gNamesWideTag[]="wide"; -static const char gNamesAbbrTag[]="abbreviated"; -static const char gNamesShortTag[]="short"; -static const char gNamesNarrowTag[]="narrow"; -static const char gNamesAllTag[]="all"; -static const char gNamesFormatTag[]="format"; -static const char gNamesStandaloneTag[]="stand-alone"; -static const char gNamesNumericTag[]="numeric"; -static const char gAmPmMarkersTag[]="AmPmMarkers"; -static const char gAmPmMarkersAbbrTag[]="AmPmMarkersAbbr"; -static const char gAmPmMarkersNarrowTag[]="AmPmMarkersNarrow"; -static const char gQuartersTag[]="quarters"; -static const char gNumberElementsTag[]="NumberElements"; -static const char gSymbolsTag[]="symbols"; -static const char gTimeSeparatorTag[]="timeSeparator"; -static const char gDayPeriodTag[]="dayPeriod"; - -// static const char gZoneStringsTag[]="zoneStrings"; - -// static const char gLocalPatternCharsTag[]="localPatternChars"; - -static const char gContextTransformsTag[]="contextTransforms"; - -/** - * Jitterbug 2974: MSVC has a bug whereby new X[0] behaves badly. - * Work around this. - */ -static inline UnicodeString* newUnicodeStringArray(size_t count) { - return new UnicodeString[count ? count : 1]; -} - -//------------------------------------------------------ - -DateFormatSymbols * U_EXPORT2 -DateFormatSymbols::createForLocale( - const Locale& locale, UErrorCode &status) { - const SharedDateFormatSymbols *shared = nullptr; - UnifiedCache::getByLocale(locale, shared, status); - if (U_FAILURE(status)) { - return nullptr; - } - DateFormatSymbols *result = new DateFormatSymbols(shared->get()); - shared->removeRef(); - if (result == nullptr) { - status = U_MEMORY_ALLOCATION_ERROR; - return nullptr; - } - return result; -} - -DateFormatSymbols::DateFormatSymbols(const Locale& locale, - UErrorCode& status) - : UObject() -{ - initializeData(locale, nullptr, status); -} - -DateFormatSymbols::DateFormatSymbols(UErrorCode& status) - : UObject() -{ - initializeData(Locale::getDefault(), nullptr, status, true); -} - - -DateFormatSymbols::DateFormatSymbols(const Locale& locale, - const char *type, - UErrorCode& status) - : UObject() -{ - initializeData(locale, type, status); -} - -DateFormatSymbols::DateFormatSymbols(const char *type, UErrorCode& status) - : UObject() -{ - initializeData(Locale::getDefault(), type, status, true); -} - -DateFormatSymbols::DateFormatSymbols(const DateFormatSymbols& other) - : UObject(other) -{ - copyData(other); -} - -void -DateFormatSymbols::assignArray(UnicodeString*& dstArray, - int32_t& dstCount, - const UnicodeString* srcArray, - int32_t srcCount) -{ - // assignArray() is only called by copyData() and initializeData(), which in turn - // implements the copy constructor and the assignment operator. - // All strings in a DateFormatSymbols object are created in one of the following - // three ways that all allow to safely use UnicodeString::fastCopyFrom(): - // - readonly-aliases from resource bundles - // - readonly-aliases or allocated strings from constants - // - safely cloned strings (with owned buffers) from setXYZ() functions - // - // Note that this is true for as long as DateFormatSymbols can be constructed - // only from a locale bundle or set via the cloning API, - // *and* for as long as all the strings are in *private* fields, preventing - // a subclass from creating these strings in an "unsafe" way (with respect to fastCopyFrom()). - if(srcArray == nullptr) { - // Do not attempt to copy bogus input (which will crash). - // Note that this assignArray method already had the potential to return a null dstArray; - // see handling below for "if(dstArray != nullptr)". - dstCount = 0; - dstArray = nullptr; - return; - } - dstCount = srcCount; - dstArray = newUnicodeStringArray(srcCount); - if(dstArray != nullptr) { - int32_t i; - for(i=0; i(uprv_malloc(fZoneStringsRowCount * sizeof(UnicodeString*))); - if (fZoneStrings != nullptr) { - for (row=0; row= 0; i--) { - delete[] fZoneStrings[i]; - } - uprv_free(fZoneStrings); - fZoneStrings = nullptr; - } -} - -/** - * Copy all of the other's data to this. - */ -void -DateFormatSymbols::copyData(const DateFormatSymbols& other) { - validLocale = other.validLocale; - actualLocale = other.actualLocale; - assignArray(fEras, fErasCount, other.fEras, other.fErasCount); - assignArray(fEraNames, fEraNamesCount, other.fEraNames, other.fEraNamesCount); - assignArray(fNarrowEras, fNarrowErasCount, other.fNarrowEras, other.fNarrowErasCount); - assignArray(fMonths, fMonthsCount, other.fMonths, other.fMonthsCount); - assignArray(fShortMonths, fShortMonthsCount, other.fShortMonths, other.fShortMonthsCount); - assignArray(fNarrowMonths, fNarrowMonthsCount, other.fNarrowMonths, other.fNarrowMonthsCount); - assignArray(fStandaloneMonths, fStandaloneMonthsCount, other.fStandaloneMonths, other.fStandaloneMonthsCount); - assignArray(fStandaloneShortMonths, fStandaloneShortMonthsCount, other.fStandaloneShortMonths, other.fStandaloneShortMonthsCount); - assignArray(fStandaloneNarrowMonths, fStandaloneNarrowMonthsCount, other.fStandaloneNarrowMonths, other.fStandaloneNarrowMonthsCount); - assignArray(fWeekdays, fWeekdaysCount, other.fWeekdays, other.fWeekdaysCount); - assignArray(fShortWeekdays, fShortWeekdaysCount, other.fShortWeekdays, other.fShortWeekdaysCount); - assignArray(fShorterWeekdays, fShorterWeekdaysCount, other.fShorterWeekdays, other.fShorterWeekdaysCount); - assignArray(fNarrowWeekdays, fNarrowWeekdaysCount, other.fNarrowWeekdays, other.fNarrowWeekdaysCount); - assignArray(fStandaloneWeekdays, fStandaloneWeekdaysCount, other.fStandaloneWeekdays, other.fStandaloneWeekdaysCount); - assignArray(fStandaloneShortWeekdays, fStandaloneShortWeekdaysCount, other.fStandaloneShortWeekdays, other.fStandaloneShortWeekdaysCount); - assignArray(fStandaloneShorterWeekdays, fStandaloneShorterWeekdaysCount, other.fStandaloneShorterWeekdays, other.fStandaloneShorterWeekdaysCount); - assignArray(fStandaloneNarrowWeekdays, fStandaloneNarrowWeekdaysCount, other.fStandaloneNarrowWeekdays, other.fStandaloneNarrowWeekdaysCount); - assignArray(fAmPms, fAmPmsCount, other.fAmPms, other.fAmPmsCount); - assignArray(fWideAmPms, fWideAmPmsCount, other.fWideAmPms, other.fWideAmPmsCount ); - assignArray(fNarrowAmPms, fNarrowAmPmsCount, other.fNarrowAmPms, other.fNarrowAmPmsCount ); - fTimeSeparator.fastCopyFrom(other.fTimeSeparator); // fastCopyFrom() - see assignArray comments - assignArray(fQuarters, fQuartersCount, other.fQuarters, other.fQuartersCount); - assignArray(fShortQuarters, fShortQuartersCount, other.fShortQuarters, other.fShortQuartersCount); - assignArray(fNarrowQuarters, fNarrowQuartersCount, other.fNarrowQuarters, other.fNarrowQuartersCount); - assignArray(fStandaloneQuarters, fStandaloneQuartersCount, other.fStandaloneQuarters, other.fStandaloneQuartersCount); - assignArray(fStandaloneShortQuarters, fStandaloneShortQuartersCount, other.fStandaloneShortQuarters, other.fStandaloneShortQuartersCount); - assignArray(fStandaloneNarrowQuarters, fStandaloneNarrowQuartersCount, other.fStandaloneNarrowQuarters, other.fStandaloneNarrowQuartersCount); - assignArray(fWideDayPeriods, fWideDayPeriodsCount, - other.fWideDayPeriods, other.fWideDayPeriodsCount); - assignArray(fNarrowDayPeriods, fNarrowDayPeriodsCount, - other.fNarrowDayPeriods, other.fNarrowDayPeriodsCount); - assignArray(fAbbreviatedDayPeriods, fAbbreviatedDayPeriodsCount, - other.fAbbreviatedDayPeriods, other.fAbbreviatedDayPeriodsCount); - assignArray(fStandaloneWideDayPeriods, fStandaloneWideDayPeriodsCount, - other.fStandaloneWideDayPeriods, other.fStandaloneWideDayPeriodsCount); - assignArray(fStandaloneNarrowDayPeriods, fStandaloneNarrowDayPeriodsCount, - other.fStandaloneNarrowDayPeriods, other.fStandaloneNarrowDayPeriodsCount); - assignArray(fStandaloneAbbreviatedDayPeriods, fStandaloneAbbreviatedDayPeriodsCount, - other.fStandaloneAbbreviatedDayPeriods, other.fStandaloneAbbreviatedDayPeriodsCount); - if (other.fLeapMonthPatterns != nullptr) { - assignArray(fLeapMonthPatterns, fLeapMonthPatternsCount, other.fLeapMonthPatterns, other.fLeapMonthPatternsCount); - } else { - fLeapMonthPatterns = nullptr; - fLeapMonthPatternsCount = 0; - } - if (other.fShortYearNames != nullptr) { - assignArray(fShortYearNames, fShortYearNamesCount, other.fShortYearNames, other.fShortYearNamesCount); - } else { - fShortYearNames = nullptr; - fShortYearNamesCount = 0; - } - if (other.fShortZodiacNames != nullptr) { - assignArray(fShortZodiacNames, fShortZodiacNamesCount, other.fShortZodiacNames, other.fShortZodiacNamesCount); - } else { - fShortZodiacNames = nullptr; - fShortZodiacNamesCount = 0; - } - - if (other.fZoneStrings != nullptr) { - fZoneStringsColCount = other.fZoneStringsColCount; - fZoneStringsRowCount = other.fZoneStringsRowCount; - createZoneStrings((const UnicodeString**)other.fZoneStrings); - - } else { - fZoneStrings = nullptr; - fZoneStringsColCount = 0; - fZoneStringsRowCount = 0; - } - fZSFLocale = other.fZSFLocale; - // Other zone strings data is created on demand - fLocaleZoneStrings = nullptr; - - // fastCopyFrom() - see assignArray comments - fLocalPatternChars.fastCopyFrom(other.fLocalPatternChars); - - uprv_memcpy(fCapitalization, other.fCapitalization, sizeof(fCapitalization)); -} - -/** - * Assignment operator. - */ -DateFormatSymbols& DateFormatSymbols::operator=(const DateFormatSymbols& other) -{ - if (this == &other) { return *this; } // self-assignment: no-op - dispose(); - copyData(other); - - return *this; -} - -DateFormatSymbols::~DateFormatSymbols() -{ - dispose(); -} - -void DateFormatSymbols::dispose() -{ - delete[] fEras; - delete[] fEraNames; - delete[] fNarrowEras; - delete[] fMonths; - delete[] fShortMonths; - delete[] fNarrowMonths; - delete[] fStandaloneMonths; - delete[] fStandaloneShortMonths; - delete[] fStandaloneNarrowMonths; - delete[] fWeekdays; - delete[] fShortWeekdays; - delete[] fShorterWeekdays; - delete[] fNarrowWeekdays; - delete[] fStandaloneWeekdays; - delete[] fStandaloneShortWeekdays; - delete[] fStandaloneShorterWeekdays; - delete[] fStandaloneNarrowWeekdays; - delete[] fAmPms; - delete[] fWideAmPms; - delete[] fNarrowAmPms; - delete[] fQuarters; - delete[] fShortQuarters; - delete[] fNarrowQuarters; - delete[] fStandaloneQuarters; - delete[] fStandaloneShortQuarters; - delete[] fStandaloneNarrowQuarters; - delete[] fLeapMonthPatterns; - delete[] fShortYearNames; - delete[] fShortZodiacNames; - delete[] fAbbreviatedDayPeriods; - delete[] fWideDayPeriods; - delete[] fNarrowDayPeriods; - delete[] fStandaloneAbbreviatedDayPeriods; - delete[] fStandaloneWideDayPeriods; - delete[] fStandaloneNarrowDayPeriods; - - actualLocale = Locale::getRoot(); - validLocale = Locale::getRoot(); - disposeZoneStrings(); -} - -void DateFormatSymbols::disposeZoneStrings() -{ - if (fZoneStrings) { - for (int32_t row = 0; row < fZoneStringsRowCount; ++row) { - delete[] fZoneStrings[row]; - } - uprv_free(fZoneStrings); - } - if (fLocaleZoneStrings) { - for (int32_t row = 0; row < fZoneStringsRowCount; ++row) { - delete[] fLocaleZoneStrings[row]; - } - uprv_free(fLocaleZoneStrings); - } - - fZoneStrings = nullptr; - fLocaleZoneStrings = nullptr; - fZoneStringsRowCount = 0; - fZoneStringsColCount = 0; -} - -UBool -DateFormatSymbols::arrayCompare(const UnicodeString* array1, - const UnicodeString* array2, - int32_t count) -{ - if (array1 == array2) return true; - while (count>0) - { - --count; - if (array1[count] != array2[count]) return false; - } - return true; -} - -bool -DateFormatSymbols::operator==(const DateFormatSymbols& other) const -{ - // First do cheap comparisons - if (this == &other) { - return true; - } - if (fErasCount == other.fErasCount && - fEraNamesCount == other.fEraNamesCount && - fNarrowErasCount == other.fNarrowErasCount && - fMonthsCount == other.fMonthsCount && - fShortMonthsCount == other.fShortMonthsCount && - fNarrowMonthsCount == other.fNarrowMonthsCount && - fStandaloneMonthsCount == other.fStandaloneMonthsCount && - fStandaloneShortMonthsCount == other.fStandaloneShortMonthsCount && - fStandaloneNarrowMonthsCount == other.fStandaloneNarrowMonthsCount && - fWeekdaysCount == other.fWeekdaysCount && - fShortWeekdaysCount == other.fShortWeekdaysCount && - fShorterWeekdaysCount == other.fShorterWeekdaysCount && - fNarrowWeekdaysCount == other.fNarrowWeekdaysCount && - fStandaloneWeekdaysCount == other.fStandaloneWeekdaysCount && - fStandaloneShortWeekdaysCount == other.fStandaloneShortWeekdaysCount && - fStandaloneShorterWeekdaysCount == other.fStandaloneShorterWeekdaysCount && - fStandaloneNarrowWeekdaysCount == other.fStandaloneNarrowWeekdaysCount && - fAmPmsCount == other.fAmPmsCount && - fWideAmPmsCount == other.fWideAmPmsCount && - fNarrowAmPmsCount == other.fNarrowAmPmsCount && - fQuartersCount == other.fQuartersCount && - fShortQuartersCount == other.fShortQuartersCount && - fNarrowQuartersCount == other.fNarrowQuartersCount && - fStandaloneQuartersCount == other.fStandaloneQuartersCount && - fStandaloneShortQuartersCount == other.fStandaloneShortQuartersCount && - fStandaloneNarrowQuartersCount == other.fStandaloneNarrowQuartersCount && - fLeapMonthPatternsCount == other.fLeapMonthPatternsCount && - fShortYearNamesCount == other.fShortYearNamesCount && - fShortZodiacNamesCount == other.fShortZodiacNamesCount && - fAbbreviatedDayPeriodsCount == other.fAbbreviatedDayPeriodsCount && - fWideDayPeriodsCount == other.fWideDayPeriodsCount && - fNarrowDayPeriodsCount == other.fNarrowDayPeriodsCount && - fStandaloneAbbreviatedDayPeriodsCount == other.fStandaloneAbbreviatedDayPeriodsCount && - fStandaloneWideDayPeriodsCount == other.fStandaloneWideDayPeriodsCount && - fStandaloneNarrowDayPeriodsCount == other.fStandaloneNarrowDayPeriodsCount && - (uprv_memcmp(fCapitalization, other.fCapitalization, sizeof(fCapitalization))==0)) - { - // Now compare the arrays themselves - if (arrayCompare(fEras, other.fEras, fErasCount) && - arrayCompare(fEraNames, other.fEraNames, fEraNamesCount) && - arrayCompare(fNarrowEras, other.fNarrowEras, fNarrowErasCount) && - arrayCompare(fMonths, other.fMonths, fMonthsCount) && - arrayCompare(fShortMonths, other.fShortMonths, fShortMonthsCount) && - arrayCompare(fNarrowMonths, other.fNarrowMonths, fNarrowMonthsCount) && - arrayCompare(fStandaloneMonths, other.fStandaloneMonths, fStandaloneMonthsCount) && - arrayCompare(fStandaloneShortMonths, other.fStandaloneShortMonths, fStandaloneShortMonthsCount) && - arrayCompare(fStandaloneNarrowMonths, other.fStandaloneNarrowMonths, fStandaloneNarrowMonthsCount) && - arrayCompare(fWeekdays, other.fWeekdays, fWeekdaysCount) && - arrayCompare(fShortWeekdays, other.fShortWeekdays, fShortWeekdaysCount) && - arrayCompare(fShorterWeekdays, other.fShorterWeekdays, fShorterWeekdaysCount) && - arrayCompare(fNarrowWeekdays, other.fNarrowWeekdays, fNarrowWeekdaysCount) && - arrayCompare(fStandaloneWeekdays, other.fStandaloneWeekdays, fStandaloneWeekdaysCount) && - arrayCompare(fStandaloneShortWeekdays, other.fStandaloneShortWeekdays, fStandaloneShortWeekdaysCount) && - arrayCompare(fStandaloneShorterWeekdays, other.fStandaloneShorterWeekdays, fStandaloneShorterWeekdaysCount) && - arrayCompare(fStandaloneNarrowWeekdays, other.fStandaloneNarrowWeekdays, fStandaloneNarrowWeekdaysCount) && - arrayCompare(fAmPms, other.fAmPms, fAmPmsCount) && - arrayCompare(fWideAmPms, other.fWideAmPms, fWideAmPmsCount) && - arrayCompare(fNarrowAmPms, other.fNarrowAmPms, fNarrowAmPmsCount) && - fTimeSeparator == other.fTimeSeparator && - arrayCompare(fQuarters, other.fQuarters, fQuartersCount) && - arrayCompare(fShortQuarters, other.fShortQuarters, fShortQuartersCount) && - arrayCompare(fNarrowQuarters, other.fNarrowQuarters, fNarrowQuartersCount) && - arrayCompare(fStandaloneQuarters, other.fStandaloneQuarters, fStandaloneQuartersCount) && - arrayCompare(fStandaloneShortQuarters, other.fStandaloneShortQuarters, fStandaloneShortQuartersCount) && - arrayCompare(fStandaloneNarrowQuarters, other.fStandaloneNarrowQuarters, fStandaloneNarrowQuartersCount) && - arrayCompare(fLeapMonthPatterns, other.fLeapMonthPatterns, fLeapMonthPatternsCount) && - arrayCompare(fShortYearNames, other.fShortYearNames, fShortYearNamesCount) && - arrayCompare(fShortZodiacNames, other.fShortZodiacNames, fShortZodiacNamesCount) && - arrayCompare(fAbbreviatedDayPeriods, other.fAbbreviatedDayPeriods, fAbbreviatedDayPeriodsCount) && - arrayCompare(fWideDayPeriods, other.fWideDayPeriods, fWideDayPeriodsCount) && - arrayCompare(fNarrowDayPeriods, other.fNarrowDayPeriods, fNarrowDayPeriodsCount) && - arrayCompare(fStandaloneAbbreviatedDayPeriods, other.fStandaloneAbbreviatedDayPeriods, - fStandaloneAbbreviatedDayPeriodsCount) && - arrayCompare(fStandaloneWideDayPeriods, other.fStandaloneWideDayPeriods, - fStandaloneWideDayPeriodsCount) && - arrayCompare(fStandaloneNarrowDayPeriods, other.fStandaloneNarrowDayPeriods, - fStandaloneWideDayPeriodsCount)) - { - // Compare the contents of fZoneStrings - if (fZoneStrings == nullptr && other.fZoneStrings == nullptr) { - if (fZSFLocale == other.fZSFLocale) { - return true; - } - } else if (fZoneStrings != nullptr && other.fZoneStrings != nullptr) { - if (fZoneStringsRowCount == other.fZoneStringsRowCount - && fZoneStringsColCount == other.fZoneStringsColCount) { - bool cmpres = true; - for (int32_t i = 0; (i < fZoneStringsRowCount) && cmpres; i++) { - cmpres = arrayCompare(fZoneStrings[i], other.fZoneStrings[i], fZoneStringsColCount); - } - return cmpres; - } - } - return false; - } - } - return false; -} - -//------------------------------------------------------ - -const UnicodeString* -DateFormatSymbols::getEras(int32_t &count) const -{ - count = fErasCount; - return fEras; -} - -const UnicodeString* -DateFormatSymbols::getEraNames(int32_t &count) const -{ - count = fEraNamesCount; - return fEraNames; -} - -const UnicodeString* -DateFormatSymbols::getNarrowEras(int32_t &count) const -{ - count = fNarrowErasCount; - return fNarrowEras; -} - -const UnicodeString* -DateFormatSymbols::getMonths(int32_t &count) const -{ - count = fMonthsCount; - return fMonths; -} - -const UnicodeString* -DateFormatSymbols::getShortMonths(int32_t &count) const -{ - count = fShortMonthsCount; - return fShortMonths; -} - -const UnicodeString* -DateFormatSymbols::getMonths(int32_t &count, DtContextType context, DtWidthType width ) const -{ - UnicodeString *returnValue = nullptr; - - switch (context) { - case FORMAT : - switch(width) { - case WIDE : - count = fMonthsCount; - returnValue = fMonths; - break; - case ABBREVIATED : - case SHORT : // no month data for this, defaults to ABBREVIATED - count = fShortMonthsCount; - returnValue = fShortMonths; - break; - case NARROW : - count = fNarrowMonthsCount; - returnValue = fNarrowMonths; - break; - case DT_WIDTH_COUNT : - break; - } - break; - case STANDALONE : - switch(width) { - case WIDE : - count = fStandaloneMonthsCount; - returnValue = fStandaloneMonths; - break; - case ABBREVIATED : - case SHORT : // no month data for this, defaults to ABBREVIATED - count = fStandaloneShortMonthsCount; - returnValue = fStandaloneShortMonths; - break; - case NARROW : - count = fStandaloneNarrowMonthsCount; - returnValue = fStandaloneNarrowMonths; - break; - case DT_WIDTH_COUNT : - break; - } - break; - case DT_CONTEXT_COUNT : - break; - } - return returnValue; -} - -const UnicodeString* -DateFormatSymbols::getWeekdays(int32_t &count) const -{ - count = fWeekdaysCount; - return fWeekdays; -} - -const UnicodeString* -DateFormatSymbols::getShortWeekdays(int32_t &count) const -{ - count = fShortWeekdaysCount; - return fShortWeekdays; -} - -const UnicodeString* -DateFormatSymbols::getWeekdays(int32_t &count, DtContextType context, DtWidthType width) const -{ - UnicodeString *returnValue = nullptr; - switch (context) { - case FORMAT : - switch(width) { - case WIDE : - count = fWeekdaysCount; - returnValue = fWeekdays; - break; - case ABBREVIATED : - count = fShortWeekdaysCount; - returnValue = fShortWeekdays; - break; - case SHORT : - count = fShorterWeekdaysCount; - returnValue = fShorterWeekdays; - break; - case NARROW : - count = fNarrowWeekdaysCount; - returnValue = fNarrowWeekdays; - break; - case DT_WIDTH_COUNT : - break; - } - break; - case STANDALONE : - switch(width) { - case WIDE : - count = fStandaloneWeekdaysCount; - returnValue = fStandaloneWeekdays; - break; - case ABBREVIATED : - count = fStandaloneShortWeekdaysCount; - returnValue = fStandaloneShortWeekdays; - break; - case SHORT : - count = fStandaloneShorterWeekdaysCount; - returnValue = fStandaloneShorterWeekdays; - break; - case NARROW : - count = fStandaloneNarrowWeekdaysCount; - returnValue = fStandaloneNarrowWeekdays; - break; - case DT_WIDTH_COUNT : - break; - } - break; - case DT_CONTEXT_COUNT : - break; - } - return returnValue; -} - -const UnicodeString* -DateFormatSymbols::getQuarters(int32_t &count, DtContextType context, DtWidthType width ) const -{ - UnicodeString *returnValue = nullptr; - - switch (context) { - case FORMAT : - switch(width) { - case WIDE : - count = fQuartersCount; - returnValue = fQuarters; - break; - case ABBREVIATED : - case SHORT : // no quarter data for this, defaults to ABBREVIATED - count = fShortQuartersCount; - returnValue = fShortQuarters; - break; - case NARROW : - count = fNarrowQuartersCount; - returnValue = fNarrowQuarters; - break; - case DT_WIDTH_COUNT : - break; - } - break; - case STANDALONE : - switch(width) { - case WIDE : - count = fStandaloneQuartersCount; - returnValue = fStandaloneQuarters; - break; - case ABBREVIATED : - case SHORT : // no quarter data for this, defaults to ABBREVIATED - count = fStandaloneShortQuartersCount; - returnValue = fStandaloneShortQuarters; - break; - case NARROW : - count = fStandaloneNarrowQuartersCount; - returnValue = fStandaloneNarrowQuarters; - break; - case DT_WIDTH_COUNT : - break; - } - break; - case DT_CONTEXT_COUNT : - break; - } - return returnValue; -} - -UnicodeString& -DateFormatSymbols::getTimeSeparatorString(UnicodeString& result) const -{ - // fastCopyFrom() - see assignArray comments - return result.fastCopyFrom(fTimeSeparator); -} - -const UnicodeString* -DateFormatSymbols::getAmPmStrings(int32_t &count) const -{ - return getAmPmStrings(count, FORMAT, ABBREVIATED); -} - -const UnicodeString* -DateFormatSymbols::getAmPmStrings(int32_t &count, DtContextType /*ignored*/, DtWidthType width) const -{ - UnicodeString* const* srcArray; - int32_t const* srcCount; - switch (width) { - case WIDE: - srcArray = &fWideAmPms; - srcCount = &fWideAmPmsCount; - break; - case NARROW: - srcArray = &fNarrowAmPms; - srcCount = &fNarrowAmPmsCount; - break; - case ABBREVIATED: - default: - srcArray = &fAmPms; - srcCount = &fAmPmsCount; - break; - } - - count = *srcCount; - return *srcArray; -} - -const UnicodeString* -DateFormatSymbols::getLeapMonthPatterns(int32_t &count) const -{ - count = fLeapMonthPatternsCount; - return fLeapMonthPatterns; -} - -const UnicodeString* -DateFormatSymbols::getYearNames(int32_t& count, - DtContextType /*ignored*/, DtWidthType /*ignored*/) const -{ - count = fShortYearNamesCount; - return fShortYearNames; -} - -void -DateFormatSymbols::setYearNames(const UnicodeString* yearNames, int32_t count, - DtContextType context, DtWidthType width) -{ - if (context == FORMAT && width == ABBREVIATED) { - delete[] fShortYearNames; - fShortYearNames = newUnicodeStringArray(count); - uprv_arrayCopy(yearNames, fShortYearNames, count); - fShortYearNamesCount = count; - } -} - -const UnicodeString* -DateFormatSymbols::getZodiacNames(int32_t& count, - DtContextType /*ignored*/, DtWidthType /*ignored*/) const -{ - count = fShortZodiacNamesCount; - return fShortZodiacNames; -} - -void -DateFormatSymbols::setZodiacNames(const UnicodeString* zodiacNames, int32_t count, - DtContextType context, DtWidthType width) -{ - if (context == FORMAT && width == ABBREVIATED) { - delete[] fShortZodiacNames; - fShortZodiacNames = newUnicodeStringArray(count); - uprv_arrayCopy(zodiacNames, fShortZodiacNames, count); - fShortZodiacNamesCount = count; - } -} - -//------------------------------------------------------ - -void -DateFormatSymbols::setEras(const UnicodeString* erasArray, int32_t count) -{ - // delete the old list if we own it - delete[] fEras; - - // we always own the new list, which we create here (we duplicate rather - // than adopting the list passed in) - fEras = newUnicodeStringArray(count); - uprv_arrayCopy(erasArray,fEras, count); - fErasCount = count; -} - -void -DateFormatSymbols::setEraNames(const UnicodeString* eraNamesArray, int32_t count) -{ - // delete the old list if we own it - delete[] fEraNames; - - // we always own the new list, which we create here (we duplicate rather - // than adopting the list passed in) - fEraNames = newUnicodeStringArray(count); - uprv_arrayCopy(eraNamesArray,fEraNames, count); - fEraNamesCount = count; -} - -void -DateFormatSymbols::setNarrowEras(const UnicodeString* narrowErasArray, int32_t count) -{ - // delete the old list if we own it - delete[] fNarrowEras; - - // we always own the new list, which we create here (we duplicate rather - // than adopting the list passed in) - fNarrowEras = newUnicodeStringArray(count); - uprv_arrayCopy(narrowErasArray,fNarrowEras, count); - fNarrowErasCount = count; -} - -void -DateFormatSymbols::setMonths(const UnicodeString* monthsArray, int32_t count) -{ - // delete the old list if we own it - delete[] fMonths; - - // we always own the new list, which we create here (we duplicate rather - // than adopting the list passed in) - fMonths = newUnicodeStringArray(count); - uprv_arrayCopy( monthsArray,fMonths,count); - fMonthsCount = count; -} - -void -DateFormatSymbols::setShortMonths(const UnicodeString* shortMonthsArray, int32_t count) -{ - // delete the old list if we own it - delete[] fShortMonths; - - // we always own the new list, which we create here (we duplicate rather - // than adopting the list passed in) - fShortMonths = newUnicodeStringArray(count); - uprv_arrayCopy(shortMonthsArray,fShortMonths, count); - fShortMonthsCount = count; -} - -void -DateFormatSymbols::setMonths(const UnicodeString* monthsArray, int32_t count, DtContextType context, DtWidthType width) -{ - // delete the old list if we own it - // we always own the new list, which we create here (we duplicate rather - // than adopting the list passed in) - - switch (context) { - case FORMAT : - switch (width) { - case WIDE : - delete[] fMonths; - fMonths = newUnicodeStringArray(count); - uprv_arrayCopy( monthsArray,fMonths,count); - fMonthsCount = count; - break; - case ABBREVIATED : - delete[] fShortMonths; - fShortMonths = newUnicodeStringArray(count); - uprv_arrayCopy( monthsArray,fShortMonths,count); - fShortMonthsCount = count; - break; - case NARROW : - delete[] fNarrowMonths; - fNarrowMonths = newUnicodeStringArray(count); - uprv_arrayCopy( monthsArray,fNarrowMonths,count); - fNarrowMonthsCount = count; - break; - default : - break; - } - break; - case STANDALONE : - switch (width) { - case WIDE : - delete[] fStandaloneMonths; - fStandaloneMonths = newUnicodeStringArray(count); - uprv_arrayCopy( monthsArray,fStandaloneMonths,count); - fStandaloneMonthsCount = count; - break; - case ABBREVIATED : - delete[] fStandaloneShortMonths; - fStandaloneShortMonths = newUnicodeStringArray(count); - uprv_arrayCopy( monthsArray,fStandaloneShortMonths,count); - fStandaloneShortMonthsCount = count; - break; - case NARROW : - delete[] fStandaloneNarrowMonths; - fStandaloneNarrowMonths = newUnicodeStringArray(count); - uprv_arrayCopy( monthsArray,fStandaloneNarrowMonths,count); - fStandaloneNarrowMonthsCount = count; - break; - default : - break; - } - break; - case DT_CONTEXT_COUNT : - break; - } -} - -void DateFormatSymbols::setWeekdays(const UnicodeString* weekdaysArray, int32_t count) -{ - // delete the old list if we own it - delete[] fWeekdays; - - // we always own the new list, which we create here (we duplicate rather - // than adopting the list passed in) - fWeekdays = newUnicodeStringArray(count); - uprv_arrayCopy(weekdaysArray,fWeekdays,count); - fWeekdaysCount = count; -} - -void -DateFormatSymbols::setShortWeekdays(const UnicodeString* shortWeekdaysArray, int32_t count) -{ - // delete the old list if we own it - delete[] fShortWeekdays; - - // we always own the new list, which we create here (we duplicate rather - // than adopting the list passed in) - fShortWeekdays = newUnicodeStringArray(count); - uprv_arrayCopy(shortWeekdaysArray, fShortWeekdays, count); - fShortWeekdaysCount = count; -} - -void -DateFormatSymbols::setWeekdays(const UnicodeString* weekdaysArray, int32_t count, DtContextType context, DtWidthType width) -{ - // delete the old list if we own it - // we always own the new list, which we create here (we duplicate rather - // than adopting the list passed in) - - switch (context) { - case FORMAT : - switch (width) { - case WIDE : - delete[] fWeekdays; - fWeekdays = newUnicodeStringArray(count); - uprv_arrayCopy(weekdaysArray, fWeekdays, count); - fWeekdaysCount = count; - break; - case ABBREVIATED : - delete[] fShortWeekdays; - fShortWeekdays = newUnicodeStringArray(count); - uprv_arrayCopy(weekdaysArray, fShortWeekdays, count); - fShortWeekdaysCount = count; - break; - case SHORT : - delete[] fShorterWeekdays; - fShorterWeekdays = newUnicodeStringArray(count); - uprv_arrayCopy(weekdaysArray, fShorterWeekdays, count); - fShorterWeekdaysCount = count; - break; - case NARROW : - delete[] fNarrowWeekdays; - fNarrowWeekdays = newUnicodeStringArray(count); - uprv_arrayCopy(weekdaysArray, fNarrowWeekdays, count); - fNarrowWeekdaysCount = count; - break; - case DT_WIDTH_COUNT : - break; - } - break; - case STANDALONE : - switch (width) { - case WIDE : - delete[] fStandaloneWeekdays; - fStandaloneWeekdays = newUnicodeStringArray(count); - uprv_arrayCopy(weekdaysArray, fStandaloneWeekdays, count); - fStandaloneWeekdaysCount = count; - break; - case ABBREVIATED : - delete[] fStandaloneShortWeekdays; - fStandaloneShortWeekdays = newUnicodeStringArray(count); - uprv_arrayCopy(weekdaysArray, fStandaloneShortWeekdays, count); - fStandaloneShortWeekdaysCount = count; - break; - case SHORT : - delete[] fStandaloneShorterWeekdays; - fStandaloneShorterWeekdays = newUnicodeStringArray(count); - uprv_arrayCopy(weekdaysArray, fStandaloneShorterWeekdays, count); - fStandaloneShorterWeekdaysCount = count; - break; - case NARROW : - delete[] fStandaloneNarrowWeekdays; - fStandaloneNarrowWeekdays = newUnicodeStringArray(count); - uprv_arrayCopy(weekdaysArray, fStandaloneNarrowWeekdays, count); - fStandaloneNarrowWeekdaysCount = count; - break; - case DT_WIDTH_COUNT : - break; - } - break; - case DT_CONTEXT_COUNT : - break; - } -} - -void -DateFormatSymbols::setQuarters(const UnicodeString* quartersArray, int32_t count, DtContextType context, DtWidthType width) -{ - // delete the old list if we own it - // we always own the new list, which we create here (we duplicate rather - // than adopting the list passed in) - - switch (context) { - case FORMAT : - switch (width) { - case WIDE : - delete[] fQuarters; - fQuarters = newUnicodeStringArray(count); - uprv_arrayCopy( quartersArray,fQuarters,count); - fQuartersCount = count; - break; - case ABBREVIATED : - delete[] fShortQuarters; - fShortQuarters = newUnicodeStringArray(count); - uprv_arrayCopy( quartersArray,fShortQuarters,count); - fShortQuartersCount = count; - break; - case NARROW : - delete[] fNarrowQuarters; - fNarrowQuarters = newUnicodeStringArray(count); - uprv_arrayCopy( quartersArray,fNarrowQuarters,count); - fNarrowQuartersCount = count; - break; - default : - break; - } - break; - case STANDALONE : - switch (width) { - case WIDE : - delete[] fStandaloneQuarters; - fStandaloneQuarters = newUnicodeStringArray(count); - uprv_arrayCopy( quartersArray,fStandaloneQuarters,count); - fStandaloneQuartersCount = count; - break; - case ABBREVIATED : - delete[] fStandaloneShortQuarters; - fStandaloneShortQuarters = newUnicodeStringArray(count); - uprv_arrayCopy( quartersArray,fStandaloneShortQuarters,count); - fStandaloneShortQuartersCount = count; - break; - case NARROW : - delete[] fStandaloneNarrowQuarters; - fStandaloneNarrowQuarters = newUnicodeStringArray(count); - uprv_arrayCopy( quartersArray,fStandaloneNarrowQuarters,count); - fStandaloneNarrowQuartersCount = count; - break; - default : - break; - } - break; - case DT_CONTEXT_COUNT : - break; - } -} - -void -DateFormatSymbols::setAmPmStrings(const UnicodeString* amPmsArray, int32_t count) -{ - setAmPmStrings(amPmsArray, count, FORMAT, ABBREVIATED); -} - -void -DateFormatSymbols::setAmPmStrings(const UnicodeString* amPmsArray, int32_t count, DtContextType /*ignored*/, DtWidthType width) -{ - UnicodeString** targetArray; - int32_t* targetCount; - switch (width) { - case WIDE: - targetArray = &fWideAmPms; - targetCount = &fWideAmPmsCount; - break; - case NARROW: - targetArray = &fNarrowAmPms; - targetCount = &fNarrowAmPmsCount; - break; - case ABBREVIATED: - default: - targetArray = &fAmPms; - targetCount = &fAmPmsCount; - break; - } - - // delete the old list if we own it - delete[] *targetArray; - - // we always own the new list, which we create here (we duplicate rather - // than adopting the list passed in) - *targetArray = newUnicodeStringArray(count); - uprv_arrayCopy(amPmsArray,*targetArray,count); - *targetCount = count; -} - -void -DateFormatSymbols::setTimeSeparatorString(const UnicodeString& newTimeSeparator) -{ - fTimeSeparator = newTimeSeparator; -} - -const UnicodeString** -DateFormatSymbols::getZoneStrings(int32_t& rowCount, int32_t& columnCount) const -{ - const UnicodeString **result = nullptr; - static UMutex LOCK; - - umtx_lock(&LOCK); - if (fZoneStrings == nullptr) { - if (fLocaleZoneStrings == nullptr) { - const_cast(this)->initZoneStringsArray(); - } - result = (const UnicodeString**)fLocaleZoneStrings; - } else { - result = (const UnicodeString**)fZoneStrings; - } - rowCount = fZoneStringsRowCount; - columnCount = fZoneStringsColCount; - umtx_unlock(&LOCK); - - return result; -} - -// For now, we include all zones -#define ZONE_SET UCAL_ZONE_TYPE_ANY - -// This code must be called within a synchronized block -void -DateFormatSymbols::initZoneStringsArray() { - if (fZoneStrings != nullptr || fLocaleZoneStrings != nullptr) { - return; - } - - UErrorCode status = U_ZERO_ERROR; - - StringEnumeration *tzids = nullptr; - UnicodeString ** zarray = nullptr; - TimeZoneNames *tzNames = nullptr; - int32_t rows = 0; - - static const UTimeZoneNameType TYPES[] = { - UTZNM_LONG_STANDARD, UTZNM_SHORT_STANDARD, - UTZNM_LONG_DAYLIGHT, UTZNM_SHORT_DAYLIGHT - }; - static const int32_t NUM_TYPES = 4; - - do { // dummy do-while - - tzids = TimeZone::createTimeZoneIDEnumeration(ZONE_SET, nullptr, nullptr, status); - rows = tzids->count(status); - if (U_FAILURE(status)) { - break; - } - - // Allocate array - int32_t size = rows * sizeof(UnicodeString*); - zarray = static_cast(uprv_malloc(size)); - if (zarray == nullptr) { - status = U_MEMORY_ALLOCATION_ERROR; - break; - } - uprv_memset(zarray, 0, size); - - tzNames = TimeZoneNames::createInstance(fZSFLocale, status); - tzNames->loadAllDisplayNames(status); - if (U_FAILURE(status)) { break; } - - const UnicodeString *tzid; - int32_t i = 0; - UDate now = Calendar::getNow(); - UnicodeString tzDispName; - - while ((tzid = tzids->snext(status)) != nullptr) { - if (U_FAILURE(status)) { - break; - } - - zarray[i] = new UnicodeString[5]; - if (zarray[i] == nullptr) { - status = U_MEMORY_ALLOCATION_ERROR; - break; - } - - zarray[i][0].setTo(*tzid); - tzNames->getDisplayNames(*tzid, TYPES, NUM_TYPES, now, zarray[i]+1, status); - i++; - } - - } while (false); - - if (U_FAILURE(status)) { - if (zarray) { - for (int32_t i = 0; i < rows; i++) { - if (zarray[i]) { - delete[] zarray[i]; - } - } - uprv_free(zarray); - zarray = nullptr; - } - } - - delete tzNames; - delete tzids; - - fLocaleZoneStrings = zarray; - fZoneStringsRowCount = rows; - fZoneStringsColCount = 1 + NUM_TYPES; -} - -void -DateFormatSymbols::setZoneStrings(const UnicodeString* const *strings, int32_t rowCount, int32_t columnCount) -{ - // since deleting a 2-d array is a pain in the butt, we offload that task to - // a separate function - disposeZoneStrings(); - // we always own the new list, which we create here (we duplicate rather - // than adopting the list passed in) - fZoneStringsRowCount = rowCount; - fZoneStringsColCount = columnCount; - createZoneStrings(const_cast(strings)); -} - -//------------------------------------------------------ - -const char16_t * U_EXPORT2 -DateFormatSymbols::getPatternUChars() -{ - return gPatternChars; -} - -UDateFormatField U_EXPORT2 -DateFormatSymbols::getPatternCharIndex(char16_t c) { - if (c >= UPRV_LENGTHOF(gLookupPatternChars)) { - return UDAT_FIELD_COUNT; - } - const auto idx = gLookupPatternChars[c]; - return idx == -1 ? UDAT_FIELD_COUNT : static_cast(idx); -} - -static const uint64_t kNumericFieldsAlways = - (static_cast(1) << UDAT_YEAR_FIELD) | // y - (static_cast(1) << UDAT_DATE_FIELD) | // d - (static_cast(1) << UDAT_HOUR_OF_DAY1_FIELD) | // k - (static_cast(1) << UDAT_HOUR_OF_DAY0_FIELD) | // H - (static_cast(1) << UDAT_MINUTE_FIELD) | // m - (static_cast(1) << UDAT_SECOND_FIELD) | // s - (static_cast(1) << UDAT_FRACTIONAL_SECOND_FIELD) | // S - (static_cast(1) << UDAT_DAY_OF_YEAR_FIELD) | // D - (static_cast(1) << UDAT_DAY_OF_WEEK_IN_MONTH_FIELD) | // F - (static_cast(1) << UDAT_WEEK_OF_YEAR_FIELD) | // w - (static_cast(1) << UDAT_WEEK_OF_MONTH_FIELD) | // W - (static_cast(1) << UDAT_HOUR1_FIELD) | // h - (static_cast(1) << UDAT_HOUR0_FIELD) | // K - (static_cast(1) << UDAT_YEAR_WOY_FIELD) | // Y - (static_cast(1) << UDAT_EXTENDED_YEAR_FIELD) | // u - (static_cast(1) << UDAT_JULIAN_DAY_FIELD) | // g - (static_cast(1) << UDAT_MILLISECONDS_IN_DAY_FIELD) | // A - (static_cast(1) << UDAT_RELATED_YEAR_FIELD); // r - -static const uint64_t kNumericFieldsForCount12 = - (static_cast(1) << UDAT_MONTH_FIELD) | // M or MM - (static_cast(1) << UDAT_DOW_LOCAL_FIELD) | // e or ee - (static_cast(1) << UDAT_STANDALONE_DAY_FIELD) | // c or cc - (static_cast(1) << UDAT_STANDALONE_MONTH_FIELD) | // L or LL - (static_cast(1) << UDAT_QUARTER_FIELD) | // Q or QQ - (static_cast(1) << UDAT_STANDALONE_QUARTER_FIELD); // q or qq - -UBool U_EXPORT2 -DateFormatSymbols::isNumericField(UDateFormatField f, int32_t count) { - if (f == UDAT_FIELD_COUNT) { - return false; - } - uint64_t flag = static_cast(1) << f; - return ((kNumericFieldsAlways & flag) != 0 || ((kNumericFieldsForCount12 & flag) != 0 && count < 3)); -} - -UBool U_EXPORT2 -DateFormatSymbols::isNumericPatternChar(char16_t c, int32_t count) { - return isNumericField(getPatternCharIndex(c), count); -} - -//------------------------------------------------------ - -UnicodeString& -DateFormatSymbols::getLocalPatternChars(UnicodeString& result) const -{ - // fastCopyFrom() - see assignArray comments - return result.fastCopyFrom(fLocalPatternChars); -} - -//------------------------------------------------------ - -void -DateFormatSymbols::setLocalPatternChars(const UnicodeString& newLocalPatternChars) -{ - fLocalPatternChars = newLocalPatternChars; -} - -//------------------------------------------------------ - -namespace { - -// Constants declarations -const char16_t kCalendarAliasPrefixUChar[] = { - SOLIDUS, CAP_L, CAP_O, CAP_C, CAP_A, CAP_L, CAP_E, SOLIDUS, - LOW_C, LOW_A, LOW_L, LOW_E, LOW_N, LOW_D, LOW_A, LOW_R, SOLIDUS -}; -const char16_t kGregorianTagUChar[] = { - LOW_G, LOW_R, LOW_E, LOW_G, LOW_O, LOW_R, LOW_I, LOW_A, LOW_N -}; -const char16_t kVariantTagUChar[] = { - PERCENT, LOW_V, LOW_A, LOW_R, LOW_I, LOW_A, LOW_N, LOW_T -}; -const char16_t kLeapTagUChar[] = { - LOW_L, LOW_E, LOW_A, LOW_P -}; -const char16_t kCyclicNameSetsTagUChar[] = { - LOW_C, LOW_Y, LOW_C, LOW_L, LOW_I, LOW_C, CAP_N, LOW_A, LOW_M, LOW_E, CAP_S, LOW_E, LOW_T, LOW_S -}; -const char16_t kYearsTagUChar[] = { - SOLIDUS, LOW_Y, LOW_E, LOW_A, LOW_R, LOW_S -}; -const char16_t kZodiacsUChar[] = { - SOLIDUS, LOW_Z, LOW_O, LOW_D, LOW_I, LOW_A, LOW_C, LOW_S -}; -const char16_t kDayPartsTagUChar[] = { - SOLIDUS, LOW_D, LOW_A, LOW_Y, CAP_P, LOW_A, LOW_R, LOW_T, LOW_S -}; -const char16_t kFormatTagUChar[] = { - SOLIDUS, LOW_F, LOW_O, LOW_R, LOW_M, LOW_A, LOW_T -}; -const char16_t kAbbrTagUChar[] = { - SOLIDUS, LOW_A, LOW_B, LOW_B, LOW_R, LOW_E, LOW_V, LOW_I, LOW_A, LOW_T, LOW_E, LOW_D -}; - -// ResourceSink to enumerate all calendar resources -struct CalendarDataSink : public ResourceSink { - - // Enum which specifies the type of alias received, or no alias - enum AliasType { - SAME_CALENDAR, - DIFFERENT_CALENDAR, - GREGORIAN, - NONE - }; - - // Data structures to store resources from the current resource bundle - Hashtable arrays; - Hashtable arraySizes; - Hashtable maps; - /** - * Whenever there are aliases, the same object will be added twice to 'map'. - * To avoid double deletion, 'maps' won't take ownership of the objects. Instead, - * 'mapRefs' will own them and will delete them when CalendarDataSink is deleted. - */ - MemoryPool mapRefs; - - // Paths and the aliases they point to - UVector aliasPathPairs; - - // Current and next calendar resource table which should be loaded - UnicodeString currentCalendarType; - UnicodeString nextCalendarType; - - // Resources to visit when enumerating fallback calendars - LocalPointer resourcesToVisit; - - // Alias' relative path populated whenever an alias is read - UnicodeString aliasRelativePath; - - // Initializes CalendarDataSink with default values - CalendarDataSink(UErrorCode& status) - : arrays(false, status), arraySizes(false, status), maps(false, status), - mapRefs(), - aliasPathPairs(uprv_deleteUObject, uhash_compareUnicodeString, status), - currentCalendarType(), nextCalendarType(), - resourcesToVisit(nullptr), aliasRelativePath() { - if (U_FAILURE(status)) { return; } - } - virtual ~CalendarDataSink(); - - // Configure the CalendarSink to visit all the resources - void visitAllResources() { - resourcesToVisit.adoptInstead(nullptr); - } - - // Actions to be done before enumerating - void preEnumerate(const UnicodeString &calendarType) { - currentCalendarType = calendarType; - nextCalendarType.setToBogus(); - aliasPathPairs.removeAllElements(); - } - - virtual void put(const char *key, ResourceValue &value, UBool, UErrorCode &errorCode) override { - if (U_FAILURE(errorCode)) { return; } - U_ASSERT(!currentCalendarType.isEmpty()); - - // Stores the resources to visit on the next calendar. - LocalPointer resourcesToVisitNext(nullptr); - ResourceTable calendarData = value.getTable(errorCode); - if (U_FAILURE(errorCode)) { return; } - - // Enumerate all resources for this calendar - for (int i = 0; calendarData.getKeyAndValue(i, key, value); i++) { - UnicodeString keyUString(key, -1, US_INV); - - // == Handle aliases == - AliasType aliasType = processAliasFromValue(keyUString, value, errorCode); - if (U_FAILURE(errorCode)) { return; } - if (aliasType == GREGORIAN) { - // Ignore aliases to the gregorian calendar, all of its resources will be loaded anyway. - continue; - - } else if (aliasType == DIFFERENT_CALENDAR) { - // Whenever an alias to the next calendar (except gregorian) is encountered, register the - // calendar type it's pointing to - if (resourcesToVisitNext.isNull()) { - resourcesToVisitNext - .adoptInsteadAndCheckErrorCode(new UVector(uprv_deleteUObject, uhash_compareUnicodeString, errorCode), - errorCode); - if (U_FAILURE(errorCode)) { return; } - } - LocalPointer aliasRelativePathCopy(aliasRelativePath.clone(), errorCode); - resourcesToVisitNext->adoptElement(aliasRelativePathCopy.orphan(), errorCode); - if (U_FAILURE(errorCode)) { return; } - continue; - - } else if (aliasType == SAME_CALENDAR) { - // Register same-calendar alias - if (arrays.get(aliasRelativePath) == nullptr && maps.get(aliasRelativePath) == nullptr) { - LocalPointer aliasRelativePathCopy(aliasRelativePath.clone(), errorCode); - aliasPathPairs.adoptElement(aliasRelativePathCopy.orphan(), errorCode); - if (U_FAILURE(errorCode)) { return; } - LocalPointer keyUStringCopy(keyUString.clone(), errorCode); - aliasPathPairs.adoptElement(keyUStringCopy.orphan(), errorCode); - if (U_FAILURE(errorCode)) { return; } - } - continue; - } - - // Only visit the resources that were referenced by an alias on the previous calendar - // (AmPmMarkersAbbr is an exception). - if (!resourcesToVisit.isNull() && !resourcesToVisit->isEmpty() && !resourcesToVisit->contains(&keyUString) - && uprv_strcmp(key, gAmPmMarkersAbbrTag) != 0) { continue; } - - // == Handle data == - if (uprv_strcmp(key, gAmPmMarkersTag) == 0 - || uprv_strcmp(key, gAmPmMarkersAbbrTag) == 0 - || uprv_strcmp(key, gAmPmMarkersNarrowTag) == 0) { - if (arrays.get(keyUString) == nullptr) { - ResourceArray resourceArray = value.getArray(errorCode); - int32_t arraySize = resourceArray.getSize(); - LocalArray stringArray(new UnicodeString[arraySize], errorCode); - value.getStringArray(stringArray.getAlias(), arraySize, errorCode); - arrays.put(keyUString, stringArray.orphan(), errorCode); - arraySizes.puti(keyUString, arraySize, errorCode); - if (U_FAILURE(errorCode)) { return; } - } - } else if (uprv_strcmp(key, gErasTag) == 0 - || uprv_strcmp(key, gDayNamesTag) == 0 - || uprv_strcmp(key, gMonthNamesTag) == 0 - || uprv_strcmp(key, gQuartersTag) == 0 - || uprv_strcmp(key, gDayPeriodTag) == 0 - || uprv_strcmp(key, gMonthPatternsTag) == 0 - || uprv_strcmp(key, gCyclicNameSetsTag) == 0) { - processResource(keyUString, key, value, errorCode); - } - } - - // Apply same-calendar aliases - UBool modified; - do { - modified = false; - for (int32_t i = 0; i < aliasPathPairs.size();) { - UBool mod = false; - UnicodeString* alias = static_cast(aliasPathPairs[i]); - UnicodeString *aliasArray; - Hashtable *aliasMap; - if ((aliasArray = static_cast(arrays.get(*alias))) != nullptr) { - UnicodeString* path = static_cast(aliasPathPairs[i + 1]); - if (arrays.get(*path) == nullptr) { - // Clone the array - int32_t aliasArraySize = arraySizes.geti(*alias); - LocalArray aliasArrayCopy(new UnicodeString[aliasArraySize], errorCode); - if (U_FAILURE(errorCode)) { return; } - uprv_arrayCopy(aliasArray, aliasArrayCopy.getAlias(), aliasArraySize); - // Put the array on the 'arrays' map - arrays.put(*path, aliasArrayCopy.orphan(), errorCode); - arraySizes.puti(*path, aliasArraySize, errorCode); - } - if (U_FAILURE(errorCode)) { return; } - mod = true; - } else if ((aliasMap = static_cast(maps.get(*alias))) != nullptr) { - UnicodeString* path = static_cast(aliasPathPairs[i + 1]); - if (maps.get(*path) == nullptr) { - maps.put(*path, aliasMap, errorCode); - } - if (U_FAILURE(errorCode)) { return; } - mod = true; - } - if (mod) { - aliasPathPairs.removeElementAt(i + 1); - aliasPathPairs.removeElementAt(i); - modified = true; - } else { - i += 2; - } - } - } while (modified && !aliasPathPairs.isEmpty()); - - // Set the resources to visit on the next calendar - if (!resourcesToVisitNext.isNull()) { - resourcesToVisit = std::move(resourcesToVisitNext); - } - } - - // Process the nested resource bundle tables - void processResource(UnicodeString &path, const char *key, ResourceValue &value, UErrorCode &errorCode) { - if (U_FAILURE(errorCode)) return; - - ResourceTable table = value.getTable(errorCode); - if (U_FAILURE(errorCode)) return; - Hashtable* stringMap = nullptr; - - // Iterate over all the elements of the table and add them to the map - for (int i = 0; table.getKeyAndValue(i, key, value); i++) { - UnicodeString keyUString(key, -1, US_INV); - - // Ignore '%variant' keys - if (keyUString.endsWith(kVariantTagUChar, UPRV_LENGTHOF(kVariantTagUChar))) { - continue; - } - - // == Handle String elements == - if (value.getType() == URES_STRING) { - // We are on a leaf, store the map elements into the stringMap - if (i == 0) { - // mapRefs will keep ownership of 'stringMap': - stringMap = mapRefs.create(false, errorCode); - if (stringMap == nullptr) { - errorCode = U_MEMORY_ALLOCATION_ERROR; - return; - } - maps.put(path, stringMap, errorCode); - if (U_FAILURE(errorCode)) { return; } - stringMap->setValueDeleter(uprv_deleteUObject); - } - U_ASSERT(stringMap != nullptr); - int32_t valueStringSize; - const char16_t *valueString = value.getString(valueStringSize, errorCode); - if (U_FAILURE(errorCode)) { return; } - LocalPointer valueUString(new UnicodeString(true, valueString, valueStringSize), errorCode); - stringMap->put(keyUString, valueUString.orphan(), errorCode); - if (U_FAILURE(errorCode)) { return; } - continue; - } - U_ASSERT(stringMap == nullptr); - - // Store the current path's length and append the current key to the path. - int32_t pathLength = path.length(); - path.append(SOLIDUS).append(keyUString); - - // In cyclicNameSets ignore everything but years/format/abbreviated - // and zodiacs/format/abbreviated - if (path.startsWith(kCyclicNameSetsTagUChar, UPRV_LENGTHOF(kCyclicNameSetsTagUChar))) { - UBool skip = true; - int32_t startIndex = UPRV_LENGTHOF(kCyclicNameSetsTagUChar); - int32_t length = 0; - if (startIndex == path.length() - || path.compare(startIndex, (length = UPRV_LENGTHOF(kZodiacsUChar)), kZodiacsUChar, 0, UPRV_LENGTHOF(kZodiacsUChar)) == 0 - || path.compare(startIndex, (length = UPRV_LENGTHOF(kYearsTagUChar)), kYearsTagUChar, 0, UPRV_LENGTHOF(kYearsTagUChar)) == 0 - || path.compare(startIndex, (length = UPRV_LENGTHOF(kDayPartsTagUChar)), kDayPartsTagUChar, 0, UPRV_LENGTHOF(kDayPartsTagUChar)) == 0) { - startIndex += length; - length = 0; - if (startIndex == path.length() - || path.compare(startIndex, (length = UPRV_LENGTHOF(kFormatTagUChar)), kFormatTagUChar, 0, UPRV_LENGTHOF(kFormatTagUChar)) == 0) { - startIndex += length; - length = 0; - if (startIndex == path.length() - || path.compare(startIndex, (length = UPRV_LENGTHOF(kAbbrTagUChar)), kAbbrTagUChar, 0, UPRV_LENGTHOF(kAbbrTagUChar)) == 0) { - skip = false; - } - } - } - if (skip) { - // Drop the latest key on the path and continue - path.retainBetween(0, pathLength); - continue; - } - } - - // == Handle aliases == - if (arrays.get(path) != nullptr || maps.get(path) != nullptr) { - // Drop the latest key on the path and continue - path.retainBetween(0, pathLength); - continue; - } - - AliasType aliasType = processAliasFromValue(path, value, errorCode); - if (U_FAILURE(errorCode)) { return; } - if (aliasType == SAME_CALENDAR) { - // Store the alias path and the current path on aliasPathPairs - LocalPointer aliasRelativePathCopy(aliasRelativePath.clone(), errorCode); - aliasPathPairs.adoptElement(aliasRelativePathCopy.orphan(), errorCode); - if (U_FAILURE(errorCode)) { return; } - LocalPointer pathCopy(path.clone(), errorCode); - aliasPathPairs.adoptElement(pathCopy.orphan(), errorCode); - if (U_FAILURE(errorCode)) { return; } - - // Drop the latest key on the path and continue - path.retainBetween(0, pathLength); - continue; - } - U_ASSERT(aliasType == NONE); - - // == Handle data == - if (value.getType() == URES_ARRAY) { - // We are on a leaf, store the array - ResourceArray rDataArray = value.getArray(errorCode); - int32_t dataArraySize = rDataArray.getSize(); - LocalArray dataArray(new UnicodeString[dataArraySize], errorCode); - value.getStringArray(dataArray.getAlias(), dataArraySize, errorCode); - arrays.put(path, dataArray.orphan(), errorCode); - arraySizes.puti(path, dataArraySize, errorCode); - if (U_FAILURE(errorCode)) { return; } - } else if (value.getType() == URES_TABLE) { - // We are not on a leaf, recursively process the subtable. - processResource(path, key, value, errorCode); - if (U_FAILURE(errorCode)) { return; } - } - - // Drop the latest key on the path - path.retainBetween(0, pathLength); - } - } - - // Populates an AliasIdentifier with the alias information contained on the UResource.Value. - AliasType processAliasFromValue(UnicodeString ¤tRelativePath, ResourceValue &value, - UErrorCode &errorCode) { - if (U_FAILURE(errorCode)) { return NONE; } - - if (value.getType() == URES_ALIAS) { - int32_t aliasPathSize; - const char16_t* aliasPathUChar = value.getAliasString(aliasPathSize, errorCode); - if (U_FAILURE(errorCode)) { return NONE; } - UnicodeString aliasPath(aliasPathUChar, aliasPathSize); - const int32_t aliasPrefixLength = UPRV_LENGTHOF(kCalendarAliasPrefixUChar); - if (aliasPath.startsWith(kCalendarAliasPrefixUChar, aliasPrefixLength) - && aliasPath.length() > aliasPrefixLength) { - int32_t typeLimit = aliasPath.indexOf(SOLIDUS, aliasPrefixLength); - if (typeLimit > aliasPrefixLength) { - const UnicodeString aliasCalendarType = - aliasPath.tempSubStringBetween(aliasPrefixLength, typeLimit); - aliasRelativePath.setTo(aliasPath, typeLimit + 1, aliasPath.length()); - - if (currentCalendarType == aliasCalendarType - && currentRelativePath != aliasRelativePath) { - // If we have an alias to the same calendar, the path to the resource must be different - return SAME_CALENDAR; - - } else if (currentCalendarType != aliasCalendarType - && currentRelativePath == aliasRelativePath) { - // If we have an alias to a different calendar, the path to the resource must be the same - if (aliasCalendarType.compare(kGregorianTagUChar, UPRV_LENGTHOF(kGregorianTagUChar)) == 0) { - return GREGORIAN; - } else if (nextCalendarType.isBogus()) { - nextCalendarType = aliasCalendarType; - return DIFFERENT_CALENDAR; - } else if (nextCalendarType == aliasCalendarType) { - return DIFFERENT_CALENDAR; - } - } - } - } - errorCode = U_INTERNAL_PROGRAM_ERROR; - return NONE; - } - return NONE; - } - - // Deleter function to be used by 'arrays' - static void U_CALLCONV deleteUnicodeStringArray(void *uArray) { - delete[] static_cast(uArray); - } -}; -// Virtual destructors have to be defined out of line -CalendarDataSink::~CalendarDataSink() { - arrays.setValueDeleter(deleteUnicodeStringArray); -} -} - -//------------------------------------------------------ - -static void -initField(UnicodeString **field, int32_t& length, const char16_t *data, LastResortSize numStr, LastResortSize strLen, UErrorCode &status) { - if (U_SUCCESS(status)) { - length = numStr; - *field = newUnicodeStringArray(static_cast(numStr)); - if (*field) { - for(int32_t i = 0; isetTo(true, data + (i * (static_cast(strLen))), -1); - } - } - else { - length = 0; - status = U_MEMORY_ALLOCATION_ERROR; - } - } -} - -static void -initField(UnicodeString **field, int32_t& length, CalendarDataSink &sink, CharString &key, UErrorCode &status) { - if (U_SUCCESS(status)) { - UnicodeString keyUString(key.data(), -1, US_INV); - UnicodeString* array = static_cast(sink.arrays.get(keyUString)); - - if (array != nullptr) { - length = sink.arraySizes.geti(keyUString); - *field = array; - // DateFormatSymbols takes ownership of the array: - sink.arrays.remove(keyUString); - } else { - length = 0; - status = U_MISSING_RESOURCE_ERROR; - } - } -} - -static void -initField(UnicodeString **field, int32_t& length, CalendarDataSink &sink, CharString &key, int32_t arrayOffset, UErrorCode &status) { - if (U_SUCCESS(status)) { - UnicodeString keyUString(key.data(), -1, US_INV); - UnicodeString* array = static_cast(sink.arrays.get(keyUString)); - - if (array != nullptr) { - int32_t arrayLength = sink.arraySizes.geti(keyUString); - length = arrayLength + arrayOffset; - *field = new UnicodeString[length]; - if (*field == nullptr) { - status = U_MEMORY_ALLOCATION_ERROR; - return; - } - uprv_arrayCopy(array, 0, *field, arrayOffset, arrayLength); - } else { - length = 0; - status = U_MISSING_RESOURCE_ERROR; - } - } -} - -static void -initEras(UnicodeString **field, int32_t& length, CalendarDataSink &sink, CharString &key, const UResourceBundle *ctebPtr, const char* eraWidth, int32_t maxEra, UErrorCode &status) { - if (U_SUCCESS(status)) { - length = 0; - UnicodeString keyUString(key.data(), -1, US_INV); - Hashtable *eraNamesTable = static_cast(sink.maps.get(keyUString)); - - if (eraNamesTable != nullptr) { - UErrorCode resStatus = U_ZERO_ERROR; - LocalUResourceBundlePointer ctewb(ures_getByKeyWithFallback(ctebPtr, eraWidth, nullptr, &resStatus)); - const UResourceBundle *ctewbPtr = (U_SUCCESS(resStatus))? ctewb.getAlias() : nullptr; - *field = new UnicodeString[maxEra + 1]; - if (*field == nullptr) { - status = U_MEMORY_ALLOCATION_ERROR; - return; - } - length = maxEra + 1; - for (int32_t eraCode = 0; eraCode <= maxEra; eraCode++) { - char eraCodeStr[12]; // T_CString_integerToString is documented to generate at most 12 bytes including nul terminator - int32_t eraCodeStrLen = T_CString_integerToString(eraCodeStr, eraCode, 10); - UnicodeString eraCodeKey = UnicodeString(eraCodeStr, eraCodeStrLen, US_INV); - UnicodeString *eraName = static_cast(eraNamesTable->get(eraCodeKey)); - (*field)[eraCode].remove(); - if (eraName != nullptr) { - // Get eraName from map (created by CalendarSink) - (*field)[eraCode].fastCopyFrom(*eraName); - } else if (ctewbPtr != nullptr) { - // Try filling in missing items from parent locale(s) - resStatus = U_ZERO_ERROR; - LocalUResourceBundlePointer ctewkb(ures_getByKeyWithFallback(ctewbPtr, eraCodeStr, nullptr, &resStatus)); - if (U_SUCCESS(resStatus)) { - int32_t eraNameLen; - const UChar* eraNamePtr = ures_getString(ctewkb.getAlias(), &eraNameLen, &resStatus); - if (U_SUCCESS(resStatus)) { - (*field)[eraCode].setTo(false, eraNamePtr, eraNameLen); - } - } - } - } - return; - } - status = U_MISSING_RESOURCE_ERROR; - } -} - -static void -initLeapMonthPattern(UnicodeString *field, int32_t index, CalendarDataSink &sink, CharString &path, UErrorCode &status) { - field[index].remove(); - if (U_SUCCESS(status)) { - UnicodeString pathUString(path.data(), -1, US_INV); - Hashtable *leapMonthTable = static_cast(sink.maps.get(pathUString)); - if (leapMonthTable != nullptr) { - UnicodeString leapLabel(false, kLeapTagUChar, UPRV_LENGTHOF(kLeapTagUChar)); - UnicodeString *leapMonthPattern = static_cast(leapMonthTable->get(leapLabel)); - if (leapMonthPattern != nullptr) { - field[index].fastCopyFrom(*leapMonthPattern); - } else { - field[index].setToBogus(); - } - return; - } - status = U_MISSING_RESOURCE_ERROR; - } -} - -static CharString -&buildResourcePath(CharString &path, const char* segment1, UErrorCode &errorCode) { - return path.clear().append(segment1, -1, errorCode); -} - -static CharString -&buildResourcePath(CharString &path, const char* segment1, const char* segment2, - UErrorCode &errorCode) { - return buildResourcePath(path, segment1, errorCode).append('/', errorCode) - .append(segment2, -1, errorCode); -} - -static CharString -&buildResourcePath(CharString &path, const char* segment1, const char* segment2, - const char* segment3, UErrorCode &errorCode) { - return buildResourcePath(path, segment1, segment2, errorCode).append('/', errorCode) - .append(segment3, -1, errorCode); -} - -static CharString -&buildResourcePath(CharString &path, const char* segment1, const char* segment2, - const char* segment3, const char* segment4, UErrorCode &errorCode) { - return buildResourcePath(path, segment1, segment2, segment3, errorCode).append('/', errorCode) - .append(segment4, -1, errorCode); -} - -typedef struct { - const char * usageTypeName; - DateFormatSymbols::ECapitalizationContextUsageType usageTypeEnumValue; -} ContextUsageTypeNameToEnumValue; - -static const ContextUsageTypeNameToEnumValue contextUsageTypeMap[] = { - // Entries must be sorted by usageTypeName; entry with nullptr name terminates list. - { "day-format-except-narrow", DateFormatSymbols::kCapContextUsageDayFormat }, - { "day-narrow", DateFormatSymbols::kCapContextUsageDayNarrow }, - { "day-standalone-except-narrow", DateFormatSymbols::kCapContextUsageDayStandalone }, - { "era-abbr", DateFormatSymbols::kCapContextUsageEraAbbrev }, - { "era-name", DateFormatSymbols::kCapContextUsageEraWide }, - { "era-narrow", DateFormatSymbols::kCapContextUsageEraNarrow }, - { "metazone-long", DateFormatSymbols::kCapContextUsageMetazoneLong }, - { "metazone-short", DateFormatSymbols::kCapContextUsageMetazoneShort }, - { "month-format-except-narrow", DateFormatSymbols::kCapContextUsageMonthFormat }, - { "month-narrow", DateFormatSymbols::kCapContextUsageMonthNarrow }, - { "month-standalone-except-narrow", DateFormatSymbols::kCapContextUsageMonthStandalone }, - { "zone-long", DateFormatSymbols::kCapContextUsageZoneLong }, - { "zone-short", DateFormatSymbols::kCapContextUsageZoneShort }, - { nullptr, static_cast(0) }, -}; - -// Resource keys to look up localized strings for day periods. -// The first one must be midnight and the second must be noon, so that their indices coincide -// with the am/pm field. Formatting and parsing code for day periods relies on this coincidence. -static const char *dayPeriodKeys[] = {"midnight", "noon", - "morning1", "afternoon1", "evening1", "night1", - "morning2", "afternoon2", "evening2", "night2"}; - -UnicodeString* loadDayPeriodStrings(CalendarDataSink &sink, CharString &path, - int32_t &stringCount, UErrorCode &status) { - if (U_FAILURE(status)) { return nullptr; } - - UnicodeString pathUString(path.data(), -1, US_INV); - Hashtable* map = static_cast(sink.maps.get(pathUString)); - - stringCount = UPRV_LENGTHOF(dayPeriodKeys); - UnicodeString *strings = new UnicodeString[stringCount]; - if (strings == nullptr) { - status = U_MEMORY_ALLOCATION_ERROR; - return nullptr; - } - - if (map != nullptr) { - for (int32_t i = 0; i < stringCount; ++i) { - UnicodeString dayPeriodKey(dayPeriodKeys[i], -1, US_INV); - UnicodeString *dayPeriod = static_cast(map->get(dayPeriodKey)); - if (dayPeriod != nullptr) { - strings[i].fastCopyFrom(*dayPeriod); - } else { - strings[i].setToBogus(); - } - } - } else { - for (int32_t i = 0; i < stringCount; i++) { - strings[i].setToBogus(); - } - } - return strings; -} - - -void -DateFormatSymbols::initializeData(const Locale& locale, const char *type, UErrorCode& status, UBool useLastResortData) -{ - int32_t len = 0; - /* In case something goes wrong, initialize all of the data to nullptr. */ - fEras = nullptr; - fErasCount = 0; - fEraNames = nullptr; - fEraNamesCount = 0; - fNarrowEras = nullptr; - fNarrowErasCount = 0; - fMonths = nullptr; - fMonthsCount=0; - fShortMonths = nullptr; - fShortMonthsCount=0; - fNarrowMonths = nullptr; - fNarrowMonthsCount=0; - fStandaloneMonths = nullptr; - fStandaloneMonthsCount=0; - fStandaloneShortMonths = nullptr; - fStandaloneShortMonthsCount=0; - fStandaloneNarrowMonths = nullptr; - fStandaloneNarrowMonthsCount=0; - fWeekdays = nullptr; - fWeekdaysCount=0; - fShortWeekdays = nullptr; - fShortWeekdaysCount=0; - fShorterWeekdays = nullptr; - fShorterWeekdaysCount=0; - fNarrowWeekdays = nullptr; - fNarrowWeekdaysCount=0; - fStandaloneWeekdays = nullptr; - fStandaloneWeekdaysCount=0; - fStandaloneShortWeekdays = nullptr; - fStandaloneShortWeekdaysCount=0; - fStandaloneShorterWeekdays = nullptr; - fStandaloneShorterWeekdaysCount=0; - fStandaloneNarrowWeekdays = nullptr; - fStandaloneNarrowWeekdaysCount=0; - fAmPms = nullptr; - fAmPmsCount=0; - fWideAmPms = nullptr; - fWideAmPmsCount=0; - fNarrowAmPms = nullptr; - fNarrowAmPmsCount=0; - fTimeSeparator.setToBogus(); - fQuarters = nullptr; - fQuartersCount = 0; - fShortQuarters = nullptr; - fShortQuartersCount = 0; - fNarrowQuarters = nullptr; - fNarrowQuartersCount = 0; - fStandaloneQuarters = nullptr; - fStandaloneQuartersCount = 0; - fStandaloneShortQuarters = nullptr; - fStandaloneShortQuartersCount = 0; - fStandaloneNarrowQuarters = nullptr; - fStandaloneNarrowQuartersCount = 0; - fLeapMonthPatterns = nullptr; - fLeapMonthPatternsCount = 0; - fShortYearNames = nullptr; - fShortYearNamesCount = 0; - fShortZodiacNames = nullptr; - fShortZodiacNamesCount = 0; - fZoneStringsRowCount = 0; - fZoneStringsColCount = 0; - fZoneStrings = nullptr; - fLocaleZoneStrings = nullptr; - fAbbreviatedDayPeriods = nullptr; - fAbbreviatedDayPeriodsCount = 0; - fWideDayPeriods = nullptr; - fWideDayPeriodsCount = 0; - fNarrowDayPeriods = nullptr; - fNarrowDayPeriodsCount = 0; - fStandaloneAbbreviatedDayPeriods = nullptr; - fStandaloneAbbreviatedDayPeriodsCount = 0; - fStandaloneWideDayPeriods = nullptr; - fStandaloneWideDayPeriodsCount = 0; - fStandaloneNarrowDayPeriods = nullptr; - fStandaloneNarrowDayPeriodsCount = 0; - uprv_memset(fCapitalization, 0, sizeof(fCapitalization)); - - // We need to preserve the requested locale for - // lazy ZoneStringFormat instantiation. ZoneStringFormat - // is region sensitive, thus, bundle locale bundle's locale - // is not sufficient. - fZSFLocale = locale; - - if (U_FAILURE(status)) return; - - // Create a CalendarDataSink to process this data and the resource bundles - CalendarDataSink calendarSink(status); - LocalUResourceBundlePointer rb(ures_open(nullptr, locale.getBaseName(), &status)); - LocalUResourceBundlePointer cb(ures_getByKey(rb.getAlias(), gCalendarTag, nullptr, &status)); - - if (U_FAILURE(status)) return; - - // Iterate over the resource bundle data following the fallbacks through different calendar types - UnicodeString calendarType((type != nullptr && *type != '\0')? type : gGregorianTag, -1, US_INV); - while (!calendarType.isBogus()) { - CharString calendarTypeBuffer; - calendarTypeBuffer.appendInvariantChars(calendarType, status); - if (U_FAILURE(status)) { return; } - const char *calendarTypeCArray = calendarTypeBuffer.data(); - - // Enumerate this calendar type. If the calendar is not found fallback to gregorian - UErrorCode oldStatus = status; - LocalUResourceBundlePointer ctb(ures_getByKeyWithFallback(cb.getAlias(), calendarTypeCArray, nullptr, &status)); - if (status == U_MISSING_RESOURCE_ERROR) { - if (uprv_strcmp(calendarTypeCArray, gGregorianTag) != 0) { - calendarType.setTo(false, kGregorianTagUChar, UPRV_LENGTHOF(kGregorianTagUChar)); - calendarSink.visitAllResources(); - status = oldStatus; - continue; - } - return; - } - - calendarSink.preEnumerate(calendarType); - ures_getAllItemsWithFallback(ctb.getAlias(), "", calendarSink, status); - if (U_FAILURE(status)) break; - - // Stop loading when gregorian was loaded - if (uprv_strcmp(calendarTypeCArray, gGregorianTag) == 0) { - break; - } - - // Get the next calendar type to process from the sink - calendarType = calendarSink.nextCalendarType; - - // Gregorian is always the last fallback - if (calendarType.isBogus()) { - calendarType.setTo(false, kGregorianTagUChar, UPRV_LENGTHOF(kGregorianTagUChar)); - calendarSink.visitAllResources(); - } - } - - // CharString object to build paths - CharString path; - - // Load Leap Month Patterns - UErrorCode tempStatus = status; - fLeapMonthPatterns = newUnicodeStringArray(kMonthPatternsCount); - if (fLeapMonthPatterns) { - initLeapMonthPattern(fLeapMonthPatterns, kLeapMonthPatternFormatWide, calendarSink, - buildResourcePath(path, gMonthPatternsTag, gNamesFormatTag, gNamesWideTag, tempStatus), tempStatus); - initLeapMonthPattern(fLeapMonthPatterns, kLeapMonthPatternFormatAbbrev, calendarSink, - buildResourcePath(path, gMonthPatternsTag, gNamesFormatTag, gNamesAbbrTag, tempStatus), tempStatus); - initLeapMonthPattern(fLeapMonthPatterns, kLeapMonthPatternFormatNarrow, calendarSink, - buildResourcePath(path, gMonthPatternsTag, gNamesFormatTag, gNamesNarrowTag, tempStatus), tempStatus); - initLeapMonthPattern(fLeapMonthPatterns, kLeapMonthPatternStandaloneWide, calendarSink, - buildResourcePath(path, gMonthPatternsTag, gNamesStandaloneTag, gNamesWideTag, tempStatus), tempStatus); - initLeapMonthPattern(fLeapMonthPatterns, kLeapMonthPatternStandaloneAbbrev, calendarSink, - buildResourcePath(path, gMonthPatternsTag, gNamesStandaloneTag, gNamesAbbrTag, tempStatus), tempStatus); - initLeapMonthPattern(fLeapMonthPatterns, kLeapMonthPatternStandaloneNarrow, calendarSink, - buildResourcePath(path, gMonthPatternsTag, gNamesStandaloneTag, gNamesNarrowTag, tempStatus), tempStatus); - initLeapMonthPattern(fLeapMonthPatterns, kLeapMonthPatternNumeric, calendarSink, - buildResourcePath(path, gMonthPatternsTag, gNamesNumericTag, gNamesAllTag, tempStatus), tempStatus); - if (U_SUCCESS(tempStatus)) { - // Hack to fix bad C inheritance for dangi monthPatterns (OK in J); this should be handled by aliases in root, but isn't. - // The ordering of the following statements is important. - if (fLeapMonthPatterns[kLeapMonthPatternFormatAbbrev].isEmpty()) { - fLeapMonthPatterns[kLeapMonthPatternFormatAbbrev].setTo(fLeapMonthPatterns[kLeapMonthPatternFormatWide]); - } - if (fLeapMonthPatterns[kLeapMonthPatternFormatNarrow].isEmpty()) { - fLeapMonthPatterns[kLeapMonthPatternFormatNarrow].setTo(fLeapMonthPatterns[kLeapMonthPatternStandaloneNarrow]); - } - if (fLeapMonthPatterns[kLeapMonthPatternStandaloneWide].isEmpty()) { - fLeapMonthPatterns[kLeapMonthPatternStandaloneWide].setTo(fLeapMonthPatterns[kLeapMonthPatternFormatWide]); - } - if (fLeapMonthPatterns[kLeapMonthPatternStandaloneAbbrev].isEmpty()) { - fLeapMonthPatterns[kLeapMonthPatternStandaloneAbbrev].setTo(fLeapMonthPatterns[kLeapMonthPatternFormatAbbrev]); - } - // end of hack - fLeapMonthPatternsCount = kMonthPatternsCount; - } else { - delete[] fLeapMonthPatterns; - fLeapMonthPatterns = nullptr; - } - } - - // Load cyclic names sets - tempStatus = status; - initField(&fShortYearNames, fShortYearNamesCount, calendarSink, - buildResourcePath(path, gCyclicNameSetsTag, gNameSetYearsTag, gNamesFormatTag, gNamesAbbrTag, tempStatus), tempStatus); - initField(&fShortZodiacNames, fShortZodiacNamesCount, calendarSink, - buildResourcePath(path, gCyclicNameSetsTag, gNameSetZodiacsTag, gNamesFormatTag, gNamesAbbrTag, tempStatus), tempStatus); - - // Load context transforms and capitalization - tempStatus = U_ZERO_ERROR; - LocalUResourceBundlePointer localeBundle(ures_open(nullptr, locale.getName(), &tempStatus)); - if (U_SUCCESS(tempStatus)) { - LocalUResourceBundlePointer contextTransforms(ures_getByKeyWithFallback(localeBundle.getAlias(), gContextTransformsTag, nullptr, &tempStatus)); - if (U_SUCCESS(tempStatus)) { - for (LocalUResourceBundlePointer contextTransformUsage; - contextTransformUsage.adoptInstead(ures_getNextResource(contextTransforms.getAlias(), nullptr, &tempStatus)), - contextTransformUsage.isValid();) { - const int32_t * intVector = ures_getIntVector(contextTransformUsage.getAlias(), &len, &status); - if (U_SUCCESS(tempStatus) && intVector != nullptr && len >= 2) { - const char* usageType = ures_getKey(contextTransformUsage.getAlias()); - if (usageType != nullptr) { - const ContextUsageTypeNameToEnumValue * typeMapPtr = contextUsageTypeMap; - int32_t compResult = 0; - // linear search; list is short and we cannot be sure that bsearch is available - while ( typeMapPtr->usageTypeName != nullptr && (compResult = uprv_strcmp(usageType, typeMapPtr->usageTypeName)) > 0 ) { - ++typeMapPtr; - } - if (typeMapPtr->usageTypeName != nullptr && compResult == 0) { - fCapitalization[typeMapPtr->usageTypeEnumValue][0] = static_cast(intVector[0]); - fCapitalization[typeMapPtr->usageTypeEnumValue][1] = static_cast(intVector[1]); - } - } - } - tempStatus = U_ZERO_ERROR; - } - } - - tempStatus = U_ZERO_ERROR; - const LocalPointer numberingSystem( - NumberingSystem::createInstance(locale, tempStatus), tempStatus); - if (U_SUCCESS(tempStatus)) { - // These functions all fail gracefully if passed nullptr pointers and - // do nothing unless U_SUCCESS(tempStatus), so it's only necessary - // to check for errors once after all calls are made. - const LocalUResourceBundlePointer numberElementsData(ures_getByKeyWithFallback( - localeBundle.getAlias(), gNumberElementsTag, nullptr, &tempStatus)); - const LocalUResourceBundlePointer nsNameData(ures_getByKeyWithFallback( - numberElementsData.getAlias(), numberingSystem->getName(), nullptr, &tempStatus)); - const LocalUResourceBundlePointer symbolsData(ures_getByKeyWithFallback( - nsNameData.getAlias(), gSymbolsTag, nullptr, &tempStatus)); - fTimeSeparator = ures_getUnicodeStringByKey( - symbolsData.getAlias(), gTimeSeparatorTag, &tempStatus); - if (U_FAILURE(tempStatus)) { - fTimeSeparator.setToBogus(); - } - } - - } - - if (fTimeSeparator.isBogus()) { - fTimeSeparator.setTo(DateFormatSymbols::DEFAULT_TIME_SEPARATOR); - } - - // Load day periods - fAbbreviatedDayPeriods = loadDayPeriodStrings(calendarSink, - buildResourcePath(path, gDayPeriodTag, gNamesFormatTag, gNamesAbbrTag, status), - fAbbreviatedDayPeriodsCount, status); - - fWideDayPeriods = loadDayPeriodStrings(calendarSink, - buildResourcePath(path, gDayPeriodTag, gNamesFormatTag, gNamesWideTag, status), - fWideDayPeriodsCount, status); - fNarrowDayPeriods = loadDayPeriodStrings(calendarSink, - buildResourcePath(path, gDayPeriodTag, gNamesFormatTag, gNamesNarrowTag, status), - fNarrowDayPeriodsCount, status); - - fStandaloneAbbreviatedDayPeriods = loadDayPeriodStrings(calendarSink, - buildResourcePath(path, gDayPeriodTag, gNamesStandaloneTag, gNamesAbbrTag, status), - fStandaloneAbbreviatedDayPeriodsCount, status); - - fStandaloneWideDayPeriods = loadDayPeriodStrings(calendarSink, - buildResourcePath(path, gDayPeriodTag, gNamesStandaloneTag, gNamesWideTag, status), - fStandaloneWideDayPeriodsCount, status); - fStandaloneNarrowDayPeriods = loadDayPeriodStrings(calendarSink, - buildResourcePath(path, gDayPeriodTag, gNamesStandaloneTag, gNamesNarrowTag, status), - fStandaloneNarrowDayPeriodsCount, status); - - // Fill in for missing/bogus items (dayPeriods are a map so single items might be missing) - if (U_SUCCESS(status)) { - for (int32_t dpidx = 0; dpidx < fAbbreviatedDayPeriodsCount; ++dpidx) { - if (dpidx < fWideDayPeriodsCount && fWideDayPeriods != nullptr && fWideDayPeriods[dpidx].isBogus()) { - fWideDayPeriods[dpidx].fastCopyFrom(fAbbreviatedDayPeriods[dpidx]); - } - if (dpidx < fNarrowDayPeriodsCount && fNarrowDayPeriods != nullptr && fNarrowDayPeriods[dpidx].isBogus()) { - fNarrowDayPeriods[dpidx].fastCopyFrom(fAbbreviatedDayPeriods[dpidx]); - } - if (dpidx < fStandaloneAbbreviatedDayPeriodsCount && fStandaloneAbbreviatedDayPeriods != nullptr && fStandaloneAbbreviatedDayPeriods[dpidx].isBogus()) { - fStandaloneAbbreviatedDayPeriods[dpidx].fastCopyFrom(fAbbreviatedDayPeriods[dpidx]); - } - if (dpidx < fStandaloneWideDayPeriodsCount && fStandaloneWideDayPeriods != nullptr && fStandaloneWideDayPeriods[dpidx].isBogus()) { - fStandaloneWideDayPeriods[dpidx].fastCopyFrom(fStandaloneAbbreviatedDayPeriods[dpidx]); - } - if (dpidx < fStandaloneNarrowDayPeriodsCount && fStandaloneNarrowDayPeriods != nullptr && fStandaloneNarrowDayPeriods[dpidx].isBogus()) { - fStandaloneNarrowDayPeriods[dpidx].fastCopyFrom(fStandaloneAbbreviatedDayPeriods[dpidx]); - } - } - } - - // if we make it to here, the resource data is cool, and we can get everything out - // of it that we need except for the time-zone and localized-pattern data, which - // are stored in a separate file - validLocale = Locale(ures_getLocaleByType(cb.getAlias(), ULOC_VALID_LOCALE, &status)); - actualLocale = Locale(ures_getLocaleByType(cb.getAlias(), ULOC_ACTUAL_LOCALE, &status)); - - // Era setup - if (type == nullptr) { - type = "gregorian"; - } - LocalPointer eraRules(EraRules::createInstance(type, false, status)); - int32_t maxEra = (U_SUCCESS(status))? eraRules->getMaxEraCode(): 0; - UErrorCode resStatus = U_ZERO_ERROR; - LocalUResourceBundlePointer ctpb(ures_getByKeyWithFallback(cb.getAlias(), type, nullptr, &resStatus)); - LocalUResourceBundlePointer cteb(ures_getByKeyWithFallback(ctpb.getAlias(), gErasTag, nullptr, &resStatus)); - const UResourceBundle *ctebPtr = (U_SUCCESS(resStatus))? cteb.getAlias() : nullptr; - // Load eras - initEras(&fEras, fErasCount, calendarSink, buildResourcePath(path, gErasTag, gNamesAbbrTag, status), - ctebPtr, gNamesAbbrTag, maxEra, status); - UErrorCode oldStatus = status; - initEras(&fEraNames, fEraNamesCount, calendarSink, buildResourcePath(path, gErasTag, gNamesWideTag, status), - ctebPtr, gNamesWideTag, maxEra, status); - if (status == U_MISSING_RESOURCE_ERROR) { // Workaround because eras/wide was omitted from CLDR 1.3 - status = U_ZERO_ERROR; - assignArray(fEraNames, fEraNamesCount, fEras, fErasCount); - } - // current ICU4J falls back to abbreviated if narrow eras are missing, so we will too - oldStatus = status; - initEras(&fNarrowEras, fNarrowErasCount, calendarSink, buildResourcePath(path, gErasTag, gNamesNarrowTag, status), - ctebPtr, gNamesNarrowTag, maxEra, status); - if (status == U_MISSING_RESOURCE_ERROR) { // Workaround because eras/wide was omitted from CLDR 1.3 - status = U_ZERO_ERROR; - assignArray(fNarrowEras, fNarrowErasCount, fEras, fErasCount); - } - - // Load month names - initField(&fMonths, fMonthsCount, calendarSink, - buildResourcePath(path, gMonthNamesTag, gNamesFormatTag, gNamesWideTag, status), status); - initField(&fShortMonths, fShortMonthsCount, calendarSink, - buildResourcePath(path, gMonthNamesTag, gNamesFormatTag, gNamesAbbrTag, status), status); - initField(&fStandaloneMonths, fStandaloneMonthsCount, calendarSink, - buildResourcePath(path, gMonthNamesTag, gNamesStandaloneTag, gNamesWideTag, status), status); - if (status == U_MISSING_RESOURCE_ERROR) { /* If standalone/wide not available, use format/wide */ - status = U_ZERO_ERROR; - assignArray(fStandaloneMonths, fStandaloneMonthsCount, fMonths, fMonthsCount); - } - initField(&fStandaloneShortMonths, fStandaloneShortMonthsCount, calendarSink, - buildResourcePath(path, gMonthNamesTag, gNamesStandaloneTag, gNamesAbbrTag, status), status); - if (status == U_MISSING_RESOURCE_ERROR) { /* If standalone/abbreviated not available, use format/abbreviated */ - status = U_ZERO_ERROR; - assignArray(fStandaloneShortMonths, fStandaloneShortMonthsCount, fShortMonths, fShortMonthsCount); - } - - UErrorCode narrowMonthsEC = status; - UErrorCode standaloneNarrowMonthsEC = status; - initField(&fNarrowMonths, fNarrowMonthsCount, calendarSink, - buildResourcePath(path, gMonthNamesTag, gNamesFormatTag, gNamesNarrowTag, narrowMonthsEC), narrowMonthsEC); - initField(&fStandaloneNarrowMonths, fStandaloneNarrowMonthsCount, calendarSink, - buildResourcePath(path, gMonthNamesTag, gNamesStandaloneTag, gNamesNarrowTag, narrowMonthsEC), standaloneNarrowMonthsEC); - if (narrowMonthsEC == U_MISSING_RESOURCE_ERROR && standaloneNarrowMonthsEC != U_MISSING_RESOURCE_ERROR) { - // If format/narrow not available, use standalone/narrow - assignArray(fNarrowMonths, fNarrowMonthsCount, fStandaloneNarrowMonths, fStandaloneNarrowMonthsCount); - } else if (narrowMonthsEC != U_MISSING_RESOURCE_ERROR && standaloneNarrowMonthsEC == U_MISSING_RESOURCE_ERROR) { - // If standalone/narrow not available, use format/narrow - assignArray(fStandaloneNarrowMonths, fStandaloneNarrowMonthsCount, fNarrowMonths, fNarrowMonthsCount); - } else if (narrowMonthsEC == U_MISSING_RESOURCE_ERROR && standaloneNarrowMonthsEC == U_MISSING_RESOURCE_ERROR) { - // If neither is available, use format/abbreviated - assignArray(fNarrowMonths, fNarrowMonthsCount, fShortMonths, fShortMonthsCount); - assignArray(fStandaloneNarrowMonths, fStandaloneNarrowMonthsCount, fShortMonths, fShortMonthsCount); - } - - // Load AM/PM markers. - ErrorCode ampmStatus; - initField(&fAmPms, fAmPmsCount, calendarSink, - buildResourcePath(path, gAmPmMarkersAbbrTag, ampmStatus), ampmStatus); - if (ampmStatus.isFailure()) { - // No-op: fall back to last-resort names, which are pre-populated - } - ampmStatus.reset(); - initField(&fNarrowAmPms, fNarrowAmPmsCount, calendarSink, - buildResourcePath(path, gAmPmMarkersNarrowTag, ampmStatus), ampmStatus); - if (ampmStatus.isFailure()) { - // Narrow falls back to Abbreviated - assignArray(fNarrowAmPms, fNarrowAmPmsCount, fAmPms, fAmPmsCount); - } - ampmStatus.reset(); - initField(&fWideAmPms, fWideAmPmsCount, calendarSink, - buildResourcePath(path, gAmPmMarkersTag, ampmStatus), ampmStatus); - if (ampmStatus.isFailure()) { - // Wide falls back to Abbreviated - assignArray(fWideAmPms, fWideAmPmsCount, fAmPms, fAmPmsCount); - } - ampmStatus.reset(); - - // Load quarters - initField(&fQuarters, fQuartersCount, calendarSink, - buildResourcePath(path, gQuartersTag, gNamesFormatTag, gNamesWideTag, status), status); - initField(&fShortQuarters, fShortQuartersCount, calendarSink, - buildResourcePath(path, gQuartersTag, gNamesFormatTag, gNamesAbbrTag, status), status); - if(status == U_MISSING_RESOURCE_ERROR) { - status = U_ZERO_ERROR; - assignArray(fShortQuarters, fShortQuartersCount, fQuarters, fQuartersCount); - } - - initField(&fStandaloneQuarters, fStandaloneQuartersCount, calendarSink, - buildResourcePath(path, gQuartersTag, gNamesStandaloneTag, gNamesWideTag, status), status); - if(status == U_MISSING_RESOURCE_ERROR) { - status = U_ZERO_ERROR; - assignArray(fStandaloneQuarters, fStandaloneQuartersCount, fQuarters, fQuartersCount); - } - initField(&fStandaloneShortQuarters, fStandaloneShortQuartersCount, calendarSink, - buildResourcePath(path, gQuartersTag, gNamesStandaloneTag, gNamesAbbrTag, status), status); - if(status == U_MISSING_RESOURCE_ERROR) { - status = U_ZERO_ERROR; - assignArray(fStandaloneShortQuarters, fStandaloneShortQuartersCount, fShortQuarters, fShortQuartersCount); - } - - // unlike the fields above, narrow format quarters fall back on narrow standalone quarters - initField(&fStandaloneNarrowQuarters, fStandaloneNarrowQuartersCount, calendarSink, - buildResourcePath(path, gQuartersTag, gNamesStandaloneTag, gNamesNarrowTag, status), status); - initField(&fNarrowQuarters, fNarrowQuartersCount, calendarSink, - buildResourcePath(path, gQuartersTag, gNamesFormatTag, gNamesNarrowTag, status), status); - if(status == U_MISSING_RESOURCE_ERROR) { - status = U_ZERO_ERROR; - assignArray(fNarrowQuarters, fNarrowQuartersCount, fStandaloneNarrowQuarters, fStandaloneNarrowQuartersCount); - } - - // ICU 3.8 or later version no longer uses localized date-time pattern characters by default (ticket#5597) - /* - // fastCopyFrom()/setTo() - see assignArray comments - resStr = ures_getStringByKey(fResourceBundle, gLocalPatternCharsTag, &len, &status); - fLocalPatternChars.setTo(true, resStr, len); - // If the locale data does not include new pattern chars, use the defaults - // TODO: Consider making this an error, since this may add conflicting characters. - if (len < PATTERN_CHARS_LEN) { - fLocalPatternChars.append(UnicodeString(true, &gPatternChars[len], PATTERN_CHARS_LEN-len)); - } - */ - fLocalPatternChars.setTo(true, gPatternChars, PATTERN_CHARS_LEN); - - // Format wide weekdays -> fWeekdays - // {sfb} fixed to handle 1-based weekdays - initField(&fWeekdays, fWeekdaysCount, calendarSink, - buildResourcePath(path, gDayNamesTag, gNamesFormatTag, gNamesWideTag, status), 1, status); - - // Format abbreviated weekdays -> fShortWeekdays - initField(&fShortWeekdays, fShortWeekdaysCount, calendarSink, - buildResourcePath(path, gDayNamesTag, gNamesFormatTag, gNamesAbbrTag, status), 1, status); - - // Format short weekdays -> fShorterWeekdays (fall back to abbreviated) - initField(&fShorterWeekdays, fShorterWeekdaysCount, calendarSink, - buildResourcePath(path, gDayNamesTag, gNamesFormatTag, gNamesShortTag, status), 1, status); - if (status == U_MISSING_RESOURCE_ERROR) { - status = U_ZERO_ERROR; - assignArray(fShorterWeekdays, fShorterWeekdaysCount, fShortWeekdays, fShortWeekdaysCount); - } - - // Stand-alone wide weekdays -> fStandaloneWeekdays - initField(&fStandaloneWeekdays, fStandaloneWeekdaysCount, calendarSink, - buildResourcePath(path, gDayNamesTag, gNamesStandaloneTag, gNamesWideTag, status), 1, status); - if (status == U_MISSING_RESOURCE_ERROR) { /* If standalone/wide is not available, use format/wide */ - status = U_ZERO_ERROR; - assignArray(fStandaloneWeekdays, fStandaloneWeekdaysCount, fWeekdays, fWeekdaysCount); - } - - // Stand-alone abbreviated weekdays -> fStandaloneShortWeekdays - initField(&fStandaloneShortWeekdays, fStandaloneShortWeekdaysCount, calendarSink, - buildResourcePath(path, gDayNamesTag, gNamesStandaloneTag, gNamesAbbrTag, status), 1, status); - if (status == U_MISSING_RESOURCE_ERROR) { /* If standalone/abbreviated is not available, use format/abbreviated */ - status = U_ZERO_ERROR; - assignArray(fStandaloneShortWeekdays, fStandaloneShortWeekdaysCount, fShortWeekdays, fShortWeekdaysCount); - } - - // Stand-alone short weekdays -> fStandaloneShorterWeekdays (fall back to format abbreviated) - initField(&fStandaloneShorterWeekdays, fStandaloneShorterWeekdaysCount, calendarSink, - buildResourcePath(path, gDayNamesTag, gNamesStandaloneTag, gNamesShortTag, status), 1, status); - if (status == U_MISSING_RESOURCE_ERROR) { /* If standalone/short is not available, use format/short */ - status = U_ZERO_ERROR; - assignArray(fStandaloneShorterWeekdays, fStandaloneShorterWeekdaysCount, fShorterWeekdays, fShorterWeekdaysCount); - } - - // Format narrow weekdays -> fNarrowWeekdays - UErrorCode narrowWeeksEC = status; - initField(&fNarrowWeekdays, fNarrowWeekdaysCount, calendarSink, - buildResourcePath(path, gDayNamesTag, gNamesFormatTag, gNamesNarrowTag, status), 1, narrowWeeksEC); - // Stand-alone narrow weekdays -> fStandaloneNarrowWeekdays - UErrorCode standaloneNarrowWeeksEC = status; - initField(&fStandaloneNarrowWeekdays, fStandaloneNarrowWeekdaysCount, calendarSink, - buildResourcePath(path, gDayNamesTag, gNamesStandaloneTag, gNamesNarrowTag, status), 1, standaloneNarrowWeeksEC); - - if (narrowWeeksEC == U_MISSING_RESOURCE_ERROR && standaloneNarrowWeeksEC != U_MISSING_RESOURCE_ERROR) { - // If format/narrow not available, use standalone/narrow - assignArray(fNarrowWeekdays, fNarrowWeekdaysCount, fStandaloneNarrowWeekdays, fStandaloneNarrowWeekdaysCount); - } else if (narrowWeeksEC != U_MISSING_RESOURCE_ERROR && standaloneNarrowWeeksEC == U_MISSING_RESOURCE_ERROR) { - // If standalone/narrow not available, use format/narrow - assignArray(fStandaloneNarrowWeekdays, fStandaloneNarrowWeekdaysCount, fNarrowWeekdays, fNarrowWeekdaysCount); - } else if (narrowWeeksEC == U_MISSING_RESOURCE_ERROR && standaloneNarrowWeeksEC == U_MISSING_RESOURCE_ERROR ) { - // If neither is available, use format/abbreviated - assignArray(fNarrowWeekdays, fNarrowWeekdaysCount, fShortWeekdays, fShortWeekdaysCount); - assignArray(fStandaloneNarrowWeekdays, fStandaloneNarrowWeekdaysCount, fShortWeekdays, fShortWeekdaysCount); - } - - // Last resort fallback in case previous data wasn't loaded - if (U_FAILURE(status)) - { - if (useLastResortData) - { - // Handle the case in which there is no resource data present. - // We don't have to generate usable patterns in this situation; - // we just need to produce something that will be semi-intelligible - // in most locales. - - status = U_USING_FALLBACK_WARNING; - //TODO(fabalbon): make sure we are storing las resort data for all fields in here. - initField(&fEras, fErasCount, reinterpret_cast(gLastResortEras), kEraNum, kEraLen, status); - initField(&fEraNames, fEraNamesCount, reinterpret_cast(gLastResortEras), kEraNum, kEraLen, status); - initField(&fNarrowEras, fNarrowErasCount, reinterpret_cast(gLastResortEras), kEraNum, kEraLen, status); - initField(&fMonths, fMonthsCount, reinterpret_cast(gLastResortMonthNames), kMonthNum, kMonthLen, status); - initField(&fShortMonths, fShortMonthsCount, reinterpret_cast(gLastResortMonthNames), kMonthNum, kMonthLen, status); - initField(&fNarrowMonths, fNarrowMonthsCount, reinterpret_cast(gLastResortMonthNames), kMonthNum, kMonthLen, status); - initField(&fStandaloneMonths, fStandaloneMonthsCount, reinterpret_cast(gLastResortMonthNames), kMonthNum, kMonthLen, status); - initField(&fStandaloneShortMonths, fStandaloneShortMonthsCount, reinterpret_cast(gLastResortMonthNames), kMonthNum, kMonthLen, status); - initField(&fStandaloneNarrowMonths, fStandaloneNarrowMonthsCount, reinterpret_cast(gLastResortMonthNames), kMonthNum, kMonthLen, status); - initField(&fWeekdays, fWeekdaysCount, reinterpret_cast(gLastResortDayNames), kDayNum, kDayLen, status); - initField(&fShortWeekdays, fShortWeekdaysCount, reinterpret_cast(gLastResortDayNames), kDayNum, kDayLen, status); - initField(&fShorterWeekdays, fShorterWeekdaysCount, reinterpret_cast(gLastResortDayNames), kDayNum, kDayLen, status); - initField(&fNarrowWeekdays, fNarrowWeekdaysCount, reinterpret_cast(gLastResortDayNames), kDayNum, kDayLen, status); - initField(&fStandaloneWeekdays, fStandaloneWeekdaysCount, reinterpret_cast(gLastResortDayNames), kDayNum, kDayLen, status); - initField(&fStandaloneShortWeekdays, fStandaloneShortWeekdaysCount, reinterpret_cast(gLastResortDayNames), kDayNum, kDayLen, status); - initField(&fStandaloneShorterWeekdays, fStandaloneShorterWeekdaysCount, reinterpret_cast(gLastResortDayNames), kDayNum, kDayLen, status); - initField(&fStandaloneNarrowWeekdays, fStandaloneNarrowWeekdaysCount, reinterpret_cast(gLastResortDayNames), kDayNum, kDayLen, status); - initField(&fAmPms, fAmPmsCount, reinterpret_cast(gLastResortAmPmMarkers), kAmPmNum, kAmPmLen, status); - initField(&fNarrowAmPms, fNarrowAmPmsCount, reinterpret_cast(gLastResortAmPmMarkers), kAmPmNum, kAmPmLen, status); - initField(&fQuarters, fQuartersCount, reinterpret_cast(gLastResortQuarters), kQuarterNum, kQuarterLen, status); - initField(&fShortQuarters, fShortQuartersCount, reinterpret_cast(gLastResortQuarters), kQuarterNum, kQuarterLen, status); - initField(&fNarrowQuarters, fNarrowQuartersCount, reinterpret_cast(gLastResortQuarters), kQuarterNum, kQuarterLen, status); - initField(&fStandaloneQuarters, fStandaloneQuartersCount, reinterpret_cast(gLastResortQuarters), kQuarterNum, kQuarterLen, status); - initField(&fStandaloneShortQuarters, fStandaloneShortQuartersCount, reinterpret_cast(gLastResortQuarters), kQuarterNum, kQuarterLen, status); - initField(&fStandaloneNarrowQuarters, fStandaloneNarrowQuartersCount, reinterpret_cast(gLastResortQuarters), kQuarterNum, kQuarterLen, status); - fLocalPatternChars.setTo(true, gPatternChars, PATTERN_CHARS_LEN); - } - } -} - -Locale -DateFormatSymbols::getLocale(ULocDataLocaleType type, UErrorCode& status) const { - return LocaleBased::getLocale(validLocale, actualLocale, type, status); -} - -U_NAMESPACE_END - -#endif /* #if !UCONFIG_NO_FORMATTING */ - -//eof diff --git a/tools/icu/shrink-icu-src.py b/tools/icu/shrink-icu-src.py deleted file mode 100755 index b390778626b..00000000000 --- a/tools/icu/shrink-icu-src.py +++ /dev/null @@ -1,139 +0,0 @@ -#!/usr/bin/env python -from __future__ import print_function -import optparse -import os -import re -import sys -import shutil -import bz2 - -parser = optparse.OptionParser() - -parser.add_option('--icudst', - action='store', - dest='icudst', - default='deps/icu-small', - help='path to target ICU directory. Will be deleted.') - -parser.add_option('--icu-src', - action='store', - dest='icusrc', - default='deps/icu', - help='path to source ICU directory.') - -parser.add_option('--icutmp', - action='store', - dest='icutmp', - default='out/Release/obj/gen/icutmp', - help='path to icutmp dir.') - -(options, args) = parser.parse_args() - -if os.path.isdir(options.icudst): - print('Deleting existing icudst %s' % (options.icudst)) - shutil.rmtree(options.icudst) - -if not os.path.isdir(options.icusrc): - print('Missing source ICU dir --icusrc=%s' % (options.icusrc)) - sys.exit(1) - -# compression stuff. Keep the suffix and the compression function in sync. -compression_suffix = '.bz2' -def compress_data(infp, outfp): - with open(infp, 'rb') as inf: - with bz2.BZ2File(outfp, 'wb') as outf: - shutil.copyfileobj(inf, outf) - -def print_size(fn): - size = (os.stat(fn).st_size) / 1024000 - print('%dM\t%s' % (size, fn)) - -ignore_regex = re.compile(r'^.*\.(vcxproj|filters|nrm|icu|dat|xml|txt|ac|guess|m4|in|sub|py|mak)$') - -def icu_ignore(dir, files): - subdir = dir[len(options.icusrc)+1::] - ign = [] - if len(subdir) == 0: - # remove all files at root level - ign = ign + files - # except... - ign.remove('source') - if 'LICENSE' in ign: - ign.remove('LICENSE') - # license.html will be removed (it's obviated by LICENSE) - elif 'license.html' in ign: - ign.remove('license.html') - elif subdir == 'source': - ign = ign + ['layout','samples','test','extra','config','layoutex','allinone','data'] - ign = ign + ['runConfigureICU','install-sh','mkinstalldirs','configure'] - ign = ign + ['io'] - elif subdir == 'source/tools': - ign = ign + ['tzcode','ctestfw','gensprep','gennorm2','gendict','icuswap', - 'genbrk','gencfu','gencolusb','genren','memcheck','makeconv','gencnval','icuinfo','gentest'] - ign = ign + ['.DS_Store', 'Makefile', 'Makefile.in'] - - for file in files: - if ignore_regex.match(file): - ign = ign + [file] - - # print '>%s< [%s]' % (subdir, ign) - return ign - -# copied from configure -def icu_info(icu_full_path): - uvernum_h = os.path.join(icu_full_path, 'source/common/unicode/uvernum.h') - if not os.path.isfile(uvernum_h): - print(' Error: could not load %s - is ICU installed?' % uvernum_h) - sys.exit(1) - icu_ver_major = None - matchVerExp = r'^\s*#define\s+U_ICU_VERSION_SHORT\s+"([^"]*)".*' - match_version = re.compile(matchVerExp) - for line in open(uvernum_h).readlines(): - m = match_version.match(line) - if m: - icu_ver_major = m.group(1) - if not icu_ver_major: - print(' Could not read U_ICU_VERSION_SHORT version from %s' % uvernum_h) - sys.exit(1) - icu_endianness = sys.byteorder[0] # TODO(srl295): EBCDIC should be 'e' - return (icu_ver_major, icu_endianness) - -(icu_ver_major, icu_endianness) = icu_info(options.icusrc) -print("Data file root: icudt%s%s" % (icu_ver_major, icu_endianness)) -dst_datafile = os.path.join(options.icudst, "source","data","in", "icudt%s%s.dat" % (icu_ver_major, icu_endianness)) - -src_datafile = os.path.join(options.icusrc, "source/data/in/icudt%sl.dat" % (icu_ver_major)) -dst_cmp_datafile = "%s%s" % (dst_datafile, compression_suffix) - -if not os.path.isfile(src_datafile): - print("Error: icu data file not found: %s" % src_datafile) - exit(1) - -print("will use datafile %s" % (src_datafile)) - -print('%s --> %s' % (options.icusrc, options.icudst)) -shutil.copytree(options.icusrc, options.icudst, ignore=icu_ignore) - -# now, make the data dir (since we ignored it) -icudst_data = os.path.join(options.icudst, "source", "data") -icudst_in = os.path.join(icudst_data, "in") -os.mkdir(icudst_data) -os.mkdir(icudst_in) - -print_size(src_datafile) - -print('%s --compress-> %s' % (src_datafile, dst_cmp_datafile)) -compress_data(src_datafile, dst_cmp_datafile) -print_size(dst_cmp_datafile) -readme_name = os.path.join(options.icudst, "README-FULL-ICU.txt" ) - -# Now, print a short notice -msg_fmt = """\ -ICU sources - auto generated by shrink-icu-src.py\n -This directory contains the ICU subset used by --with-intl=full-icu -It is a strict subset of ICU {} source files with the following exception(s): -* {} : compressed data file\n\n -To rebuild this directory, see ../../tools/icu/README.md\n""" - -with open(readme_name, 'w') as out_file: - print(msg_fmt.format(icu_ver_major, dst_cmp_datafile), file=out_file) diff --git a/tools/icu/update-test-data.mjs b/tools/icu/update-test-data.mjs deleted file mode 100644 index fae784b07e9..00000000000 --- a/tools/icu/update-test-data.mjs +++ /dev/null @@ -1,81 +0,0 @@ -/* - * This script updates the `test/fixtures/icu/localizationData.json` data - * used by `test/parallel/test-icu-env.js` test. - * Run this script after an ICU update if locale-specific output changes are - * causing the test to fail. - * Typically, only a few strings change with each ICU update. If this script - * suddenly generates identical values for all locales, it indicates a bug. - * Note that Node.js must be built with either `--with-intl=full-icu` after - * updating ICU, or with `--with-intl=system-icu` if system version matches. - * Wrong version or small-icu might produce wrong values. - * Manually editing the json file is fine, too. - */ - -import { execFileSync } from 'node:child_process'; -import { writeFileSync } from 'node:fs'; - -const locales = [ - 'en', 'zh', 'hi', 'es', - 'fr', 'ar', 'bn', 'ru', - 'pt', 'ur', 'id', 'de', - 'ja', 'pcm', 'mr', 'te', -]; - -const outputFilePath = new URL(`../../test/fixtures/icu/localizationData-v${process.versions.icu}.json`, import.meta.url); - -const runEnvCommand = (envVars, code) => - execFileSync( - process.execPath, - ['-e', `process.stdout.write(String(${code}));`], - { env: { ...process.env, ...envVars }, encoding: 'utf8' }, - ); - -// Generate the localization data for all locales -const localizationData = locales.reduce((acc, locale) => { - acc.dateStrings[locale] = runEnvCommand( - { LANG: locale, TZ: 'Europe/Zurich' }, - `new Date(333333333333).toString()`, - ); - - acc.dateTimeFormats[locale] = runEnvCommand( - { LANG: locale, TZ: 'Europe/Zurich' }, - `new Date(333333333333).toLocaleString()`, - ); - - acc.dateFormats[locale] = runEnvCommand( - { LANG: locale, TZ: 'Europe/Zurich' }, - `new Intl.DateTimeFormat().format(333333333333)`, - ); - - acc.displayNames[locale] = runEnvCommand( - { LANG: locale }, - `new Intl.DisplayNames(undefined, { type: "region" }).of("CH")`, - ); - - acc.numberFormats[locale] = runEnvCommand( - { LANG: locale }, - `new Intl.NumberFormat().format(275760.913)`, - ); - - acc.pluralRules[locale] = runEnvCommand( - { LANG: locale }, - `new Intl.PluralRules().select(0)`, - ); - - acc.relativeTime[locale] = runEnvCommand( - { LANG: locale }, - `new Intl.RelativeTimeFormat().format(-586920.617, "hour")`, - ); - - return acc; -}, { - dateStrings: {}, - dateTimeFormats: {}, - dateFormats: {}, - displayNames: {}, - numberFormats: {}, - pluralRules: {}, - relativeTime: {}, -}); - -writeFileSync(outputFilePath, JSON.stringify(localizationData, null, 2) + '\n'); diff --git a/tools/inspector_protocol/README.md b/tools/inspector_protocol/README.md deleted file mode 100644 index 1d2a0465d53..00000000000 --- a/tools/inspector_protocol/README.md +++ /dev/null @@ -1,37 +0,0 @@ -# Chromium inspector (devtools) protocol - -This directory contains scripts to update the [Chromium `inspector_protocol`][] -to local at `deps/inspector_protocol`. - -To run the `roll.py`, a local clone of the `inspector_protocol` project is required. -First, you will need to install Chromium's [`depot_tools`][], with `fetch` available -in your `PATH`. - -```console -$ cd workspace -/workspace $ mkdir inspector_protocol -/workspace/inspector_protocol $ fetch inspector_protocol -# This will create a `src` directory in the current path. - -# To update local clone. -/workspace/inspector_protocol $ cd src -/workspace/inspector_protocol/src $ git checkout main && git pull -``` - -With a local clone of the `inspector_protocol` project up to date, run the following -commands to roll the dep. - -```console -$ cd workspace/node -/workspace/node $ python tools/inspector_protocol/roll.py \ - --ip_src_upstream /workspace/inspector_protocol/src \ - --node_src_downstream /workspace/node \ - --force - # Add --force when you decided to take the update. -``` - -The `roll.py` requires the node repository to be a clean state (no unstaged changes) -to avoid unexpected overrides. - -[`depot_tools`]: https://commondatastorage.googleapis.com/chrome-infra-docs/flat/depot_tools/docs/html/depot_tools_tutorial.html#_setting_up -[Chromium `inspector_protocol`]: https://chromium.googlesource.com/deps/inspector_protocol/ diff --git a/tools/inspector_protocol/jinja2/AUTHORS b/tools/inspector_protocol/jinja2/AUTHORS deleted file mode 100644 index fd6dbfcbfd8..00000000000 --- a/tools/inspector_protocol/jinja2/AUTHORS +++ /dev/null @@ -1,34 +0,0 @@ -Jinja is written and maintained by the Jinja Team and various -contributors: - -Lead Developer: - -- Armin Ronacher - -Developers: - -- Christoph Hack -- Georg Brandl - -Contributors: - -- Bryan McLemore -- Mickaël Guérin -- Cameron Knight -- Lawrence Journal-World. -- David Cramer -- Adrian Mönnich (ThiefMaster) - -Patches and suggestions: - -- Ronny Pfannschmidt -- Axel Böhm -- Alexey Melchakov -- Bryan McLemore -- Clovis Fabricio (nosklo) -- Cameron Knight -- Peter van Dijk (Habbie) -- Stefan Ebner -- Rene Leonhardt -- Thomas Waldmann -- Cory Benfield (Lukasa) diff --git a/tools/inspector_protocol/jinja2/Jinja2-2.10.tar.gz.md5 b/tools/inspector_protocol/jinja2/Jinja2-2.10.tar.gz.md5 deleted file mode 100644 index 9137ee129a0..00000000000 --- a/tools/inspector_protocol/jinja2/Jinja2-2.10.tar.gz.md5 +++ /dev/null @@ -1 +0,0 @@ -61ef1117f945486472850819b8d1eb3d Jinja2-2.10.tar.gz diff --git a/tools/inspector_protocol/jinja2/Jinja2-2.10.tar.gz.sha512 b/tools/inspector_protocol/jinja2/Jinja2-2.10.tar.gz.sha512 deleted file mode 100644 index 087d24c18eb..00000000000 --- a/tools/inspector_protocol/jinja2/Jinja2-2.10.tar.gz.sha512 +++ /dev/null @@ -1 +0,0 @@ -0ea7371be67ffcf19e46dfd06523a45a0806e678a407d54f5f2f3e573982f0959cf82ec5d07b203670309928a62ef71109701ab16547a9bba2ebcdc178cb67f2 Jinja2-2.10.tar.gz diff --git a/tools/inspector_protocol/jinja2/LICENSE b/tools/inspector_protocol/jinja2/LICENSE deleted file mode 100644 index 31bf900e58e..00000000000 --- a/tools/inspector_protocol/jinja2/LICENSE +++ /dev/null @@ -1,31 +0,0 @@ -Copyright (c) 2009 by the Jinja Team, see AUTHORS for more details. - -Some rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - - * The names of the contributors may not be used to endorse or - promote products derived from this software without specific - prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/tools/inspector_protocol/jinja2/OWNERS b/tools/inspector_protocol/jinja2/OWNERS deleted file mode 100644 index ee2bec9ba3a..00000000000 --- a/tools/inspector_protocol/jinja2/OWNERS +++ /dev/null @@ -1,6 +0,0 @@ -timloh@chromium.org -haraken@chromium.org -nbarth@chromium.org - -# TEAM: platform-architecture-dev@chromium.org -# COMPONENT: Blink>Internals diff --git a/tools/inspector_protocol/jinja2/README.chromium b/tools/inspector_protocol/jinja2/README.chromium deleted file mode 100644 index 5246c2f84b6..00000000000 --- a/tools/inspector_protocol/jinja2/README.chromium +++ /dev/null @@ -1,26 +0,0 @@ -Name: Jinja2 Python Template Engine -Short Name: jinja2 -URL: http://jinja.pocoo.org/ -Version: 2.10 -License: BSD 3-Clause -License File: LICENSE -Security Critical: no - -Description: -Template engine for code generation in Blink. - -Source: https://pypi.python.org/packages/56/e6/332789f295cf22308386cf5bbd1f4e00ed11484299c5d7383378cf48ba47/Jinja2-2.10.tar.gz -MD5: 61ef1117f945486472850819b8d1eb3d -SHA-1: 34b69e5caab12ee37b9df69df9018776c008b7b8 - -Local Modifications: -This only includes the jinja2 directory from the tarball and the LICENSE and -AUTHORS files. Unit tests (testsuite directory) have been removed. -Additional chromium-specific files are: -* README.chromium (this file) -* OWNERS -* get_jinja2.sh (install script) -* jinja2.gni (generated by get_jinja2.sh) -* files of hashes (MD5 is also posted on website, SHA-512 computed locally). -Script checks hash then unpacks archive and installs desired files. -Retrieve or update by executing jinja2/get_jinja2.sh from third_party. diff --git a/tools/inspector_protocol/jinja2/__init__.py b/tools/inspector_protocol/jinja2/__init__.py deleted file mode 100644 index 42aa763d571..00000000000 --- a/tools/inspector_protocol/jinja2/__init__.py +++ /dev/null @@ -1,83 +0,0 @@ -# -*- coding: utf-8 -*- -""" - jinja2 - ~~~~~~ - - Jinja2 is a template engine written in pure Python. It provides a - Django inspired non-XML syntax but supports inline expressions and - an optional sandboxed environment. - - Nutshell - -------- - - Here a small example of a Jinja2 template:: - - {% extends 'base.html' %} - {% block title %}Memberlist{% endblock %} - {% block content %} -
- {% endblock %} - - - :copyright: (c) 2017 by the Jinja Team. - :license: BSD, see LICENSE for more details. -""" -__docformat__ = 'restructuredtext en' -__version__ = '2.10' - -# high level interface -from jinja2.environment import Environment, Template - -# loaders -from jinja2.loaders import BaseLoader, FileSystemLoader, PackageLoader, \ - DictLoader, FunctionLoader, PrefixLoader, ChoiceLoader, \ - ModuleLoader - -# bytecode caches -from jinja2.bccache import BytecodeCache, FileSystemBytecodeCache, \ - MemcachedBytecodeCache - -# undefined types -from jinja2.runtime import Undefined, DebugUndefined, StrictUndefined, \ - make_logging_undefined - -# exceptions -from jinja2.exceptions import TemplateError, UndefinedError, \ - TemplateNotFound, TemplatesNotFound, TemplateSyntaxError, \ - TemplateAssertionError, TemplateRuntimeError - -# decorators and public utilities -from jinja2.filters import environmentfilter, contextfilter, \ - evalcontextfilter -from jinja2.utils import Markup, escape, clear_caches, \ - environmentfunction, evalcontextfunction, contextfunction, \ - is_undefined, select_autoescape - -__all__ = [ - 'Environment', 'Template', 'BaseLoader', 'FileSystemLoader', - 'PackageLoader', 'DictLoader', 'FunctionLoader', 'PrefixLoader', - 'ChoiceLoader', 'BytecodeCache', 'FileSystemBytecodeCache', - 'MemcachedBytecodeCache', 'Undefined', 'DebugUndefined', - 'StrictUndefined', 'TemplateError', 'UndefinedError', 'TemplateNotFound', - 'TemplatesNotFound', 'TemplateSyntaxError', 'TemplateAssertionError', - 'TemplateRuntimeError', - 'ModuleLoader', 'environmentfilter', 'contextfilter', 'Markup', 'escape', - 'environmentfunction', 'contextfunction', 'clear_caches', 'is_undefined', - 'evalcontextfilter', 'evalcontextfunction', 'make_logging_undefined', - 'select_autoescape', -] - - -def _patch_async(): - from jinja2.utils import have_async_gen - if have_async_gen: - from jinja2.asyncsupport import patch_all - patch_all() - - -_patch_async() -del _patch_async diff --git a/tools/inspector_protocol/jinja2/_compat.py b/tools/inspector_protocol/jinja2/_compat.py deleted file mode 100644 index 61d85301a4a..00000000000 --- a/tools/inspector_protocol/jinja2/_compat.py +++ /dev/null @@ -1,99 +0,0 @@ -# -*- coding: utf-8 -*- -""" - jinja2._compat - ~~~~~~~~~~~~~~ - - Some py2/py3 compatibility support based on a stripped down - version of six so we don't have to depend on a specific version - of it. - - :copyright: Copyright 2013 by the Jinja team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" -import sys - -PY2 = sys.version_info[0] == 2 -PYPY = hasattr(sys, 'pypy_translation_info') -_identity = lambda x: x - - -if not PY2: - unichr = chr - range_type = range - text_type = str - string_types = (str,) - integer_types = (int,) - - iterkeys = lambda d: iter(d.keys()) - itervalues = lambda d: iter(d.values()) - iteritems = lambda d: iter(d.items()) - - import pickle - from io import BytesIO, StringIO - NativeStringIO = StringIO - - def reraise(tp, value, tb=None): - if value.__traceback__ is not tb: - raise value.with_traceback(tb) - raise value - - ifilter = filter - imap = map - izip = zip - intern = sys.intern - - implements_iterator = _identity - implements_to_string = _identity - encode_filename = _identity - -else: - unichr = unichr - text_type = unicode - range_type = xrange - string_types = (str, unicode) - integer_types = (int, long) - - iterkeys = lambda d: d.iterkeys() - itervalues = lambda d: d.itervalues() - iteritems = lambda d: d.iteritems() - - import cPickle as pickle - from cStringIO import StringIO as BytesIO, StringIO - NativeStringIO = BytesIO - - exec('def reraise(tp, value, tb=None):\n raise tp, value, tb') - - from itertools import imap, izip, ifilter - intern = intern - - def implements_iterator(cls): - cls.next = cls.__next__ - del cls.__next__ - return cls - - def implements_to_string(cls): - cls.__unicode__ = cls.__str__ - cls.__str__ = lambda x: x.__unicode__().encode('utf-8') - return cls - - def encode_filename(filename): - if isinstance(filename, unicode): - return filename.encode('utf-8') - return filename - - -def with_metaclass(meta, *bases): - """Create a base class with a metaclass.""" - # This requires a bit of explanation: the basic idea is to make a - # dummy metaclass for one level of class instantiation that replaces - # itself with the actual metaclass. - class metaclass(type): - def __new__(cls, name, this_bases, d): - return meta(name, bases, d) - return type.__new__(metaclass, 'temporary_class', (), {}) - - -try: - from urllib.parse import quote_from_bytes as url_quote -except ImportError: - from urllib import quote as url_quote diff --git a/tools/inspector_protocol/jinja2/_identifier.py b/tools/inspector_protocol/jinja2/_identifier.py deleted file mode 100644 index 2eac35d5c35..00000000000 --- a/tools/inspector_protocol/jinja2/_identifier.py +++ /dev/null @@ -1,2 +0,0 @@ -# generated by scripts/generate_identifier_pattern.py -pattern = '·̀-ͯ·҃-֑҇-ׇֽֿׁׂׅׄؐ-ًؚ-ٰٟۖ-ۜ۟-۪ۤۧۨ-ܑۭܰ-݊ަ-ް߫-߳ࠖ-࠙ࠛ-ࠣࠥ-ࠧࠩ-࡙࠭-࡛ࣔ-ࣣ࣡-ःऺ-़ा-ॏ॑-ॗॢॣঁ-ঃ়া-ৄেৈো-্ৗৢৣਁ-ਃ਼ਾ-ੂੇੈੋ-੍ੑੰੱੵઁ-ઃ઼ા-ૅે-ૉો-્ૢૣଁ-ଃ଼ା-ୄେୈୋ-୍ୖୗୢୣஂா-ூெ-ைொ-்ௗఀ-ఃా-ౄె-ైొ-్ౕౖౢౣಁ-ಃ಼ಾ-ೄೆ-ೈೊ-್ೕೖೢೣഁ-ഃാ-ൄെ-ൈൊ-്ൗൢൣංඃ්ා-ුූෘ-ෟෲෳัิ-ฺ็-๎ັິ-ູົຼ່-ໍ༹༘༙༵༷༾༿ཱ-྄྆྇ྍ-ྗྙ-ྼ࿆ါ-ှၖ-ၙၞ-ၠၢ-ၤၧ-ၭၱ-ၴႂ-ႍႏႚ-ႝ፝-፟ᜒ-᜔ᜲ-᜴ᝒᝓᝲᝳ឴-៓៝᠋-᠍ᢅᢆᢩᤠ-ᤫᤰ-᤻ᨗ-ᨛᩕ-ᩞ᩠-᩿᩼᪰-᪽ᬀ-ᬄ᬴-᭄᭫-᭳ᮀ-ᮂᮡ-ᮭ᯦-᯳ᰤ-᰷᳐-᳔᳒-᳨᳭ᳲ-᳴᳸᳹᷀-᷵᷻-᷿‿⁀⁔⃐-⃥⃜⃡-⃰℘℮⳯-⵿⳱ⷠ-〪ⷿ-゙゚〯꙯ꙴ-꙽ꚞꚟ꛰꛱ꠂ꠆ꠋꠣ-ꠧꢀꢁꢴ-ꣅ꣠-꣱ꤦ-꤭ꥇ-꥓ꦀ-ꦃ꦳-꧀ꧥꨩ-ꨶꩃꩌꩍꩻ-ꩽꪰꪲ-ꪴꪷꪸꪾ꪿꫁ꫫ-ꫯꫵ꫶ꯣ-ꯪ꯬꯭ﬞ︀-️︠-︯︳︴﹍-﹏_𐇽𐋠𐍶-𐍺𐨁-𐨃𐨅𐨆𐨌-𐨏𐨸-𐨿𐨺𐫦𐫥𑀀-𑀂𑀸-𑁆𑁿-𑂂𑂰-𑂺𑄀-𑄂𑄧-𑅳𑄴𑆀-𑆂𑆳-𑇊𑇀-𑇌𑈬-𑈷𑈾𑋟-𑋪𑌀-𑌃𑌼𑌾-𑍄𑍇𑍈𑍋-𑍍𑍗𑍢𑍣𑍦-𑍬𑍰-𑍴𑐵-𑑆𑒰-𑓃𑖯-𑖵𑖸-𑗀𑗜𑗝𑘰-𑙀𑚫-𑚷𑜝-𑜫𑰯-𑰶𑰸-𑰿𑲒-𑲧𑲩-𑲶𖫰-𖫴𖬰-𖬶𖽑-𖽾𖾏-𖾒𛲝𛲞𝅥-𝅩𝅭-𝅲𝅻-𝆂𝆅-𝆋𝆪-𝆭𝉂-𝉄𝨀-𝨶𝨻-𝩬𝩵𝪄𝪛-𝪟𝪡-𝪯𞀀-𞀆𞀈-𞀘𞀛-𞀡𞀣𞀤𞀦-𞣐𞀪-𞣖𞥄-𞥊󠄀-󠇯' diff --git a/tools/inspector_protocol/jinja2/asyncfilters.py b/tools/inspector_protocol/jinja2/asyncfilters.py deleted file mode 100644 index 5c1f46d7fa7..00000000000 --- a/tools/inspector_protocol/jinja2/asyncfilters.py +++ /dev/null @@ -1,146 +0,0 @@ -from functools import wraps - -from jinja2.asyncsupport import auto_aiter -from jinja2 import filters - - -async def auto_to_seq(value): - seq = [] - if hasattr(value, '__aiter__'): - async for item in value: - seq.append(item) - else: - for item in value: - seq.append(item) - return seq - - -async def async_select_or_reject(args, kwargs, modfunc, lookup_attr): - seq, func = filters.prepare_select_or_reject( - args, kwargs, modfunc, lookup_attr) - if seq: - async for item in auto_aiter(seq): - if func(item): - yield item - - -def dualfilter(normal_filter, async_filter): - wrap_evalctx = False - if getattr(normal_filter, 'environmentfilter', False): - is_async = lambda args: args[0].is_async - wrap_evalctx = False - else: - if not getattr(normal_filter, 'evalcontextfilter', False) and \ - not getattr(normal_filter, 'contextfilter', False): - wrap_evalctx = True - is_async = lambda args: args[0].environment.is_async - - @wraps(normal_filter) - def wrapper(*args, **kwargs): - b = is_async(args) - if wrap_evalctx: - args = args[1:] - if b: - return async_filter(*args, **kwargs) - return normal_filter(*args, **kwargs) - - if wrap_evalctx: - wrapper.evalcontextfilter = True - - wrapper.asyncfiltervariant = True - - return wrapper - - -def asyncfiltervariant(original): - def decorator(f): - return dualfilter(original, f) - return decorator - - -@asyncfiltervariant(filters.do_first) -async def do_first(environment, seq): - try: - return await auto_aiter(seq).__anext__() - except StopAsyncIteration: - return environment.undefined('No first item, sequence was empty.') - - -@asyncfiltervariant(filters.do_groupby) -async def do_groupby(environment, value, attribute): - expr = filters.make_attrgetter(environment, attribute) - return [filters._GroupTuple(key, await auto_to_seq(values)) - for key, values in filters.groupby(sorted( - await auto_to_seq(value), key=expr), expr)] - - -@asyncfiltervariant(filters.do_join) -async def do_join(eval_ctx, value, d=u'', attribute=None): - return filters.do_join(eval_ctx, await auto_to_seq(value), d, attribute) - - -@asyncfiltervariant(filters.do_list) -async def do_list(value): - return await auto_to_seq(value) - - -@asyncfiltervariant(filters.do_reject) -async def do_reject(*args, **kwargs): - return async_select_or_reject(args, kwargs, lambda x: not x, False) - - -@asyncfiltervariant(filters.do_rejectattr) -async def do_rejectattr(*args, **kwargs): - return async_select_or_reject(args, kwargs, lambda x: not x, True) - - -@asyncfiltervariant(filters.do_select) -async def do_select(*args, **kwargs): - return async_select_or_reject(args, kwargs, lambda x: x, False) - - -@asyncfiltervariant(filters.do_selectattr) -async def do_selectattr(*args, **kwargs): - return async_select_or_reject(args, kwargs, lambda x: x, True) - - -@asyncfiltervariant(filters.do_map) -async def do_map(*args, **kwargs): - seq, func = filters.prepare_map(args, kwargs) - if seq: - async for item in auto_aiter(seq): - yield func(item) - - -@asyncfiltervariant(filters.do_sum) -async def do_sum(environment, iterable, attribute=None, start=0): - rv = start - if attribute is not None: - func = filters.make_attrgetter(environment, attribute) - else: - func = lambda x: x - async for item in auto_aiter(iterable): - rv += func(item) - return rv - - -@asyncfiltervariant(filters.do_slice) -async def do_slice(value, slices, fill_with=None): - return filters.do_slice(await auto_to_seq(value), slices, fill_with) - - -ASYNC_FILTERS = { - 'first': do_first, - 'groupby': do_groupby, - 'join': do_join, - 'list': do_list, - # we intentionally do not support do_last because that would be - # ridiculous - 'reject': do_reject, - 'rejectattr': do_rejectattr, - 'map': do_map, - 'select': do_select, - 'selectattr': do_selectattr, - 'sum': do_sum, - 'slice': do_slice, -} diff --git a/tools/inspector_protocol/jinja2/asyncsupport.py b/tools/inspector_protocol/jinja2/asyncsupport.py deleted file mode 100644 index b1e7b5ce9a2..00000000000 --- a/tools/inspector_protocol/jinja2/asyncsupport.py +++ /dev/null @@ -1,256 +0,0 @@ -# -*- coding: utf-8 -*- -""" - jinja2.asyncsupport - ~~~~~~~~~~~~~~~~~~~ - - Has all the code for async support which is implemented as a patch - for supported Python versions. - - :copyright: (c) 2017 by the Jinja Team. - :license: BSD, see LICENSE for more details. -""" -import sys -import asyncio -import inspect -from functools import update_wrapper - -from jinja2.utils import concat, internalcode, Markup -from jinja2.environment import TemplateModule -from jinja2.runtime import LoopContextBase, _last_iteration - - -async def concat_async(async_gen): - rv = [] - async def collect(): - async for event in async_gen: - rv.append(event) - await collect() - return concat(rv) - - -async def generate_async(self, *args, **kwargs): - vars = dict(*args, **kwargs) - try: - async for event in self.root_render_func(self.new_context(vars)): - yield event - except Exception: - exc_info = sys.exc_info() - else: - return - yield self.environment.handle_exception(exc_info, True) - - -def wrap_generate_func(original_generate): - def _convert_generator(self, loop, args, kwargs): - async_gen = self.generate_async(*args, **kwargs) - try: - while 1: - yield loop.run_until_complete(async_gen.__anext__()) - except StopAsyncIteration: - pass - def generate(self, *args, **kwargs): - if not self.environment.is_async: - return original_generate(self, *args, **kwargs) - return _convert_generator(self, asyncio.get_event_loop(), args, kwargs) - return update_wrapper(generate, original_generate) - - -async def render_async(self, *args, **kwargs): - if not self.environment.is_async: - raise RuntimeError('The environment was not created with async mode ' - 'enabled.') - - vars = dict(*args, **kwargs) - ctx = self.new_context(vars) - - try: - return await concat_async(self.root_render_func(ctx)) - except Exception: - exc_info = sys.exc_info() - return self.environment.handle_exception(exc_info, True) - - -def wrap_render_func(original_render): - def render(self, *args, **kwargs): - if not self.environment.is_async: - return original_render(self, *args, **kwargs) - loop = asyncio.get_event_loop() - return loop.run_until_complete(self.render_async(*args, **kwargs)) - return update_wrapper(render, original_render) - - -def wrap_block_reference_call(original_call): - @internalcode - async def async_call(self): - rv = await concat_async(self._stack[self._depth](self._context)) - if self._context.eval_ctx.autoescape: - rv = Markup(rv) - return rv - - @internalcode - def __call__(self): - if not self._context.environment.is_async: - return original_call(self) - return async_call(self) - - return update_wrapper(__call__, original_call) - - -def wrap_macro_invoke(original_invoke): - @internalcode - async def async_invoke(self, arguments, autoescape): - rv = await self._func(*arguments) - if autoescape: - rv = Markup(rv) - return rv - - @internalcode - def _invoke(self, arguments, autoescape): - if not self._environment.is_async: - return original_invoke(self, arguments, autoescape) - return async_invoke(self, arguments, autoescape) - return update_wrapper(_invoke, original_invoke) - - -@internalcode -async def get_default_module_async(self): - if self._module is not None: - return self._module - self._module = rv = await self.make_module_async() - return rv - - -def wrap_default_module(original_default_module): - @internalcode - def _get_default_module(self): - if self.environment.is_async: - raise RuntimeError('Template module attribute is unavailable ' - 'in async mode') - return original_default_module(self) - return _get_default_module - - -async def make_module_async(self, vars=None, shared=False, locals=None): - context = self.new_context(vars, shared, locals) - body_stream = [] - async for item in self.root_render_func(context): - body_stream.append(item) - return TemplateModule(self, context, body_stream) - - -def patch_template(): - from jinja2 import Template - Template.generate = wrap_generate_func(Template.generate) - Template.generate_async = update_wrapper( - generate_async, Template.generate_async) - Template.render_async = update_wrapper( - render_async, Template.render_async) - Template.render = wrap_render_func(Template.render) - Template._get_default_module = wrap_default_module( - Template._get_default_module) - Template._get_default_module_async = get_default_module_async - Template.make_module_async = update_wrapper( - make_module_async, Template.make_module_async) - - -def patch_runtime(): - from jinja2.runtime import BlockReference, Macro - BlockReference.__call__ = wrap_block_reference_call( - BlockReference.__call__) - Macro._invoke = wrap_macro_invoke(Macro._invoke) - - -def patch_filters(): - from jinja2.filters import FILTERS - from jinja2.asyncfilters import ASYNC_FILTERS - FILTERS.update(ASYNC_FILTERS) - - -def patch_all(): - patch_template() - patch_runtime() - patch_filters() - - -async def auto_await(value): - if inspect.isawaitable(value): - return await value - return value - - -async def auto_aiter(iterable): - if hasattr(iterable, '__aiter__'): - async for item in iterable: - yield item - return - for item in iterable: - yield item - - -class AsyncLoopContext(LoopContextBase): - - def __init__(self, async_iterator, undefined, after, length, recurse=None, - depth0=0): - LoopContextBase.__init__(self, undefined, recurse, depth0) - self._async_iterator = async_iterator - self._after = after - self._length = length - - @property - def length(self): - if self._length is None: - raise TypeError('Loop length for some iterators cannot be ' - 'lazily calculated in async mode') - return self._length - - def __aiter__(self): - return AsyncLoopContextIterator(self) - - -class AsyncLoopContextIterator(object): - __slots__ = ('context',) - - def __init__(self, context): - self.context = context - - def __aiter__(self): - return self - - async def __anext__(self): - ctx = self.context - ctx.index0 += 1 - if ctx._after is _last_iteration: - raise StopAsyncIteration() - ctx._before = ctx._current - ctx._current = ctx._after - try: - ctx._after = await ctx._async_iterator.__anext__() - except StopAsyncIteration: - ctx._after = _last_iteration - return ctx._current, ctx - - -async def make_async_loop_context(iterable, undefined, recurse=None, depth0=0): - # Length is more complicated and less efficient in async mode. The - # reason for this is that we cannot know if length will be used - # upfront but because length is a property we cannot lazily execute it - # later. This means that we need to buffer it up and measure :( - # - # We however only do this for actual iterators, not for async - # iterators as blocking here does not seem like the best idea in the - # world. - try: - length = len(iterable) - except (TypeError, AttributeError): - if not hasattr(iterable, '__aiter__'): - iterable = tuple(iterable) - length = len(iterable) - else: - length = None - async_iterator = auto_aiter(iterable) - try: - after = await async_iterator.__anext__() - except StopAsyncIteration: - after = _last_iteration - return AsyncLoopContext(async_iterator, undefined, after, length, recurse, - depth0) diff --git a/tools/inspector_protocol/jinja2/bccache.py b/tools/inspector_protocol/jinja2/bccache.py deleted file mode 100644 index 080e527cabf..00000000000 --- a/tools/inspector_protocol/jinja2/bccache.py +++ /dev/null @@ -1,362 +0,0 @@ -# -*- coding: utf-8 -*- -""" - jinja2.bccache - ~~~~~~~~~~~~~~ - - This module implements the bytecode cache system Jinja is optionally - using. This is useful if you have very complex template situations and - the compiliation of all those templates slow down your application too - much. - - Situations where this is useful are often forking web applications that - are initialized on the first request. - - :copyright: (c) 2017 by the Jinja Team. - :license: BSD. -""" -from os import path, listdir -import os -import sys -import stat -import errno -import marshal -import tempfile -import fnmatch -from hashlib import sha1 -from jinja2.utils import open_if_exists -from jinja2._compat import BytesIO, pickle, PY2, text_type - - -# marshal works better on 3.x, one hack less required -if not PY2: - marshal_dump = marshal.dump - marshal_load = marshal.load -else: - - def marshal_dump(code, f): - if isinstance(f, file): - marshal.dump(code, f) - else: - f.write(marshal.dumps(code)) - - def marshal_load(f): - if isinstance(f, file): - return marshal.load(f) - return marshal.loads(f.read()) - - -bc_version = 3 - -# magic version used to only change with new jinja versions. With 2.6 -# we change this to also take Python version changes into account. The -# reason for this is that Python tends to segfault if fed earlier bytecode -# versions because someone thought it would be a good idea to reuse opcodes -# or make Python incompatible with earlier versions. -bc_magic = 'j2'.encode('ascii') + \ - pickle.dumps(bc_version, 2) + \ - pickle.dumps((sys.version_info[0] << 24) | sys.version_info[1]) - - -class Bucket(object): - """Buckets are used to store the bytecode for one template. It's created - and initialized by the bytecode cache and passed to the loading functions. - - The buckets get an internal checksum from the cache assigned and use this - to automatically reject outdated cache material. Individual bytecode - cache subclasses don't have to care about cache invalidation. - """ - - def __init__(self, environment, key, checksum): - self.environment = environment - self.key = key - self.checksum = checksum - self.reset() - - def reset(self): - """Resets the bucket (unloads the bytecode).""" - self.code = None - - def load_bytecode(self, f): - """Loads bytecode from a file or file like object.""" - # make sure the magic header is correct - magic = f.read(len(bc_magic)) - if magic != bc_magic: - self.reset() - return - # the source code of the file changed, we need to reload - checksum = pickle.load(f) - if self.checksum != checksum: - self.reset() - return - # if marshal_load fails then we need to reload - try: - self.code = marshal_load(f) - except (EOFError, ValueError, TypeError): - self.reset() - return - - def write_bytecode(self, f): - """Dump the bytecode into the file or file like object passed.""" - if self.code is None: - raise TypeError('can\'t write empty bucket') - f.write(bc_magic) - pickle.dump(self.checksum, f, 2) - marshal_dump(self.code, f) - - def bytecode_from_string(self, string): - """Load bytecode from a string.""" - self.load_bytecode(BytesIO(string)) - - def bytecode_to_string(self): - """Return the bytecode as string.""" - out = BytesIO() - self.write_bytecode(out) - return out.getvalue() - - -class BytecodeCache(object): - """To implement your own bytecode cache you have to subclass this class - and override :meth:`load_bytecode` and :meth:`dump_bytecode`. Both of - these methods are passed a :class:`~jinja2.bccache.Bucket`. - - A very basic bytecode cache that saves the bytecode on the file system:: - - from os import path - - class MyCache(BytecodeCache): - - def __init__(self, directory): - self.directory = directory - - def load_bytecode(self, bucket): - filename = path.join(self.directory, bucket.key) - if path.exists(filename): - with open(filename, 'rb') as f: - bucket.load_bytecode(f) - - def dump_bytecode(self, bucket): - filename = path.join(self.directory, bucket.key) - with open(filename, 'wb') as f: - bucket.write_bytecode(f) - - A more advanced version of a filesystem based bytecode cache is part of - Jinja2. - """ - - def load_bytecode(self, bucket): - """Subclasses have to override this method to load bytecode into a - bucket. If they are not able to find code in the cache for the - bucket, it must not do anything. - """ - raise NotImplementedError() - - def dump_bytecode(self, bucket): - """Subclasses have to override this method to write the bytecode - from a bucket back to the cache. If it unable to do so it must not - fail silently but raise an exception. - """ - raise NotImplementedError() - - def clear(self): - """Clears the cache. This method is not used by Jinja2 but should be - implemented to allow applications to clear the bytecode cache used - by a particular environment. - """ - - def get_cache_key(self, name, filename=None): - """Returns the unique hash key for this template name.""" - hash = sha1(name.encode('utf-8')) - if filename is not None: - filename = '|' + filename - if isinstance(filename, text_type): - filename = filename.encode('utf-8') - hash.update(filename) - return hash.hexdigest() - - def get_source_checksum(self, source): - """Returns a checksum for the source.""" - return sha1(source.encode('utf-8')).hexdigest() - - def get_bucket(self, environment, name, filename, source): - """Return a cache bucket for the given template. All arguments are - mandatory but filename may be `None`. - """ - key = self.get_cache_key(name, filename) - checksum = self.get_source_checksum(source) - bucket = Bucket(environment, key, checksum) - self.load_bytecode(bucket) - return bucket - - def set_bucket(self, bucket): - """Put the bucket into the cache.""" - self.dump_bytecode(bucket) - - -class FileSystemBytecodeCache(BytecodeCache): - """A bytecode cache that stores bytecode on the filesystem. It accepts - two arguments: The directory where the cache items are stored and a - pattern string that is used to build the filename. - - If no directory is specified a default cache directory is selected. On - Windows the user's temp directory is used, on UNIX systems a directory - is created for the user in the system temp directory. - - The pattern can be used to have multiple separate caches operate on the - same directory. The default pattern is ``'__jinja2_%s.cache'``. ``%s`` - is replaced with the cache key. - - >>> bcc = FileSystemBytecodeCache('/tmp/jinja_cache', '%s.cache') - - This bytecode cache supports clearing of the cache using the clear method. - """ - - def __init__(self, directory=None, pattern='__jinja2_%s.cache'): - if directory is None: - directory = self._get_default_cache_dir() - self.directory = directory - self.pattern = pattern - - def _get_default_cache_dir(self): - def _unsafe_dir(): - raise RuntimeError('Cannot determine safe temp directory. You ' - 'need to explicitly provide one.') - - tmpdir = tempfile.gettempdir() - - # On windows the temporary directory is used specific unless - # explicitly forced otherwise. We can just use that. - if os.name == 'nt': - return tmpdir - if not hasattr(os, 'getuid'): - _unsafe_dir() - - dirname = '_jinja2-cache-%d' % os.getuid() - actual_dir = os.path.join(tmpdir, dirname) - - try: - os.mkdir(actual_dir, stat.S_IRWXU) - except OSError as e: - if e.errno != errno.EEXIST: - raise - try: - os.chmod(actual_dir, stat.S_IRWXU) - actual_dir_stat = os.lstat(actual_dir) - if actual_dir_stat.st_uid != os.getuid() \ - or not stat.S_ISDIR(actual_dir_stat.st_mode) \ - or stat.S_IMODE(actual_dir_stat.st_mode) != stat.S_IRWXU: - _unsafe_dir() - except OSError as e: - if e.errno != errno.EEXIST: - raise - - actual_dir_stat = os.lstat(actual_dir) - if actual_dir_stat.st_uid != os.getuid() \ - or not stat.S_ISDIR(actual_dir_stat.st_mode) \ - or stat.S_IMODE(actual_dir_stat.st_mode) != stat.S_IRWXU: - _unsafe_dir() - - return actual_dir - - def _get_cache_filename(self, bucket): - return path.join(self.directory, self.pattern % bucket.key) - - def load_bytecode(self, bucket): - f = open_if_exists(self._get_cache_filename(bucket), 'rb') - if f is not None: - try: - bucket.load_bytecode(f) - finally: - f.close() - - def dump_bytecode(self, bucket): - f = open(self._get_cache_filename(bucket), 'wb') - try: - bucket.write_bytecode(f) - finally: - f.close() - - def clear(self): - # imported lazily here because google app-engine doesn't support - # write access on the file system and the function does not exist - # normally. - from os import remove - files = fnmatch.filter(listdir(self.directory), self.pattern % '*') - for filename in files: - try: - remove(path.join(self.directory, filename)) - except OSError: - pass - - -class MemcachedBytecodeCache(BytecodeCache): - """This class implements a bytecode cache that uses a memcache cache for - storing the information. It does not enforce a specific memcache library - (tummy's memcache or cmemcache) but will accept any class that provides - the minimal interface required. - - Libraries compatible with this class: - - - `werkzeug `_.contrib.cache - - `python-memcached `_ - - `cmemcache `_ - - (Unfortunately the django cache interface is not compatible because it - does not support storing binary data, only unicode. You can however pass - the underlying cache client to the bytecode cache which is available - as `django.core.cache.cache._client`.) - - The minimal interface for the client passed to the constructor is this: - - .. class:: MinimalClientInterface - - .. method:: set(key, value[, timeout]) - - Stores the bytecode in the cache. `value` is a string and - `timeout` the timeout of the key. If timeout is not provided - a default timeout or no timeout should be assumed, if it's - provided it's an integer with the number of seconds the cache - item should exist. - - .. method:: get(key) - - Returns the value for the cache key. If the item does not - exist in the cache the return value must be `None`. - - The other arguments to the constructor are the prefix for all keys that - is added before the actual cache key and the timeout for the bytecode in - the cache system. We recommend a high (or no) timeout. - - This bytecode cache does not support clearing of used items in the cache. - The clear method is a no-operation function. - - .. versionadded:: 2.7 - Added support for ignoring memcache errors through the - `ignore_memcache_errors` parameter. - """ - - def __init__(self, client, prefix='jinja2/bytecode/', timeout=None, - ignore_memcache_errors=True): - self.client = client - self.prefix = prefix - self.timeout = timeout - self.ignore_memcache_errors = ignore_memcache_errors - - def load_bytecode(self, bucket): - try: - code = self.client.get(self.prefix + bucket.key) - except Exception: - if not self.ignore_memcache_errors: - raise - code = None - if code is not None: - bucket.bytecode_from_string(code) - - def dump_bytecode(self, bucket): - args = (self.prefix + bucket.key, bucket.bytecode_to_string()) - if self.timeout is not None: - args += (self.timeout,) - try: - self.client.set(*args) - except Exception: - if not self.ignore_memcache_errors: - raise diff --git a/tools/inspector_protocol/jinja2/compiler.py b/tools/inspector_protocol/jinja2/compiler.py deleted file mode 100644 index d534a827391..00000000000 --- a/tools/inspector_protocol/jinja2/compiler.py +++ /dev/null @@ -1,1721 +0,0 @@ -# -*- coding: utf-8 -*- -""" - jinja2.compiler - ~~~~~~~~~~~~~~~ - - Compiles nodes into python code. - - :copyright: (c) 2017 by the Jinja Team. - :license: BSD, see LICENSE for more details. -""" -from itertools import chain -from copy import deepcopy -from keyword import iskeyword as is_python_keyword -from functools import update_wrapper -from jinja2 import nodes -from jinja2.nodes import EvalContext -from jinja2.visitor import NodeVisitor -from jinja2.optimizer import Optimizer -from jinja2.exceptions import TemplateAssertionError -from jinja2.utils import Markup, concat, escape -from jinja2._compat import range_type, text_type, string_types, \ - iteritems, NativeStringIO, imap, izip -from jinja2.idtracking import Symbols, VAR_LOAD_PARAMETER, \ - VAR_LOAD_RESOLVE, VAR_LOAD_ALIAS, VAR_LOAD_UNDEFINED - - -operators = { - 'eq': '==', - 'ne': '!=', - 'gt': '>', - 'gteq': '>=', - 'lt': '<', - 'lteq': '<=', - 'in': 'in', - 'notin': 'not in' -} - -# what method to iterate over items do we want to use for dict iteration -# in generated code? on 2.x let's go with iteritems, on 3.x with items -if hasattr(dict, 'iteritems'): - dict_item_iter = 'iteritems' -else: - dict_item_iter = 'items' - -code_features = ['division'] - -# does this python version support generator stops? (PEP 0479) -try: - exec('from __future__ import generator_stop') - code_features.append('generator_stop') -except SyntaxError: - pass - -# does this python version support yield from? -try: - exec('def f(): yield from x()') -except SyntaxError: - supports_yield_from = False -else: - supports_yield_from = True - - -def optimizeconst(f): - def new_func(self, node, frame, **kwargs): - # Only optimize if the frame is not volatile - if self.optimized and not frame.eval_ctx.volatile: - new_node = self.optimizer.visit(node, frame.eval_ctx) - if new_node != node: - return self.visit(new_node, frame) - return f(self, node, frame, **kwargs) - return update_wrapper(new_func, f) - - -def generate(node, environment, name, filename, stream=None, - defer_init=False, optimized=True): - """Generate the python source for a node tree.""" - if not isinstance(node, nodes.Template): - raise TypeError('Can\'t compile non template nodes') - generator = environment.code_generator_class(environment, name, filename, - stream, defer_init, - optimized) - generator.visit(node) - if stream is None: - return generator.stream.getvalue() - - -def has_safe_repr(value): - """Does the node have a safe representation?""" - if value is None or value is NotImplemented or value is Ellipsis: - return True - if type(value) in (bool, int, float, complex, range_type, Markup) + string_types: - return True - if type(value) in (tuple, list, set, frozenset): - for item in value: - if not has_safe_repr(item): - return False - return True - elif type(value) is dict: - for key, value in iteritems(value): - if not has_safe_repr(key): - return False - if not has_safe_repr(value): - return False - return True - return False - - -def find_undeclared(nodes, names): - """Check if the names passed are accessed undeclared. The return value - is a set of all the undeclared names from the sequence of names found. - """ - visitor = UndeclaredNameVisitor(names) - try: - for node in nodes: - visitor.visit(node) - except VisitorExit: - pass - return visitor.undeclared - - -class MacroRef(object): - - def __init__(self, node): - self.node = node - self.accesses_caller = False - self.accesses_kwargs = False - self.accesses_varargs = False - - -class Frame(object): - """Holds compile time information for us.""" - - def __init__(self, eval_ctx, parent=None, level=None): - self.eval_ctx = eval_ctx - self.symbols = Symbols(parent and parent.symbols or None, - level=level) - - # a toplevel frame is the root + soft frames such as if conditions. - self.toplevel = False - - # the root frame is basically just the outermost frame, so no if - # conditions. This information is used to optimize inheritance - # situations. - self.rootlevel = False - - # in some dynamic inheritance situations the compiler needs to add - # write tests around output statements. - self.require_output_check = parent and parent.require_output_check - - # inside some tags we are using a buffer rather than yield statements. - # this for example affects {% filter %} or {% macro %}. If a frame - # is buffered this variable points to the name of the list used as - # buffer. - self.buffer = None - - # the name of the block we're in, otherwise None. - self.block = parent and parent.block or None - - # the parent of this frame - self.parent = parent - - if parent is not None: - self.buffer = parent.buffer - - def copy(self): - """Create a copy of the current one.""" - rv = object.__new__(self.__class__) - rv.__dict__.update(self.__dict__) - rv.symbols = self.symbols.copy() - return rv - - def inner(self, isolated=False): - """Return an inner frame.""" - if isolated: - return Frame(self.eval_ctx, level=self.symbols.level + 1) - return Frame(self.eval_ctx, self) - - def soft(self): - """Return a soft frame. A soft frame may not be modified as - standalone thing as it shares the resources with the frame it - was created of, but it's not a rootlevel frame any longer. - - This is only used to implement if-statements. - """ - rv = self.copy() - rv.rootlevel = False - return rv - - __copy__ = copy - - -class VisitorExit(RuntimeError): - """Exception used by the `UndeclaredNameVisitor` to signal a stop.""" - - -class DependencyFinderVisitor(NodeVisitor): - """A visitor that collects filter and test calls.""" - - def __init__(self): - self.filters = set() - self.tests = set() - - def visit_Filter(self, node): - self.generic_visit(node) - self.filters.add(node.name) - - def visit_Test(self, node): - self.generic_visit(node) - self.tests.add(node.name) - - def visit_Block(self, node): - """Stop visiting at blocks.""" - - -class UndeclaredNameVisitor(NodeVisitor): - """A visitor that checks if a name is accessed without being - declared. This is different from the frame visitor as it will - not stop at closure frames. - """ - - def __init__(self, names): - self.names = set(names) - self.undeclared = set() - - def visit_Name(self, node): - if node.ctx == 'load' and node.name in self.names: - self.undeclared.add(node.name) - if self.undeclared == self.names: - raise VisitorExit() - else: - self.names.discard(node.name) - - def visit_Block(self, node): - """Stop visiting a blocks.""" - - -class CompilerExit(Exception): - """Raised if the compiler encountered a situation where it just - doesn't make sense to further process the code. Any block that - raises such an exception is not further processed. - """ - - -class CodeGenerator(NodeVisitor): - - def __init__(self, environment, name, filename, stream=None, - defer_init=False, optimized=True): - if stream is None: - stream = NativeStringIO() - self.environment = environment - self.name = name - self.filename = filename - self.stream = stream - self.created_block_context = False - self.defer_init = defer_init - self.optimized = optimized - if optimized: - self.optimizer = Optimizer(environment) - - # aliases for imports - self.import_aliases = {} - - # a registry for all blocks. Because blocks are moved out - # into the global python scope they are registered here - self.blocks = {} - - # the number of extends statements so far - self.extends_so_far = 0 - - # some templates have a rootlevel extends. In this case we - # can safely assume that we're a child template and do some - # more optimizations. - self.has_known_extends = False - - # the current line number - self.code_lineno = 1 - - # registry of all filters and tests (global, not block local) - self.tests = {} - self.filters = {} - - # the debug information - self.debug_info = [] - self._write_debug_info = None - - # the number of new lines before the next write() - self._new_lines = 0 - - # the line number of the last written statement - self._last_line = 0 - - # true if nothing was written so far. - self._first_write = True - - # used by the `temporary_identifier` method to get new - # unique, temporary identifier - self._last_identifier = 0 - - # the current indentation - self._indentation = 0 - - # Tracks toplevel assignments - self._assign_stack = [] - - # Tracks parameter definition blocks - self._param_def_block = [] - - # Tracks the current context. - self._context_reference_stack = ['context'] - - # -- Various compilation helpers - - def fail(self, msg, lineno): - """Fail with a :exc:`TemplateAssertionError`.""" - raise TemplateAssertionError(msg, lineno, self.name, self.filename) - - def temporary_identifier(self): - """Get a new unique identifier.""" - self._last_identifier += 1 - return 't_%d' % self._last_identifier - - def buffer(self, frame): - """Enable buffering for the frame from that point onwards.""" - frame.buffer = self.temporary_identifier() - self.writeline('%s = []' % frame.buffer) - - def return_buffer_contents(self, frame, force_unescaped=False): - """Return the buffer contents of the frame.""" - if not force_unescaped: - if frame.eval_ctx.volatile: - self.writeline('if context.eval_ctx.autoescape:') - self.indent() - self.writeline('return Markup(concat(%s))' % frame.buffer) - self.outdent() - self.writeline('else:') - self.indent() - self.writeline('return concat(%s)' % frame.buffer) - self.outdent() - return - elif frame.eval_ctx.autoescape: - self.writeline('return Markup(concat(%s))' % frame.buffer) - return - self.writeline('return concat(%s)' % frame.buffer) - - def indent(self): - """Indent by one.""" - self._indentation += 1 - - def outdent(self, step=1): - """Outdent by step.""" - self._indentation -= step - - def start_write(self, frame, node=None): - """Yield or write into the frame buffer.""" - if frame.buffer is None: - self.writeline('yield ', node) - else: - self.writeline('%s.append(' % frame.buffer, node) - - def end_write(self, frame): - """End the writing process started by `start_write`.""" - if frame.buffer is not None: - self.write(')') - - def simple_write(self, s, frame, node=None): - """Simple shortcut for start_write + write + end_write.""" - self.start_write(frame, node) - self.write(s) - self.end_write(frame) - - def blockvisit(self, nodes, frame): - """Visit a list of nodes as block in a frame. If the current frame - is no buffer a dummy ``if 0: yield None`` is written automatically. - """ - try: - self.writeline('pass') - for node in nodes: - self.visit(node, frame) - except CompilerExit: - pass - - def write(self, x): - """Write a string into the output stream.""" - if self._new_lines: - if not self._first_write: - self.stream.write('\n' * self._new_lines) - self.code_lineno += self._new_lines - if self._write_debug_info is not None: - self.debug_info.append((self._write_debug_info, - self.code_lineno)) - self._write_debug_info = None - self._first_write = False - self.stream.write(' ' * self._indentation) - self._new_lines = 0 - self.stream.write(x) - - def writeline(self, x, node=None, extra=0): - """Combination of newline and write.""" - self.newline(node, extra) - self.write(x) - - def newline(self, node=None, extra=0): - """Add one or more newlines before the next write.""" - self._new_lines = max(self._new_lines, 1 + extra) - if node is not None and node.lineno != self._last_line: - self._write_debug_info = node.lineno - self._last_line = node.lineno - - def signature(self, node, frame, extra_kwargs=None): - """Writes a function call to the stream for the current node. - A leading comma is added automatically. The extra keyword - arguments may not include python keywords otherwise a syntax - error could occour. The extra keyword arguments should be given - as python dict. - """ - # if any of the given keyword arguments is a python keyword - # we have to make sure that no invalid call is created. - kwarg_workaround = False - for kwarg in chain((x.key for x in node.kwargs), extra_kwargs or ()): - if is_python_keyword(kwarg): - kwarg_workaround = True - break - - for arg in node.args: - self.write(', ') - self.visit(arg, frame) - - if not kwarg_workaround: - for kwarg in node.kwargs: - self.write(', ') - self.visit(kwarg, frame) - if extra_kwargs is not None: - for key, value in iteritems(extra_kwargs): - self.write(', %s=%s' % (key, value)) - if node.dyn_args: - self.write(', *') - self.visit(node.dyn_args, frame) - - if kwarg_workaround: - if node.dyn_kwargs is not None: - self.write(', **dict({') - else: - self.write(', **{') - for kwarg in node.kwargs: - self.write('%r: ' % kwarg.key) - self.visit(kwarg.value, frame) - self.write(', ') - if extra_kwargs is not None: - for key, value in iteritems(extra_kwargs): - self.write('%r: %s, ' % (key, value)) - if node.dyn_kwargs is not None: - self.write('}, **') - self.visit(node.dyn_kwargs, frame) - self.write(')') - else: - self.write('}') - - elif node.dyn_kwargs is not None: - self.write(', **') - self.visit(node.dyn_kwargs, frame) - - def pull_dependencies(self, nodes): - """Pull all the dependencies.""" - visitor = DependencyFinderVisitor() - for node in nodes: - visitor.visit(node) - for dependency in 'filters', 'tests': - mapping = getattr(self, dependency) - for name in getattr(visitor, dependency): - if name not in mapping: - mapping[name] = self.temporary_identifier() - self.writeline('%s = environment.%s[%r]' % - (mapping[name], dependency, name)) - - def enter_frame(self, frame): - undefs = [] - for target, (action, param) in iteritems(frame.symbols.loads): - if action == VAR_LOAD_PARAMETER: - pass - elif action == VAR_LOAD_RESOLVE: - self.writeline('%s = %s(%r)' % - (target, self.get_resolve_func(), param)) - elif action == VAR_LOAD_ALIAS: - self.writeline('%s = %s' % (target, param)) - elif action == VAR_LOAD_UNDEFINED: - undefs.append(target) - else: - raise NotImplementedError('unknown load instruction') - if undefs: - self.writeline('%s = missing' % ' = '.join(undefs)) - - def leave_frame(self, frame, with_python_scope=False): - if not with_python_scope: - undefs = [] - for target, _ in iteritems(frame.symbols.loads): - undefs.append(target) - if undefs: - self.writeline('%s = missing' % ' = '.join(undefs)) - - def func(self, name): - if self.environment.is_async: - return 'async def %s' % name - return 'def %s' % name - - def macro_body(self, node, frame): - """Dump the function def of a macro or call block.""" - frame = frame.inner() - frame.symbols.analyze_node(node) - macro_ref = MacroRef(node) - - explicit_caller = None - skip_special_params = set() - args = [] - for idx, arg in enumerate(node.args): - if arg.name == 'caller': - explicit_caller = idx - if arg.name in ('kwargs', 'varargs'): - skip_special_params.add(arg.name) - args.append(frame.symbols.ref(arg.name)) - - undeclared = find_undeclared(node.body, ('caller', 'kwargs', 'varargs')) - - if 'caller' in undeclared: - # In older Jinja2 versions there was a bug that allowed caller - # to retain the special behavior even if it was mentioned in - # the argument list. However thankfully this was only really - # working if it was the last argument. So we are explicitly - # checking this now and error out if it is anywhere else in - # the argument list. - if explicit_caller is not None: - try: - node.defaults[explicit_caller - len(node.args)] - except IndexError: - self.fail('When defining macros or call blocks the ' - 'special "caller" argument must be omitted ' - 'or be given a default.', node.lineno) - else: - args.append(frame.symbols.declare_parameter('caller')) - macro_ref.accesses_caller = True - if 'kwargs' in undeclared and not 'kwargs' in skip_special_params: - args.append(frame.symbols.declare_parameter('kwargs')) - macro_ref.accesses_kwargs = True - if 'varargs' in undeclared and not 'varargs' in skip_special_params: - args.append(frame.symbols.declare_parameter('varargs')) - macro_ref.accesses_varargs = True - - # macros are delayed, they never require output checks - frame.require_output_check = False - frame.symbols.analyze_node(node) - self.writeline('%s(%s):' % (self.func('macro'), ', '.join(args)), node) - self.indent() - - self.buffer(frame) - self.enter_frame(frame) - - self.push_parameter_definitions(frame) - for idx, arg in enumerate(node.args): - ref = frame.symbols.ref(arg.name) - self.writeline('if %s is missing:' % ref) - self.indent() - try: - default = node.defaults[idx - len(node.args)] - except IndexError: - self.writeline('%s = undefined(%r, name=%r)' % ( - ref, - 'parameter %r was not provided' % arg.name, - arg.name)) - else: - self.writeline('%s = ' % ref) - self.visit(default, frame) - self.mark_parameter_stored(ref) - self.outdent() - self.pop_parameter_definitions() - - self.blockvisit(node.body, frame) - self.return_buffer_contents(frame, force_unescaped=True) - self.leave_frame(frame, with_python_scope=True) - self.outdent() - - return frame, macro_ref - - def macro_def(self, macro_ref, frame): - """Dump the macro definition for the def created by macro_body.""" - arg_tuple = ', '.join(repr(x.name) for x in macro_ref.node.args) - name = getattr(macro_ref.node, 'name', None) - if len(macro_ref.node.args) == 1: - arg_tuple += ',' - self.write('Macro(environment, macro, %r, (%s), %r, %r, %r, ' - 'context.eval_ctx.autoescape)' % - (name, arg_tuple, macro_ref.accesses_kwargs, - macro_ref.accesses_varargs, macro_ref.accesses_caller)) - - def position(self, node): - """Return a human readable position for the node.""" - rv = 'line %d' % node.lineno - if self.name is not None: - rv += ' in ' + repr(self.name) - return rv - - def dump_local_context(self, frame): - return '{%s}' % ', '.join( - '%r: %s' % (name, target) for name, target - in iteritems(frame.symbols.dump_stores())) - - def write_commons(self): - """Writes a common preamble that is used by root and block functions. - Primarily this sets up common local helpers and enforces a generator - through a dead branch. - """ - self.writeline('resolve = context.resolve_or_missing') - self.writeline('undefined = environment.undefined') - self.writeline('if 0: yield None') - - def push_parameter_definitions(self, frame): - """Pushes all parameter targets from the given frame into a local - stack that permits tracking of yet to be assigned parameters. In - particular this enables the optimization from `visit_Name` to skip - undefined expressions for parameters in macros as macros can reference - otherwise unbound parameters. - """ - self._param_def_block.append(frame.symbols.dump_param_targets()) - - def pop_parameter_definitions(self): - """Pops the current parameter definitions set.""" - self._param_def_block.pop() - - def mark_parameter_stored(self, target): - """Marks a parameter in the current parameter definitions as stored. - This will skip the enforced undefined checks. - """ - if self._param_def_block: - self._param_def_block[-1].discard(target) - - def push_context_reference(self, target): - self._context_reference_stack.append(target) - - def pop_context_reference(self): - self._context_reference_stack.pop() - - def get_context_ref(self): - return self._context_reference_stack[-1] - - def get_resolve_func(self): - target = self._context_reference_stack[-1] - if target == 'context': - return 'resolve' - return '%s.resolve' % target - - def derive_context(self, frame): - return '%s.derived(%s)' % ( - self.get_context_ref(), - self.dump_local_context(frame), - ) - - def parameter_is_undeclared(self, target): - """Checks if a given target is an undeclared parameter.""" - if not self._param_def_block: - return False - return target in self._param_def_block[-1] - - def push_assign_tracking(self): - """Pushes a new layer for assignment tracking.""" - self._assign_stack.append(set()) - - def pop_assign_tracking(self, frame): - """Pops the topmost level for assignment tracking and updates the - context variables if necessary. - """ - vars = self._assign_stack.pop() - if not frame.toplevel or not vars: - return - public_names = [x for x in vars if x[:1] != '_'] - if len(vars) == 1: - name = next(iter(vars)) - ref = frame.symbols.ref(name) - self.writeline('context.vars[%r] = %s' % (name, ref)) - else: - self.writeline('context.vars.update({') - for idx, name in enumerate(vars): - if idx: - self.write(', ') - ref = frame.symbols.ref(name) - self.write('%r: %s' % (name, ref)) - self.write('})') - if public_names: - if len(public_names) == 1: - self.writeline('context.exported_vars.add(%r)' % - public_names[0]) - else: - self.writeline('context.exported_vars.update((%s))' % - ', '.join(imap(repr, public_names))) - - # -- Statement Visitors - - def visit_Template(self, node, frame=None): - assert frame is None, 'no root frame allowed' - eval_ctx = EvalContext(self.environment, self.name) - - from jinja2.runtime import __all__ as exported - self.writeline('from __future__ import %s' % ', '.join(code_features)) - self.writeline('from jinja2.runtime import ' + ', '.join(exported)) - - if self.environment.is_async: - self.writeline('from jinja2.asyncsupport import auto_await, ' - 'auto_aiter, make_async_loop_context') - - # if we want a deferred initialization we cannot move the - # environment into a local name - envenv = not self.defer_init and ', environment=environment' or '' - - # do we have an extends tag at all? If not, we can save some - # overhead by just not processing any inheritance code. - have_extends = node.find(nodes.Extends) is not None - - # find all blocks - for block in node.find_all(nodes.Block): - if block.name in self.blocks: - self.fail('block %r defined twice' % block.name, block.lineno) - self.blocks[block.name] = block - - # find all imports and import them - for import_ in node.find_all(nodes.ImportedName): - if import_.importname not in self.import_aliases: - imp = import_.importname - self.import_aliases[imp] = alias = self.temporary_identifier() - if '.' in imp: - module, obj = imp.rsplit('.', 1) - self.writeline('from %s import %s as %s' % - (module, obj, alias)) - else: - self.writeline('import %s as %s' % (imp, alias)) - - # add the load name - self.writeline('name = %r' % self.name) - - # generate the root render function. - self.writeline('%s(context, missing=missing%s):' % - (self.func('root'), envenv), extra=1) - self.indent() - self.write_commons() - - # process the root - frame = Frame(eval_ctx) - if 'self' in find_undeclared(node.body, ('self',)): - ref = frame.symbols.declare_parameter('self') - self.writeline('%s = TemplateReference(context)' % ref) - frame.symbols.analyze_node(node) - frame.toplevel = frame.rootlevel = True - frame.require_output_check = have_extends and not self.has_known_extends - if have_extends: - self.writeline('parent_template = None') - self.enter_frame(frame) - self.pull_dependencies(node.body) - self.blockvisit(node.body, frame) - self.leave_frame(frame, with_python_scope=True) - self.outdent() - - # make sure that the parent root is called. - if have_extends: - if not self.has_known_extends: - self.indent() - self.writeline('if parent_template is not None:') - self.indent() - if supports_yield_from and not self.environment.is_async: - self.writeline('yield from parent_template.' - 'root_render_func(context)') - else: - self.writeline('%sfor event in parent_template.' - 'root_render_func(context):' % - (self.environment.is_async and 'async ' or '')) - self.indent() - self.writeline('yield event') - self.outdent() - self.outdent(1 + (not self.has_known_extends)) - - # at this point we now have the blocks collected and can visit them too. - for name, block in iteritems(self.blocks): - self.writeline('%s(context, missing=missing%s):' % - (self.func('block_' + name), envenv), - block, 1) - self.indent() - self.write_commons() - # It's important that we do not make this frame a child of the - # toplevel template. This would cause a variety of - # interesting issues with identifier tracking. - block_frame = Frame(eval_ctx) - undeclared = find_undeclared(block.body, ('self', 'super')) - if 'self' in undeclared: - ref = block_frame.symbols.declare_parameter('self') - self.writeline('%s = TemplateReference(context)' % ref) - if 'super' in undeclared: - ref = block_frame.symbols.declare_parameter('super') - self.writeline('%s = context.super(%r, ' - 'block_%s)' % (ref, name, name)) - block_frame.symbols.analyze_node(block) - block_frame.block = name - self.enter_frame(block_frame) - self.pull_dependencies(block.body) - self.blockvisit(block.body, block_frame) - self.leave_frame(block_frame, with_python_scope=True) - self.outdent() - - self.writeline('blocks = {%s}' % ', '.join('%r: block_%s' % (x, x) - for x in self.blocks), - extra=1) - - # add a function that returns the debug info - self.writeline('debug_info = %r' % '&'.join('%s=%s' % x for x - in self.debug_info)) - - def visit_Block(self, node, frame): - """Call a block and register it for the template.""" - level = 0 - if frame.toplevel: - # if we know that we are a child template, there is no need to - # check if we are one - if self.has_known_extends: - return - if self.extends_so_far > 0: - self.writeline('if parent_template is None:') - self.indent() - level += 1 - - if node.scoped: - context = self.derive_context(frame) - else: - context = self.get_context_ref() - - if supports_yield_from and not self.environment.is_async and \ - frame.buffer is None: - self.writeline('yield from context.blocks[%r][0](%s)' % ( - node.name, context), node) - else: - loop = self.environment.is_async and 'async for' or 'for' - self.writeline('%s event in context.blocks[%r][0](%s):' % ( - loop, node.name, context), node) - self.indent() - self.simple_write('event', frame) - self.outdent() - - self.outdent(level) - - def visit_Extends(self, node, frame): - """Calls the extender.""" - if not frame.toplevel: - self.fail('cannot use extend from a non top-level scope', - node.lineno) - - # if the number of extends statements in general is zero so - # far, we don't have to add a check if something extended - # the template before this one. - if self.extends_so_far > 0: - - # if we have a known extends we just add a template runtime - # error into the generated code. We could catch that at compile - # time too, but i welcome it not to confuse users by throwing the - # same error at different times just "because we can". - if not self.has_known_extends: - self.writeline('if parent_template is not None:') - self.indent() - self.writeline('raise TemplateRuntimeError(%r)' % - 'extended multiple times') - - # if we have a known extends already we don't need that code here - # as we know that the template execution will end here. - if self.has_known_extends: - raise CompilerExit() - else: - self.outdent() - - self.writeline('parent_template = environment.get_template(', node) - self.visit(node.template, frame) - self.write(', %r)' % self.name) - self.writeline('for name, parent_block in parent_template.' - 'blocks.%s():' % dict_item_iter) - self.indent() - self.writeline('context.blocks.setdefault(name, []).' - 'append(parent_block)') - self.outdent() - - # if this extends statement was in the root level we can take - # advantage of that information and simplify the generated code - # in the top level from this point onwards - if frame.rootlevel: - self.has_known_extends = True - - # and now we have one more - self.extends_so_far += 1 - - def visit_Include(self, node, frame): - """Handles includes.""" - if node.ignore_missing: - self.writeline('try:') - self.indent() - - func_name = 'get_or_select_template' - if isinstance(node.template, nodes.Const): - if isinstance(node.template.value, string_types): - func_name = 'get_template' - elif isinstance(node.template.value, (tuple, list)): - func_name = 'select_template' - elif isinstance(node.template, (nodes.Tuple, nodes.List)): - func_name = 'select_template' - - self.writeline('template = environment.%s(' % func_name, node) - self.visit(node.template, frame) - self.write(', %r)' % self.name) - if node.ignore_missing: - self.outdent() - self.writeline('except TemplateNotFound:') - self.indent() - self.writeline('pass') - self.outdent() - self.writeline('else:') - self.indent() - - skip_event_yield = False - if node.with_context: - loop = self.environment.is_async and 'async for' or 'for' - self.writeline('%s event in template.root_render_func(' - 'template.new_context(context.get_all(), True, ' - '%s)):' % (loop, self.dump_local_context(frame))) - elif self.environment.is_async: - self.writeline('for event in (await ' - 'template._get_default_module_async())' - '._body_stream:') - else: - if supports_yield_from: - self.writeline('yield from template._get_default_module()' - '._body_stream') - skip_event_yield = True - else: - self.writeline('for event in template._get_default_module()' - '._body_stream:') - - if not skip_event_yield: - self.indent() - self.simple_write('event', frame) - self.outdent() - - if node.ignore_missing: - self.outdent() - - def visit_Import(self, node, frame): - """Visit regular imports.""" - self.writeline('%s = ' % frame.symbols.ref(node.target), node) - if frame.toplevel: - self.write('context.vars[%r] = ' % node.target) - if self.environment.is_async: - self.write('await ') - self.write('environment.get_template(') - self.visit(node.template, frame) - self.write(', %r).' % self.name) - if node.with_context: - self.write('make_module%s(context.get_all(), True, %s)' - % (self.environment.is_async and '_async' or '', - self.dump_local_context(frame))) - elif self.environment.is_async: - self.write('_get_default_module_async()') - else: - self.write('_get_default_module()') - if frame.toplevel and not node.target.startswith('_'): - self.writeline('context.exported_vars.discard(%r)' % node.target) - - def visit_FromImport(self, node, frame): - """Visit named imports.""" - self.newline(node) - self.write('included_template = %senvironment.get_template(' - % (self.environment.is_async and 'await ' or '')) - self.visit(node.template, frame) - self.write(', %r).' % self.name) - if node.with_context: - self.write('make_module%s(context.get_all(), True, %s)' - % (self.environment.is_async and '_async' or '', - self.dump_local_context(frame))) - elif self.environment.is_async: - self.write('_get_default_module_async()') - else: - self.write('_get_default_module()') - - var_names = [] - discarded_names = [] - for name in node.names: - if isinstance(name, tuple): - name, alias = name - else: - alias = name - self.writeline('%s = getattr(included_template, ' - '%r, missing)' % (frame.symbols.ref(alias), name)) - self.writeline('if %s is missing:' % frame.symbols.ref(alias)) - self.indent() - self.writeline('%s = undefined(%r %% ' - 'included_template.__name__, ' - 'name=%r)' % - (frame.symbols.ref(alias), - 'the template %%r (imported on %s) does ' - 'not export the requested name %s' % ( - self.position(node), - repr(name) - ), name)) - self.outdent() - if frame.toplevel: - var_names.append(alias) - if not alias.startswith('_'): - discarded_names.append(alias) - - if var_names: - if len(var_names) == 1: - name = var_names[0] - self.writeline('context.vars[%r] = %s' % - (name, frame.symbols.ref(name))) - else: - self.writeline('context.vars.update({%s})' % ', '.join( - '%r: %s' % (name, frame.symbols.ref(name)) for name in var_names - )) - if discarded_names: - if len(discarded_names) == 1: - self.writeline('context.exported_vars.discard(%r)' % - discarded_names[0]) - else: - self.writeline('context.exported_vars.difference_' - 'update((%s))' % ', '.join(imap(repr, discarded_names))) - - def visit_For(self, node, frame): - loop_frame = frame.inner() - test_frame = frame.inner() - else_frame = frame.inner() - - # try to figure out if we have an extended loop. An extended loop - # is necessary if the loop is in recursive mode if the special loop - # variable is accessed in the body. - extended_loop = node.recursive or 'loop' in \ - find_undeclared(node.iter_child_nodes( - only=('body',)), ('loop',)) - - loop_ref = None - if extended_loop: - loop_ref = loop_frame.symbols.declare_parameter('loop') - - loop_frame.symbols.analyze_node(node, for_branch='body') - if node.else_: - else_frame.symbols.analyze_node(node, for_branch='else') - - if node.test: - loop_filter_func = self.temporary_identifier() - test_frame.symbols.analyze_node(node, for_branch='test') - self.writeline('%s(fiter):' % self.func(loop_filter_func), node.test) - self.indent() - self.enter_frame(test_frame) - self.writeline(self.environment.is_async and 'async for ' or 'for ') - self.visit(node.target, loop_frame) - self.write(' in ') - self.write(self.environment.is_async and 'auto_aiter(fiter)' or 'fiter') - self.write(':') - self.indent() - self.writeline('if ', node.test) - self.visit(node.test, test_frame) - self.write(':') - self.indent() - self.writeline('yield ') - self.visit(node.target, loop_frame) - self.outdent(3) - self.leave_frame(test_frame, with_python_scope=True) - - # if we don't have an recursive loop we have to find the shadowed - # variables at that point. Because loops can be nested but the loop - # variable is a special one we have to enforce aliasing for it. - if node.recursive: - self.writeline('%s(reciter, loop_render_func, depth=0):' % - self.func('loop'), node) - self.indent() - self.buffer(loop_frame) - - # Use the same buffer for the else frame - else_frame.buffer = loop_frame.buffer - - # make sure the loop variable is a special one and raise a template - # assertion error if a loop tries to write to loop - if extended_loop: - self.writeline('%s = missing' % loop_ref) - - for name in node.find_all(nodes.Name): - if name.ctx == 'store' and name.name == 'loop': - self.fail('Can\'t assign to special loop variable ' - 'in for-loop target', name.lineno) - - if node.else_: - iteration_indicator = self.temporary_identifier() - self.writeline('%s = 1' % iteration_indicator) - - self.writeline(self.environment.is_async and 'async for ' or 'for ', node) - self.visit(node.target, loop_frame) - if extended_loop: - if self.environment.is_async: - self.write(', %s in await make_async_loop_context(' % loop_ref) - else: - self.write(', %s in LoopContext(' % loop_ref) - else: - self.write(' in ') - - if node.test: - self.write('%s(' % loop_filter_func) - if node.recursive: - self.write('reciter') - else: - if self.environment.is_async and not extended_loop: - self.write('auto_aiter(') - self.visit(node.iter, frame) - if self.environment.is_async and not extended_loop: - self.write(')') - if node.test: - self.write(')') - - if node.recursive: - self.write(', undefined, loop_render_func, depth):') - else: - self.write(extended_loop and ', undefined):' or ':') - - self.indent() - self.enter_frame(loop_frame) - - self.blockvisit(node.body, loop_frame) - if node.else_: - self.writeline('%s = 0' % iteration_indicator) - self.outdent() - self.leave_frame(loop_frame, with_python_scope=node.recursive - and not node.else_) - - if node.else_: - self.writeline('if %s:' % iteration_indicator) - self.indent() - self.enter_frame(else_frame) - self.blockvisit(node.else_, else_frame) - self.leave_frame(else_frame) - self.outdent() - - # if the node was recursive we have to return the buffer contents - # and start the iteration code - if node.recursive: - self.return_buffer_contents(loop_frame) - self.outdent() - self.start_write(frame, node) - if self.environment.is_async: - self.write('await ') - self.write('loop(') - if self.environment.is_async: - self.write('auto_aiter(') - self.visit(node.iter, frame) - if self.environment.is_async: - self.write(')') - self.write(', loop)') - self.end_write(frame) - - def visit_If(self, node, frame): - if_frame = frame.soft() - self.writeline('if ', node) - self.visit(node.test, if_frame) - self.write(':') - self.indent() - self.blockvisit(node.body, if_frame) - self.outdent() - for elif_ in node.elif_: - self.writeline('elif ', elif_) - self.visit(elif_.test, if_frame) - self.write(':') - self.indent() - self.blockvisit(elif_.body, if_frame) - self.outdent() - if node.else_: - self.writeline('else:') - self.indent() - self.blockvisit(node.else_, if_frame) - self.outdent() - - def visit_Macro(self, node, frame): - macro_frame, macro_ref = self.macro_body(node, frame) - self.newline() - if frame.toplevel: - if not node.name.startswith('_'): - self.write('context.exported_vars.add(%r)' % node.name) - ref = frame.symbols.ref(node.name) - self.writeline('context.vars[%r] = ' % node.name) - self.write('%s = ' % frame.symbols.ref(node.name)) - self.macro_def(macro_ref, macro_frame) - - def visit_CallBlock(self, node, frame): - call_frame, macro_ref = self.macro_body(node, frame) - self.writeline('caller = ') - self.macro_def(macro_ref, call_frame) - self.start_write(frame, node) - self.visit_Call(node.call, frame, forward_caller=True) - self.end_write(frame) - - def visit_FilterBlock(self, node, frame): - filter_frame = frame.inner() - filter_frame.symbols.analyze_node(node) - self.enter_frame(filter_frame) - self.buffer(filter_frame) - self.blockvisit(node.body, filter_frame) - self.start_write(frame, node) - self.visit_Filter(node.filter, filter_frame) - self.end_write(frame) - self.leave_frame(filter_frame) - - def visit_With(self, node, frame): - with_frame = frame.inner() - with_frame.symbols.analyze_node(node) - self.enter_frame(with_frame) - for idx, (target, expr) in enumerate(izip(node.targets, node.values)): - self.newline() - self.visit(target, with_frame) - self.write(' = ') - self.visit(expr, frame) - self.blockvisit(node.body, with_frame) - self.leave_frame(with_frame) - - def visit_ExprStmt(self, node, frame): - self.newline(node) - self.visit(node.node, frame) - - def visit_Output(self, node, frame): - # if we have a known extends statement, we don't output anything - # if we are in a require_output_check section - if self.has_known_extends and frame.require_output_check: - return - - allow_constant_finalize = True - if self.environment.finalize: - func = self.environment.finalize - if getattr(func, 'contextfunction', False) or \ - getattr(func, 'evalcontextfunction', False): - allow_constant_finalize = False - elif getattr(func, 'environmentfunction', False): - finalize = lambda x: text_type( - self.environment.finalize(self.environment, x)) - else: - finalize = lambda x: text_type(self.environment.finalize(x)) - else: - finalize = text_type - - # if we are inside a frame that requires output checking, we do so - outdent_later = False - if frame.require_output_check: - self.writeline('if parent_template is None:') - self.indent() - outdent_later = True - - # try to evaluate as many chunks as possible into a static - # string at compile time. - body = [] - for child in node.nodes: - try: - if not allow_constant_finalize: - raise nodes.Impossible() - const = child.as_const(frame.eval_ctx) - except nodes.Impossible: - body.append(child) - continue - # the frame can't be volatile here, becaus otherwise the - # as_const() function would raise an Impossible exception - # at that point. - try: - if frame.eval_ctx.autoescape: - if hasattr(const, '__html__'): - const = const.__html__() - else: - const = escape(const) - const = finalize(const) - except Exception: - # if something goes wrong here we evaluate the node - # at runtime for easier debugging - body.append(child) - continue - if body and isinstance(body[-1], list): - body[-1].append(const) - else: - body.append([const]) - - # if we have less than 3 nodes or a buffer we yield or extend/append - if len(body) < 3 or frame.buffer is not None: - if frame.buffer is not None: - # for one item we append, for more we extend - if len(body) == 1: - self.writeline('%s.append(' % frame.buffer) - else: - self.writeline('%s.extend((' % frame.buffer) - self.indent() - for item in body: - if isinstance(item, list): - val = repr(concat(item)) - if frame.buffer is None: - self.writeline('yield ' + val) - else: - self.writeline(val + ',') - else: - if frame.buffer is None: - self.writeline('yield ', item) - else: - self.newline(item) - close = 1 - if frame.eval_ctx.volatile: - self.write('(escape if context.eval_ctx.autoescape' - ' else to_string)(') - elif frame.eval_ctx.autoescape: - self.write('escape(') - else: - self.write('to_string(') - if self.environment.finalize is not None: - self.write('environment.finalize(') - if getattr(self.environment.finalize, - "contextfunction", False): - self.write('context, ') - close += 1 - self.visit(item, frame) - self.write(')' * close) - if frame.buffer is not None: - self.write(',') - if frame.buffer is not None: - # close the open parentheses - self.outdent() - self.writeline(len(body) == 1 and ')' or '))') - - # otherwise we create a format string as this is faster in that case - else: - format = [] - arguments = [] - for item in body: - if isinstance(item, list): - format.append(concat(item).replace('%', '%%')) - else: - format.append('%s') - arguments.append(item) - self.writeline('yield ') - self.write(repr(concat(format)) + ' % (') - self.indent() - for argument in arguments: - self.newline(argument) - close = 0 - if frame.eval_ctx.volatile: - self.write('(escape if context.eval_ctx.autoescape else' - ' to_string)(') - close += 1 - elif frame.eval_ctx.autoescape: - self.write('escape(') - close += 1 - if self.environment.finalize is not None: - self.write('environment.finalize(') - if getattr(self.environment.finalize, - 'contextfunction', False): - self.write('context, ') - elif getattr(self.environment.finalize, - 'evalcontextfunction', False): - self.write('context.eval_ctx, ') - elif getattr(self.environment.finalize, - 'environmentfunction', False): - self.write('environment, ') - close += 1 - self.visit(argument, frame) - self.write(')' * close + ', ') - self.outdent() - self.writeline(')') - - if outdent_later: - self.outdent() - - def visit_Assign(self, node, frame): - self.push_assign_tracking() - self.newline(node) - self.visit(node.target, frame) - self.write(' = ') - self.visit(node.node, frame) - self.pop_assign_tracking(frame) - - def visit_AssignBlock(self, node, frame): - self.push_assign_tracking() - block_frame = frame.inner() - # This is a special case. Since a set block always captures we - # will disable output checks. This way one can use set blocks - # toplevel even in extended templates. - block_frame.require_output_check = False - block_frame.symbols.analyze_node(node) - self.enter_frame(block_frame) - self.buffer(block_frame) - self.blockvisit(node.body, block_frame) - self.newline(node) - self.visit(node.target, frame) - self.write(' = (Markup if context.eval_ctx.autoescape ' - 'else identity)(') - if node.filter is not None: - self.visit_Filter(node.filter, block_frame) - else: - self.write('concat(%s)' % block_frame.buffer) - self.write(')') - self.pop_assign_tracking(frame) - self.leave_frame(block_frame) - - # -- Expression Visitors - - def visit_Name(self, node, frame): - if node.ctx == 'store' and frame.toplevel: - if self._assign_stack: - self._assign_stack[-1].add(node.name) - ref = frame.symbols.ref(node.name) - - # If we are looking up a variable we might have to deal with the - # case where it's undefined. We can skip that case if the load - # instruction indicates a parameter which are always defined. - if node.ctx == 'load': - load = frame.symbols.find_load(ref) - if not (load is not None and load[0] == VAR_LOAD_PARAMETER and \ - not self.parameter_is_undeclared(ref)): - self.write('(undefined(name=%r) if %s is missing else %s)' % - (node.name, ref, ref)) - return - - self.write(ref) - - def visit_NSRef(self, node, frame): - # NSRefs can only be used to store values; since they use the normal - # `foo.bar` notation they will be parsed as a normal attribute access - # when used anywhere but in a `set` context - ref = frame.symbols.ref(node.name) - self.writeline('if not isinstance(%s, Namespace):' % ref) - self.indent() - self.writeline('raise TemplateRuntimeError(%r)' % - 'cannot assign attribute on non-namespace object') - self.outdent() - self.writeline('%s[%r]' % (ref, node.attr)) - - def visit_Const(self, node, frame): - val = node.as_const(frame.eval_ctx) - if isinstance(val, float): - self.write(str(val)) - else: - self.write(repr(val)) - - def visit_TemplateData(self, node, frame): - try: - self.write(repr(node.as_const(frame.eval_ctx))) - except nodes.Impossible: - self.write('(Markup if context.eval_ctx.autoescape else identity)(%r)' - % node.data) - - def visit_Tuple(self, node, frame): - self.write('(') - idx = -1 - for idx, item in enumerate(node.items): - if idx: - self.write(', ') - self.visit(item, frame) - self.write(idx == 0 and ',)' or ')') - - def visit_List(self, node, frame): - self.write('[') - for idx, item in enumerate(node.items): - if idx: - self.write(', ') - self.visit(item, frame) - self.write(']') - - def visit_Dict(self, node, frame): - self.write('{') - for idx, item in enumerate(node.items): - if idx: - self.write(', ') - self.visit(item.key, frame) - self.write(': ') - self.visit(item.value, frame) - self.write('}') - - def binop(operator, interceptable=True): - @optimizeconst - def visitor(self, node, frame): - if self.environment.sandboxed and \ - operator in self.environment.intercepted_binops: - self.write('environment.call_binop(context, %r, ' % operator) - self.visit(node.left, frame) - self.write(', ') - self.visit(node.right, frame) - else: - self.write('(') - self.visit(node.left, frame) - self.write(' %s ' % operator) - self.visit(node.right, frame) - self.write(')') - return visitor - - def uaop(operator, interceptable=True): - @optimizeconst - def visitor(self, node, frame): - if self.environment.sandboxed and \ - operator in self.environment.intercepted_unops: - self.write('environment.call_unop(context, %r, ' % operator) - self.visit(node.node, frame) - else: - self.write('(' + operator) - self.visit(node.node, frame) - self.write(')') - return visitor - - visit_Add = binop('+') - visit_Sub = binop('-') - visit_Mul = binop('*') - visit_Div = binop('/') - visit_FloorDiv = binop('//') - visit_Pow = binop('**') - visit_Mod = binop('%') - visit_And = binop('and', interceptable=False) - visit_Or = binop('or', interceptable=False) - visit_Pos = uaop('+') - visit_Neg = uaop('-') - visit_Not = uaop('not ', interceptable=False) - del binop, uaop - - @optimizeconst - def visit_Concat(self, node, frame): - if frame.eval_ctx.volatile: - func_name = '(context.eval_ctx.volatile and' \ - ' markup_join or unicode_join)' - elif frame.eval_ctx.autoescape: - func_name = 'markup_join' - else: - func_name = 'unicode_join' - self.write('%s((' % func_name) - for arg in node.nodes: - self.visit(arg, frame) - self.write(', ') - self.write('))') - - @optimizeconst - def visit_Compare(self, node, frame): - self.visit(node.expr, frame) - for op in node.ops: - self.visit(op, frame) - - def visit_Operand(self, node, frame): - self.write(' %s ' % operators[node.op]) - self.visit(node.expr, frame) - - @optimizeconst - def visit_Getattr(self, node, frame): - self.write('environment.getattr(') - self.visit(node.node, frame) - self.write(', %r)' % node.attr) - - @optimizeconst - def visit_Getitem(self, node, frame): - # slices bypass the environment getitem method. - if isinstance(node.arg, nodes.Slice): - self.visit(node.node, frame) - self.write('[') - self.visit(node.arg, frame) - self.write(']') - else: - self.write('environment.getitem(') - self.visit(node.node, frame) - self.write(', ') - self.visit(node.arg, frame) - self.write(')') - - def visit_Slice(self, node, frame): - if node.start is not None: - self.visit(node.start, frame) - self.write(':') - if node.stop is not None: - self.visit(node.stop, frame) - if node.step is not None: - self.write(':') - self.visit(node.step, frame) - - @optimizeconst - def visit_Filter(self, node, frame): - if self.environment.is_async: - self.write('await auto_await(') - self.write(self.filters[node.name] + '(') - func = self.environment.filters.get(node.name) - if func is None: - self.fail('no filter named %r' % node.name, node.lineno) - if getattr(func, 'contextfilter', False): - self.write('context, ') - elif getattr(func, 'evalcontextfilter', False): - self.write('context.eval_ctx, ') - elif getattr(func, 'environmentfilter', False): - self.write('environment, ') - - # if the filter node is None we are inside a filter block - # and want to write to the current buffer - if node.node is not None: - self.visit(node.node, frame) - elif frame.eval_ctx.volatile: - self.write('(context.eval_ctx.autoescape and' - ' Markup(concat(%s)) or concat(%s))' % - (frame.buffer, frame.buffer)) - elif frame.eval_ctx.autoescape: - self.write('Markup(concat(%s))' % frame.buffer) - else: - self.write('concat(%s)' % frame.buffer) - self.signature(node, frame) - self.write(')') - if self.environment.is_async: - self.write(')') - - @optimizeconst - def visit_Test(self, node, frame): - self.write(self.tests[node.name] + '(') - if node.name not in self.environment.tests: - self.fail('no test named %r' % node.name, node.lineno) - self.visit(node.node, frame) - self.signature(node, frame) - self.write(')') - - @optimizeconst - def visit_CondExpr(self, node, frame): - def write_expr2(): - if node.expr2 is not None: - return self.visit(node.expr2, frame) - self.write('undefined(%r)' % ('the inline if-' - 'expression on %s evaluated to false and ' - 'no else section was defined.' % self.position(node))) - - self.write('(') - self.visit(node.expr1, frame) - self.write(' if ') - self.visit(node.test, frame) - self.write(' else ') - write_expr2() - self.write(')') - - @optimizeconst - def visit_Call(self, node, frame, forward_caller=False): - if self.environment.is_async: - self.write('await auto_await(') - if self.environment.sandboxed: - self.write('environment.call(context, ') - else: - self.write('context.call(') - self.visit(node.node, frame) - extra_kwargs = forward_caller and {'caller': 'caller'} or None - self.signature(node, frame, extra_kwargs) - self.write(')') - if self.environment.is_async: - self.write(')') - - def visit_Keyword(self, node, frame): - self.write(node.key + '=') - self.visit(node.value, frame) - - # -- Unused nodes for extensions - - def visit_MarkSafe(self, node, frame): - self.write('Markup(') - self.visit(node.expr, frame) - self.write(')') - - def visit_MarkSafeIfAutoescape(self, node, frame): - self.write('(context.eval_ctx.autoescape and Markup or identity)(') - self.visit(node.expr, frame) - self.write(')') - - def visit_EnvironmentAttribute(self, node, frame): - self.write('environment.' + node.name) - - def visit_ExtensionAttribute(self, node, frame): - self.write('environment.extensions[%r].%s' % (node.identifier, node.name)) - - def visit_ImportedName(self, node, frame): - self.write(self.import_aliases[node.importname]) - - def visit_InternalName(self, node, frame): - self.write(node.name) - - def visit_ContextReference(self, node, frame): - self.write('context') - - def visit_Continue(self, node, frame): - self.writeline('continue', node) - - def visit_Break(self, node, frame): - self.writeline('break', node) - - def visit_Scope(self, node, frame): - scope_frame = frame.inner() - scope_frame.symbols.analyze_node(node) - self.enter_frame(scope_frame) - self.blockvisit(node.body, scope_frame) - self.leave_frame(scope_frame) - - def visit_OverlayScope(self, node, frame): - ctx = self.temporary_identifier() - self.writeline('%s = %s' % (ctx, self.derive_context(frame))) - self.writeline('%s.vars = ' % ctx) - self.visit(node.context, frame) - self.push_context_reference(ctx) - - scope_frame = frame.inner(isolated=True) - scope_frame.symbols.analyze_node(node) - self.enter_frame(scope_frame) - self.blockvisit(node.body, scope_frame) - self.leave_frame(scope_frame) - self.pop_context_reference() - - def visit_EvalContextModifier(self, node, frame): - for keyword in node.options: - self.writeline('context.eval_ctx.%s = ' % keyword.key) - self.visit(keyword.value, frame) - try: - val = keyword.value.as_const(frame.eval_ctx) - except nodes.Impossible: - frame.eval_ctx.volatile = True - else: - setattr(frame.eval_ctx, keyword.key, val) - - def visit_ScopedEvalContextModifier(self, node, frame): - old_ctx_name = self.temporary_identifier() - saved_ctx = frame.eval_ctx.save() - self.writeline('%s = context.eval_ctx.save()' % old_ctx_name) - self.visit_EvalContextModifier(node, frame) - for child in node.body: - self.visit(child, frame) - frame.eval_ctx.revert(saved_ctx) - self.writeline('context.eval_ctx.revert(%s)' % old_ctx_name) diff --git a/tools/inspector_protocol/jinja2/constants.py b/tools/inspector_protocol/jinja2/constants.py deleted file mode 100644 index 11efd1ed158..00000000000 --- a/tools/inspector_protocol/jinja2/constants.py +++ /dev/null @@ -1,32 +0,0 @@ -# -*- coding: utf-8 -*- -""" - jinja.constants - ~~~~~~~~~~~~~~~ - - Various constants. - - :copyright: (c) 2017 by the Jinja Team. - :license: BSD, see LICENSE for more details. -""" - - -#: list of lorem ipsum words used by the lipsum() helper function -LOREM_IPSUM_WORDS = u'''\ -a ac accumsan ad adipiscing aenean aliquam aliquet amet ante aptent arcu at -auctor augue bibendum blandit class commodo condimentum congue consectetuer -consequat conubia convallis cras cubilia cum curabitur curae cursus dapibus -diam dictum dictumst dignissim dis dolor donec dui duis egestas eget eleifend -elementum elit enim erat eros est et etiam eu euismod facilisi facilisis fames -faucibus felis fermentum feugiat fringilla fusce gravida habitant habitasse hac -hendrerit hymenaeos iaculis id imperdiet in inceptos integer interdum ipsum -justo lacinia lacus laoreet lectus leo libero ligula litora lobortis lorem -luctus maecenas magna magnis malesuada massa mattis mauris metus mi molestie -mollis montes morbi mus nam nascetur natoque nec neque netus nibh nisi nisl non -nonummy nostra nulla nullam nunc odio orci ornare parturient pede pellentesque -penatibus per pharetra phasellus placerat platea porta porttitor posuere -potenti praesent pretium primis proin pulvinar purus quam quis quisque rhoncus -ridiculus risus rutrum sagittis sapien scelerisque sed sem semper senectus sit -sociis sociosqu sodales sollicitudin suscipit suspendisse taciti tellus tempor -tempus tincidunt torquent tortor tristique turpis ullamcorper ultrices -ultricies urna ut varius vehicula vel velit venenatis vestibulum vitae vivamus -viverra volutpat vulputate''' diff --git a/tools/inspector_protocol/jinja2/debug.py b/tools/inspector_protocol/jinja2/debug.py deleted file mode 100644 index b61139f0cde..00000000000 --- a/tools/inspector_protocol/jinja2/debug.py +++ /dev/null @@ -1,372 +0,0 @@ -# -*- coding: utf-8 -*- -""" - jinja2.debug - ~~~~~~~~~~~~ - - Implements the debug interface for Jinja. This module does some pretty - ugly stuff with the Python traceback system in order to achieve tracebacks - with correct line numbers, locals and contents. - - :copyright: (c) 2017 by the Jinja Team. - :license: BSD, see LICENSE for more details. -""" -import sys -import traceback -from types import TracebackType, CodeType -from jinja2.utils import missing, internal_code -from jinja2.exceptions import TemplateSyntaxError -from jinja2._compat import iteritems, reraise, PY2 - -# on pypy we can take advantage of transparent proxies -try: - from __pypy__ import tproxy -except ImportError: - tproxy = None - - -# how does the raise helper look like? -try: - exec("raise TypeError, 'foo'") -except SyntaxError: - raise_helper = 'raise __jinja_exception__[1]' -except TypeError: - raise_helper = 'raise __jinja_exception__[0], __jinja_exception__[1]' - - -class TracebackFrameProxy(object): - """Proxies a traceback frame.""" - - def __init__(self, tb): - self.tb = tb - self._tb_next = None - - @property - def tb_next(self): - return self._tb_next - - def set_next(self, next): - if tb_set_next is not None: - try: - tb_set_next(self.tb, next and next.tb or None) - except Exception: - # this function can fail due to all the hackery it does - # on various python implementations. We just catch errors - # down and ignore them if necessary. - pass - self._tb_next = next - - @property - def is_jinja_frame(self): - return '__jinja_template__' in self.tb.tb_frame.f_globals - - def __getattr__(self, name): - return getattr(self.tb, name) - - -def make_frame_proxy(frame): - proxy = TracebackFrameProxy(frame) - if tproxy is None: - return proxy - def operation_handler(operation, *args, **kwargs): - if operation in ('__getattribute__', '__getattr__'): - return getattr(proxy, args[0]) - elif operation == '__setattr__': - proxy.__setattr__(*args, **kwargs) - else: - return getattr(proxy, operation)(*args, **kwargs) - return tproxy(TracebackType, operation_handler) - - -class ProcessedTraceback(object): - """Holds a Jinja preprocessed traceback for printing or reraising.""" - - def __init__(self, exc_type, exc_value, frames): - assert frames, 'no frames for this traceback?' - self.exc_type = exc_type - self.exc_value = exc_value - self.frames = frames - - # newly concatenate the frames (which are proxies) - prev_tb = None - for tb in self.frames: - if prev_tb is not None: - prev_tb.set_next(tb) - prev_tb = tb - prev_tb.set_next(None) - - def render_as_text(self, limit=None): - """Return a string with the traceback.""" - lines = traceback.format_exception(self.exc_type, self.exc_value, - self.frames[0], limit=limit) - return ''.join(lines).rstrip() - - def render_as_html(self, full=False): - """Return a unicode string with the traceback as rendered HTML.""" - from jinja2.debugrenderer import render_traceback - return u'%s\n\n' % ( - render_traceback(self, full=full), - self.render_as_text().decode('utf-8', 'replace') - ) - - @property - def is_template_syntax_error(self): - """`True` if this is a template syntax error.""" - return isinstance(self.exc_value, TemplateSyntaxError) - - @property - def exc_info(self): - """Exception info tuple with a proxy around the frame objects.""" - return self.exc_type, self.exc_value, self.frames[0] - - @property - def standard_exc_info(self): - """Standard python exc_info for re-raising""" - tb = self.frames[0] - # the frame will be an actual traceback (or transparent proxy) if - # we are on pypy or a python implementation with support for tproxy - if type(tb) is not TracebackType: - tb = tb.tb - return self.exc_type, self.exc_value, tb - - -def make_traceback(exc_info, source_hint=None): - """Creates a processed traceback object from the exc_info.""" - exc_type, exc_value, tb = exc_info - if isinstance(exc_value, TemplateSyntaxError): - exc_info = translate_syntax_error(exc_value, source_hint) - initial_skip = 0 - else: - initial_skip = 1 - return translate_exception(exc_info, initial_skip) - - -def translate_syntax_error(error, source=None): - """Rewrites a syntax error to please traceback systems.""" - error.source = source - error.translated = True - exc_info = (error.__class__, error, None) - filename = error.filename - if filename is None: - filename = '' - return fake_exc_info(exc_info, filename, error.lineno) - - -def translate_exception(exc_info, initial_skip=0): - """If passed an exc_info it will automatically rewrite the exceptions - all the way down to the correct line numbers and frames. - """ - tb = exc_info[2] - frames = [] - - # skip some internal frames if wanted - for x in range(initial_skip): - if tb is not None: - tb = tb.tb_next - initial_tb = tb - - while tb is not None: - # skip frames decorated with @internalcode. These are internal - # calls we can't avoid and that are useless in template debugging - # output. - if tb.tb_frame.f_code in internal_code: - tb = tb.tb_next - continue - - # save a reference to the next frame if we override the current - # one with a faked one. - next = tb.tb_next - - # fake template exceptions - template = tb.tb_frame.f_globals.get('__jinja_template__') - if template is not None: - lineno = template.get_corresponding_lineno(tb.tb_lineno) - tb = fake_exc_info(exc_info[:2] + (tb,), template.filename, - lineno)[2] - - frames.append(make_frame_proxy(tb)) - tb = next - - # if we don't have any exceptions in the frames left, we have to - # reraise it unchanged. - # XXX: can we backup here? when could this happen? - if not frames: - reraise(exc_info[0], exc_info[1], exc_info[2]) - - return ProcessedTraceback(exc_info[0], exc_info[1], frames) - - -def get_jinja_locals(real_locals): - ctx = real_locals.get('context') - if ctx: - locals = ctx.get_all().copy() - else: - locals = {} - - local_overrides = {} - - for name, value in iteritems(real_locals): - if not name.startswith('l_') or value is missing: - continue - try: - _, depth, name = name.split('_', 2) - depth = int(depth) - except ValueError: - continue - cur_depth = local_overrides.get(name, (-1,))[0] - if cur_depth < depth: - local_overrides[name] = (depth, value) - - for name, (_, value) in iteritems(local_overrides): - if value is missing: - locals.pop(name, None) - else: - locals[name] = value - - return locals - - -def fake_exc_info(exc_info, filename, lineno): - """Helper for `translate_exception`.""" - exc_type, exc_value, tb = exc_info - - # figure the real context out - if tb is not None: - locals = get_jinja_locals(tb.tb_frame.f_locals) - - # if there is a local called __jinja_exception__, we get - # rid of it to not break the debug functionality. - locals.pop('__jinja_exception__', None) - else: - locals = {} - - # assamble fake globals we need - globals = { - '__name__': filename, - '__file__': filename, - '__jinja_exception__': exc_info[:2], - - # we don't want to keep the reference to the template around - # to not cause circular dependencies, but we mark it as Jinja - # frame for the ProcessedTraceback - '__jinja_template__': None - } - - # and fake the exception - code = compile('\n' * (lineno - 1) + raise_helper, filename, 'exec') - - # if it's possible, change the name of the code. This won't work - # on some python environments such as google appengine - try: - if tb is None: - location = 'template' - else: - function = tb.tb_frame.f_code.co_name - if function == 'root': - location = 'top-level template code' - elif function.startswith('block_'): - location = 'block "%s"' % function[6:] - else: - location = 'template' - - if PY2: - code = CodeType(0, code.co_nlocals, code.co_stacksize, - code.co_flags, code.co_code, code.co_consts, - code.co_names, code.co_varnames, filename, - location, code.co_firstlineno, - code.co_lnotab, (), ()) - else: - code = CodeType(0, code.co_kwonlyargcount, - code.co_nlocals, code.co_stacksize, - code.co_flags, code.co_code, code.co_consts, - code.co_names, code.co_varnames, filename, - location, code.co_firstlineno, - code.co_lnotab, (), ()) - except Exception as e: - pass - - # execute the code and catch the new traceback - try: - exec(code, globals, locals) - except: - exc_info = sys.exc_info() - new_tb = exc_info[2].tb_next - - # return without this frame - return exc_info[:2] + (new_tb,) - - -def _init_ugly_crap(): - """This function implements a few ugly things so that we can patch the - traceback objects. The function returned allows resetting `tb_next` on - any python traceback object. Do not attempt to use this on non cpython - interpreters - """ - import ctypes - from types import TracebackType - - if PY2: - # figure out size of _Py_ssize_t for Python 2: - if hasattr(ctypes.pythonapi, 'Py_InitModule4_64'): - _Py_ssize_t = ctypes.c_int64 - else: - _Py_ssize_t = ctypes.c_int - else: - # platform ssize_t on Python 3 - _Py_ssize_t = ctypes.c_ssize_t - - # regular python - class _PyObject(ctypes.Structure): - pass - _PyObject._fields_ = [ - ('ob_refcnt', _Py_ssize_t), - ('ob_type', ctypes.POINTER(_PyObject)) - ] - - # python with trace - if hasattr(sys, 'getobjects'): - class _PyObject(ctypes.Structure): - pass - _PyObject._fields_ = [ - ('_ob_next', ctypes.POINTER(_PyObject)), - ('_ob_prev', ctypes.POINTER(_PyObject)), - ('ob_refcnt', _Py_ssize_t), - ('ob_type', ctypes.POINTER(_PyObject)) - ] - - class _Traceback(_PyObject): - pass - _Traceback._fields_ = [ - ('tb_next', ctypes.POINTER(_Traceback)), - ('tb_frame', ctypes.POINTER(_PyObject)), - ('tb_lasti', ctypes.c_int), - ('tb_lineno', ctypes.c_int) - ] - - def tb_set_next(tb, next): - """Set the tb_next attribute of a traceback object.""" - if not (isinstance(tb, TracebackType) and - (next is None or isinstance(next, TracebackType))): - raise TypeError('tb_set_next arguments must be traceback objects') - obj = _Traceback.from_address(id(tb)) - if tb.tb_next is not None: - old = _Traceback.from_address(id(tb.tb_next)) - old.ob_refcnt -= 1 - if next is None: - obj.tb_next = ctypes.POINTER(_Traceback)() - else: - next = _Traceback.from_address(id(next)) - next.ob_refcnt += 1 - obj.tb_next = ctypes.pointer(next) - - return tb_set_next - - -# try to get a tb_set_next implementation if we don't have transparent -# proxies. -tb_set_next = None -if tproxy is None: - try: - tb_set_next = _init_ugly_crap() - except: - pass - del _init_ugly_crap diff --git a/tools/inspector_protocol/jinja2/defaults.py b/tools/inspector_protocol/jinja2/defaults.py deleted file mode 100644 index 7c93dec0aeb..00000000000 --- a/tools/inspector_protocol/jinja2/defaults.py +++ /dev/null @@ -1,56 +0,0 @@ -# -*- coding: utf-8 -*- -""" - jinja2.defaults - ~~~~~~~~~~~~~~~ - - Jinja default filters and tags. - - :copyright: (c) 2017 by the Jinja Team. - :license: BSD, see LICENSE for more details. -""" -from jinja2._compat import range_type -from jinja2.utils import generate_lorem_ipsum, Cycler, Joiner, Namespace - - -# defaults for the parser / lexer -BLOCK_START_STRING = '{%' -BLOCK_END_STRING = '%}' -VARIABLE_START_STRING = '{{' -VARIABLE_END_STRING = '}}' -COMMENT_START_STRING = '{#' -COMMENT_END_STRING = '#}' -LINE_STATEMENT_PREFIX = None -LINE_COMMENT_PREFIX = None -TRIM_BLOCKS = False -LSTRIP_BLOCKS = False -NEWLINE_SEQUENCE = '\n' -KEEP_TRAILING_NEWLINE = False - - -# default filters, tests and namespace -from jinja2.filters import FILTERS as DEFAULT_FILTERS -from jinja2.tests import TESTS as DEFAULT_TESTS -DEFAULT_NAMESPACE = { - 'range': range_type, - 'dict': dict, - 'lipsum': generate_lorem_ipsum, - 'cycler': Cycler, - 'joiner': Joiner, - 'namespace': Namespace -} - - -# default policies -DEFAULT_POLICIES = { - 'compiler.ascii_str': True, - 'urlize.rel': 'noopener', - 'urlize.target': None, - 'truncate.leeway': 5, - 'json.dumps_function': None, - 'json.dumps_kwargs': {'sort_keys': True}, - 'ext.i18n.trimmed': False, -} - - -# export all constants -__all__ = tuple(x for x in locals().keys() if x.isupper()) diff --git a/tools/inspector_protocol/jinja2/environment.py b/tools/inspector_protocol/jinja2/environment.py deleted file mode 100644 index 549d9afab45..00000000000 --- a/tools/inspector_protocol/jinja2/environment.py +++ /dev/null @@ -1,1276 +0,0 @@ -# -*- coding: utf-8 -*- -""" - jinja2.environment - ~~~~~~~~~~~~~~~~~~ - - Provides a class that holds runtime and parsing time options. - - :copyright: (c) 2017 by the Jinja Team. - :license: BSD, see LICENSE for more details. -""" -import os -import sys -import weakref -from functools import reduce, partial -from jinja2 import nodes -from jinja2.defaults import BLOCK_START_STRING, \ - BLOCK_END_STRING, VARIABLE_START_STRING, VARIABLE_END_STRING, \ - COMMENT_START_STRING, COMMENT_END_STRING, LINE_STATEMENT_PREFIX, \ - LINE_COMMENT_PREFIX, TRIM_BLOCKS, NEWLINE_SEQUENCE, \ - DEFAULT_FILTERS, DEFAULT_TESTS, DEFAULT_NAMESPACE, \ - DEFAULT_POLICIES, KEEP_TRAILING_NEWLINE, LSTRIP_BLOCKS -from jinja2.lexer import get_lexer, TokenStream -from jinja2.parser import Parser -from jinja2.nodes import EvalContext -from jinja2.compiler import generate, CodeGenerator -from jinja2.runtime import Undefined, new_context, Context -from jinja2.exceptions import TemplateSyntaxError, TemplateNotFound, \ - TemplatesNotFound, TemplateRuntimeError -from jinja2.utils import import_string, LRUCache, Markup, missing, \ - concat, consume, internalcode, have_async_gen -from jinja2._compat import imap, ifilter, string_types, iteritems, \ - text_type, reraise, implements_iterator, implements_to_string, \ - encode_filename, PY2, PYPY - - -# for direct template usage we have up to ten living environments -_spontaneous_environments = LRUCache(10) - -# the function to create jinja traceback objects. This is dynamically -# imported on the first exception in the exception handler. -_make_traceback = None - - -def get_spontaneous_environment(*args): - """Return a new spontaneous environment. A spontaneous environment is an - unnamed and unaccessible (in theory) environment that is used for - templates generated from a string and not from the file system. - """ - try: - env = _spontaneous_environments.get(args) - except TypeError: - return Environment(*args) - if env is not None: - return env - _spontaneous_environments[args] = env = Environment(*args) - env.shared = True - return env - - -def create_cache(size): - """Return the cache class for the given size.""" - if size == 0: - return None - if size < 0: - return {} - return LRUCache(size) - - -def copy_cache(cache): - """Create an empty copy of the given cache.""" - if cache is None: - return None - elif type(cache) is dict: - return {} - return LRUCache(cache.capacity) - - -def load_extensions(environment, extensions): - """Load the extensions from the list and bind it to the environment. - Returns a dict of instantiated environments. - """ - result = {} - for extension in extensions: - if isinstance(extension, string_types): - extension = import_string(extension) - result[extension.identifier] = extension(environment) - return result - - -def fail_for_missing_callable(string, name): - msg = string % name - if isinstance(name, Undefined): - try: - name._fail_with_undefined_error() - except Exception as e: - msg = '%s (%s; did you forget to quote the callable name?)' % (msg, e) - raise TemplateRuntimeError(msg) - - -def _environment_sanity_check(environment): - """Perform a sanity check on the environment.""" - assert issubclass(environment.undefined, Undefined), 'undefined must ' \ - 'be a subclass of undefined because filters depend on it.' - assert environment.block_start_string != \ - environment.variable_start_string != \ - environment.comment_start_string, 'block, variable and comment ' \ - 'start strings must be different' - assert environment.newline_sequence in ('\r', '\r\n', '\n'), \ - 'newline_sequence set to unknown line ending string.' - return environment - - -class Environment(object): - r"""The core component of Jinja is the `Environment`. It contains - important shared variables like configuration, filters, tests, - globals and others. Instances of this class may be modified if - they are not shared and if no template was loaded so far. - Modifications on environments after the first template was loaded - will lead to surprising effects and undefined behavior. - - Here are the possible initialization parameters: - - `block_start_string` - The string marking the beginning of a block. Defaults to ``'{%'``. - - `block_end_string` - The string marking the end of a block. Defaults to ``'%}'``. - - `variable_start_string` - The string marking the beginning of a print statement. - Defaults to ``'{{'``. - - `variable_end_string` - The string marking the end of a print statement. Defaults to - ``'}}'``. - - `comment_start_string` - The string marking the beginning of a comment. Defaults to ``'{#'``. - - `comment_end_string` - The string marking the end of a comment. Defaults to ``'#}'``. - - `line_statement_prefix` - If given and a string, this will be used as prefix for line based - statements. See also :ref:`line-statements`. - - `line_comment_prefix` - If given and a string, this will be used as prefix for line based - comments. See also :ref:`line-statements`. - - .. versionadded:: 2.2 - - `trim_blocks` - If this is set to ``True`` the first newline after a block is - removed (block, not variable tag!). Defaults to `False`. - - `lstrip_blocks` - If this is set to ``True`` leading spaces and tabs are stripped - from the start of a line to a block. Defaults to `False`. - - `newline_sequence` - The sequence that starts a newline. Must be one of ``'\r'``, - ``'\n'`` or ``'\r\n'``. The default is ``'\n'`` which is a - useful default for Linux and OS X systems as well as web - applications. - - `keep_trailing_newline` - Preserve the trailing newline when rendering templates. - The default is ``False``, which causes a single newline, - if present, to be stripped from the end of the template. - - .. versionadded:: 2.7 - - `extensions` - List of Jinja extensions to use. This can either be import paths - as strings or extension classes. For more information have a - look at :ref:`the extensions documentation `. - - `optimized` - should the optimizer be enabled? Default is ``True``. - - `undefined` - :class:`Undefined` or a subclass of it that is used to represent - undefined values in the template. - - `finalize` - A callable that can be used to process the result of a variable - expression before it is output. For example one can convert - ``None`` implicitly into an empty string here. - - `autoescape` - If set to ``True`` the XML/HTML autoescaping feature is enabled by - default. For more details about autoescaping see - :class:`~jinja2.utils.Markup`. As of Jinja 2.4 this can also - be a callable that is passed the template name and has to - return ``True`` or ``False`` depending on autoescape should be - enabled by default. - - .. versionchanged:: 2.4 - `autoescape` can now be a function - - `loader` - The template loader for this environment. - - `cache_size` - The size of the cache. Per default this is ``400`` which means - that if more than 400 templates are loaded the loader will clean - out the least recently used template. If the cache size is set to - ``0`` templates are recompiled all the time, if the cache size is - ``-1`` the cache will not be cleaned. - - .. versionchanged:: 2.8 - The cache size was increased to 400 from a low 50. - - `auto_reload` - Some loaders load templates from locations where the template - sources may change (ie: file system or database). If - ``auto_reload`` is set to ``True`` (default) every time a template is - requested the loader checks if the source changed and if yes, it - will reload the template. For higher performance it's possible to - disable that. - - `bytecode_cache` - If set to a bytecode cache object, this object will provide a - cache for the internal Jinja bytecode so that templates don't - have to be parsed if they were not changed. - - See :ref:`bytecode-cache` for more information. - - `enable_async` - If set to true this enables async template execution which allows - you to take advantage of newer Python features. This requires - Python 3.6 or later. - """ - - #: if this environment is sandboxed. Modifying this variable won't make - #: the environment sandboxed though. For a real sandboxed environment - #: have a look at jinja2.sandbox. This flag alone controls the code - #: generation by the compiler. - sandboxed = False - - #: True if the environment is just an overlay - overlayed = False - - #: the environment this environment is linked to if it is an overlay - linked_to = None - - #: shared environments have this set to `True`. A shared environment - #: must not be modified - shared = False - - #: these are currently EXPERIMENTAL undocumented features. - exception_handler = None - exception_formatter = None - - #: the class that is used for code generation. See - #: :class:`~jinja2.compiler.CodeGenerator` for more information. - code_generator_class = CodeGenerator - - #: the context class thatis used for templates. See - #: :class:`~jinja2.runtime.Context` for more information. - context_class = Context - - def __init__(self, - block_start_string=BLOCK_START_STRING, - block_end_string=BLOCK_END_STRING, - variable_start_string=VARIABLE_START_STRING, - variable_end_string=VARIABLE_END_STRING, - comment_start_string=COMMENT_START_STRING, - comment_end_string=COMMENT_END_STRING, - line_statement_prefix=LINE_STATEMENT_PREFIX, - line_comment_prefix=LINE_COMMENT_PREFIX, - trim_blocks=TRIM_BLOCKS, - lstrip_blocks=LSTRIP_BLOCKS, - newline_sequence=NEWLINE_SEQUENCE, - keep_trailing_newline=KEEP_TRAILING_NEWLINE, - extensions=(), - optimized=True, - undefined=Undefined, - finalize=None, - autoescape=False, - loader=None, - cache_size=400, - auto_reload=True, - bytecode_cache=None, - enable_async=False): - # !!Important notice!! - # The constructor accepts quite a few arguments that should be - # passed by keyword rather than position. However it's important to - # not change the order of arguments because it's used at least - # internally in those cases: - # - spontaneous environments (i18n extension and Template) - # - unittests - # If parameter changes are required only add parameters at the end - # and don't change the arguments (or the defaults!) of the arguments - # existing already. - - # lexer / parser information - self.block_start_string = block_start_string - self.block_end_string = block_end_string - self.variable_start_string = variable_start_string - self.variable_end_string = variable_end_string - self.comment_start_string = comment_start_string - self.comment_end_string = comment_end_string - self.line_statement_prefix = line_statement_prefix - self.line_comment_prefix = line_comment_prefix - self.trim_blocks = trim_blocks - self.lstrip_blocks = lstrip_blocks - self.newline_sequence = newline_sequence - self.keep_trailing_newline = keep_trailing_newline - - # runtime information - self.undefined = undefined - self.optimized = optimized - self.finalize = finalize - self.autoescape = autoescape - - # defaults - self.filters = DEFAULT_FILTERS.copy() - self.tests = DEFAULT_TESTS.copy() - self.globals = DEFAULT_NAMESPACE.copy() - - # set the loader provided - self.loader = loader - self.cache = create_cache(cache_size) - self.bytecode_cache = bytecode_cache - self.auto_reload = auto_reload - - # configurable policies - self.policies = DEFAULT_POLICIES.copy() - - # load extensions - self.extensions = load_extensions(self, extensions) - - self.enable_async = enable_async - self.is_async = self.enable_async and have_async_gen - - _environment_sanity_check(self) - - def add_extension(self, extension): - """Adds an extension after the environment was created. - - .. versionadded:: 2.5 - """ - self.extensions.update(load_extensions(self, [extension])) - - def extend(self, **attributes): - """Add the items to the instance of the environment if they do not exist - yet. This is used by :ref:`extensions ` to register - callbacks and configuration values without breaking inheritance. - """ - for key, value in iteritems(attributes): - if not hasattr(self, key): - setattr(self, key, value) - - def overlay(self, block_start_string=missing, block_end_string=missing, - variable_start_string=missing, variable_end_string=missing, - comment_start_string=missing, comment_end_string=missing, - line_statement_prefix=missing, line_comment_prefix=missing, - trim_blocks=missing, lstrip_blocks=missing, - extensions=missing, optimized=missing, - undefined=missing, finalize=missing, autoescape=missing, - loader=missing, cache_size=missing, auto_reload=missing, - bytecode_cache=missing): - """Create a new overlay environment that shares all the data with the - current environment except for cache and the overridden attributes. - Extensions cannot be removed for an overlayed environment. An overlayed - environment automatically gets all the extensions of the environment it - is linked to plus optional extra extensions. - - Creating overlays should happen after the initial environment was set - up completely. Not all attributes are truly linked, some are just - copied over so modifications on the original environment may not shine - through. - """ - args = dict(locals()) - del args['self'], args['cache_size'], args['extensions'] - - rv = object.__new__(self.__class__) - rv.__dict__.update(self.__dict__) - rv.overlayed = True - rv.linked_to = self - - for key, value in iteritems(args): - if value is not missing: - setattr(rv, key, value) - - if cache_size is not missing: - rv.cache = create_cache(cache_size) - else: - rv.cache = copy_cache(self.cache) - - rv.extensions = {} - for key, value in iteritems(self.extensions): - rv.extensions[key] = value.bind(rv) - if extensions is not missing: - rv.extensions.update(load_extensions(rv, extensions)) - - return _environment_sanity_check(rv) - - lexer = property(get_lexer, doc="The lexer for this environment.") - - def iter_extensions(self): - """Iterates over the extensions by priority.""" - return iter(sorted(self.extensions.values(), - key=lambda x: x.priority)) - - def getitem(self, obj, argument): - """Get an item or attribute of an object but prefer the item.""" - try: - return obj[argument] - except (AttributeError, TypeError, LookupError): - if isinstance(argument, string_types): - try: - attr = str(argument) - except Exception: - pass - else: - try: - return getattr(obj, attr) - except AttributeError: - pass - return self.undefined(obj=obj, name=argument) - - def getattr(self, obj, attribute): - """Get an item or attribute of an object but prefer the attribute. - Unlike :meth:`getitem` the attribute *must* be a bytestring. - """ - try: - return getattr(obj, attribute) - except AttributeError: - pass - try: - return obj[attribute] - except (TypeError, LookupError, AttributeError): - return self.undefined(obj=obj, name=attribute) - - def call_filter(self, name, value, args=None, kwargs=None, - context=None, eval_ctx=None): - """Invokes a filter on a value the same way the compiler does it. - - Note that on Python 3 this might return a coroutine in case the - filter is running from an environment in async mode and the filter - supports async execution. It's your responsibility to await this - if needed. - - .. versionadded:: 2.7 - """ - func = self.filters.get(name) - if func is None: - fail_for_missing_callable('no filter named %r', name) - args = [value] + list(args or ()) - if getattr(func, 'contextfilter', False): - if context is None: - raise TemplateRuntimeError('Attempted to invoke context ' - 'filter without context') - args.insert(0, context) - elif getattr(func, 'evalcontextfilter', False): - if eval_ctx is None: - if context is not None: - eval_ctx = context.eval_ctx - else: - eval_ctx = EvalContext(self) - args.insert(0, eval_ctx) - elif getattr(func, 'environmentfilter', False): - args.insert(0, self) - return func(*args, **(kwargs or {})) - - def call_test(self, name, value, args=None, kwargs=None): - """Invokes a test on a value the same way the compiler does it. - - .. versionadded:: 2.7 - """ - func = self.tests.get(name) - if func is None: - fail_for_missing_callable('no test named %r', name) - return func(value, *(args or ()), **(kwargs or {})) - - @internalcode - def parse(self, source, name=None, filename=None): - """Parse the sourcecode and return the abstract syntax tree. This - tree of nodes is used by the compiler to convert the template into - executable source- or bytecode. This is useful for debugging or to - extract information from templates. - - If you are :ref:`developing Jinja2 extensions ` - this gives you a good overview of the node tree generated. - """ - try: - return self._parse(source, name, filename) - except TemplateSyntaxError: - exc_info = sys.exc_info() - self.handle_exception(exc_info, source_hint=source) - - def _parse(self, source, name, filename): - """Internal parsing function used by `parse` and `compile`.""" - return Parser(self, source, name, encode_filename(filename)).parse() - - def lex(self, source, name=None, filename=None): - """Lex the given sourcecode and return a generator that yields - tokens as tuples in the form ``(lineno, token_type, value)``. - This can be useful for :ref:`extension development ` - and debugging templates. - - This does not perform preprocessing. If you want the preprocessing - of the extensions to be applied you have to filter source through - the :meth:`preprocess` method. - """ - source = text_type(source) - try: - return self.lexer.tokeniter(source, name, filename) - except TemplateSyntaxError: - exc_info = sys.exc_info() - self.handle_exception(exc_info, source_hint=source) - - def preprocess(self, source, name=None, filename=None): - """Preprocesses the source with all extensions. This is automatically - called for all parsing and compiling methods but *not* for :meth:`lex` - because there you usually only want the actual source tokenized. - """ - return reduce(lambda s, e: e.preprocess(s, name, filename), - self.iter_extensions(), text_type(source)) - - def _tokenize(self, source, name, filename=None, state=None): - """Called by the parser to do the preprocessing and filtering - for all the extensions. Returns a :class:`~jinja2.lexer.TokenStream`. - """ - source = self.preprocess(source, name, filename) - stream = self.lexer.tokenize(source, name, filename, state) - for ext in self.iter_extensions(): - stream = ext.filter_stream(stream) - if not isinstance(stream, TokenStream): - stream = TokenStream(stream, name, filename) - return stream - - def _generate(self, source, name, filename, defer_init=False): - """Internal hook that can be overridden to hook a different generate - method in. - - .. versionadded:: 2.5 - """ - return generate(source, self, name, filename, defer_init=defer_init, - optimized=self.optimized) - - def _compile(self, source, filename): - """Internal hook that can be overridden to hook a different compile - method in. - - .. versionadded:: 2.5 - """ - return compile(source, filename, 'exec') - - @internalcode - def compile(self, source, name=None, filename=None, raw=False, - defer_init=False): - """Compile a node or template source code. The `name` parameter is - the load name of the template after it was joined using - :meth:`join_path` if necessary, not the filename on the file system. - the `filename` parameter is the estimated filename of the template on - the file system. If the template came from a database or memory this - can be omitted. - - The return value of this method is a python code object. If the `raw` - parameter is `True` the return value will be a string with python - code equivalent to the bytecode returned otherwise. This method is - mainly used internally. - - `defer_init` is use internally to aid the module code generator. This - causes the generated code to be able to import without the global - environment variable to be set. - - .. versionadded:: 2.4 - `defer_init` parameter added. - """ - source_hint = None - try: - if isinstance(source, string_types): - source_hint = source - source = self._parse(source, name, filename) - source = self._generate(source, name, filename, - defer_init=defer_init) - if raw: - return source - if filename is None: - filename = '