├── .github └── workflows │ └── gh-pages.yml ├── .gitignore ├── CODEOWNERS ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── archetypes └── timeline.md ├── assets ├── js │ ├── countUp.min.js │ ├── noframework.waypoints.min.js │ └── site.js └── scss │ ├── actors.scss │ ├── breakpoints.scss │ ├── colors.scss │ ├── community.scss │ ├── ct.scss │ ├── explainer.scss │ ├── fonts.scss │ ├── footer.scss │ ├── header.scss │ ├── home.scss │ ├── layout.scss │ ├── logtable.scss │ ├── nav.scss │ ├── normalize.scss │ ├── stepbystep.scss │ ├── typography.scss │ └── wrap.scss ├── config.yaml ├── content ├── community │ ├── img │ │ ├── community-header-small.svg │ │ ├── community-header.svg │ │ ├── how-we-grew.svg │ │ ├── our-origin-story.svg │ │ └── our-successes.svg │ └── index.html ├── events │ ├── growth │ │ ├── CloudflareMonitor.md │ │ ├── ComodoCTlog.md │ │ ├── DigicertMonitor.md │ │ ├── FacebookCTMonitor.md │ │ ├── LetsEncrypt.md │ │ ├── MerkleTown.md │ │ ├── MicrosoftAD.md │ │ ├── crtsh.md │ │ └── index.md │ ├── origins │ │ ├── ChromeEV.md │ │ ├── DigiNotarHack.md │ │ ├── FirstCTLog.md │ │ ├── FirstThirdPartyLog.md │ │ ├── IETF-RFC.md │ │ ├── IETFWorks.md │ │ ├── TrustWavemistake.md │ │ └── index.md │ └── successes │ │ ├── AppleEnforcesCT.md │ │ ├── CertinomisMisissuance.md │ │ ├── FacebookInternalPolicing.md │ │ ├── GoogleEnforcesCT.md │ │ ├── IzenpeReuse.md │ │ ├── WosignBackdatesCerts.md │ │ ├── index.md │ │ └── symantecmisissuance.md ├── google │ ├── index.html │ └── known-logs.md ├── home │ ├── img │ │ ├── home-illustration.svg │ │ ├── home-sample.svg │ │ ├── home2.svg │ │ ├── home3.svg │ │ ├── home4.svg │ │ ├── home5.svg │ │ ├── home6.svg │ │ ├── home7.svg │ │ ├── home8.svg │ │ └── small │ │ │ ├── home-illustration.svg │ │ │ ├── home2.svg │ │ │ ├── home3.svg │ │ │ ├── home4.svg │ │ │ ├── home5.svg │ │ │ ├── home6.svg │ │ │ ├── home7.svg │ │ │ └── home8.svg │ └── index.html ├── howctworks │ ├── img │ │ ├── how-it-works-header-small.svg │ │ ├── how-it-works-header.svg │ │ ├── merkle │ │ │ ├── merkle1.svg │ │ │ ├── merkle2.svg │ │ │ ├── merkle3.svg │ │ │ └── merkle4.svg │ │ ├── pki │ │ │ ├── ct-cert-anatomy.svg │ │ │ ├── ct-hacked.svg │ │ │ └── ct-normal.svg │ │ ├── step-by-step_full.svg │ │ ├── stepby │ │ │ ├── 1.svg │ │ │ ├── 2.svg │ │ │ ├── 3.svg │ │ │ ├── 4.svg │ │ │ ├── 5.svg │ │ │ ├── 6.svg │ │ │ ├── 7.svg │ │ │ ├── 8.svg │ │ │ └── 9.svg │ │ ├── with-ct-mix.svg │ │ └── without-ct-mix.svg │ ├── index.html │ └── merkle.md ├── logs │ ├── img │ │ ├── logs-header-small.svg │ │ └── logs-header.svg │ └── index.html ├── monitors │ ├── img │ │ ├── monitors-header-small.svg │ │ └── monitors-header.svg │ └── index.html ├── stepbystep │ ├── 1.md │ ├── 2.md │ ├── 3.md │ ├── 4.md │ ├── 5.md │ ├── 6.md │ ├── 7.md │ ├── 8.md │ └── index.md └── user_agents │ ├── img │ ├── user_agents-header-small.svg │ └── user_agents-header.svg │ └── index.html ├── data ├── certcount.json ├── consolidated_log_list.json ├── logs.json ├── monitors.json ├── operators.json └── user_agents.json ├── docs └── google │ ├── chrome_scts.png │ ├── fetch-logs.md │ ├── getting-started.md │ └── known-logs.md ├── layouts ├── 404.html ├── _default │ ├── baseof.html │ └── index.html ├── home.html ├── partials │ ├── card.html │ ├── footer.html │ ├── head.html │ ├── styles.html │ └── topnav.html └── shortcodes │ ├── abs.html │ ├── approved-logs-rows.html │ ├── bigfooter.html │ ├── certcount.html │ ├── embedfile.html │ ├── event-grid.html │ ├── logs-grid.html │ ├── monitor-grid.html │ ├── operator-list.html │ ├── read-markdown-file.html │ ├── siteparams.html │ ├── step-by-step-blocks.html │ ├── svg.html │ └── ua-grid.html ├── package-lock.json ├── package.json ├── postcss.config.js ├── scripts ├── download_google_logs.js ├── get_latest_logs.js ├── get_uptime.js ├── process_logs.js └── update_certcount.js └── static ├── fonts ├── LICENSE.md ├── iAWriterDuoS-Bold.eot ├── iAWriterDuoS-Bold.ttf ├── iAWriterDuoS-Bold.woff ├── iAWriterDuoS-Regular.eot ├── iAWriterDuoS-Regular.ttf └── iAWriterDuoS-Regular.woff └── img ├── arrow-cards.svg ├── arrow-links.svg ├── blackpixel.png ├── collab-logos ├── Keytos.svg ├── RedSift.svg ├── apple.png ├── apple.svg ├── brave.svg ├── censys.png ├── chrome-logo.svg ├── cloudflare.png ├── cloudflare.svg ├── crt.sh.svg ├── digicert.png ├── digicert.svg ├── entrust.svg ├── facebook.png ├── facebook_nocrop.png ├── firefox.svg ├── google.png ├── google.svg ├── hardenize.svg ├── lets-encrypt.png ├── lets-encrypt.svg ├── merklemap.svg ├── report-uri.svg ├── sectigo.png ├── sectigo.svg ├── sslmate.svg ├── stellastra.svg └── trustasia.svg ├── crosshair-grid.svg ├── favicon.png ├── footer-grid.svg ├── fourohfour-small.svg ├── fourohfour.svg ├── hero-grid.svg ├── plus-sign.svg ├── small-crosshair-grid-2.svg ├── small-crosshair-grid.svg └── timeline-cap.svg /.github/workflows/gh-pages.yml: -------------------------------------------------------------------------------- 1 | # Copyright 2020 Google LLC 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | name: Build/deploy to GH Pages 16 | 17 | on: 18 | push: 19 | branches: 20 | - master 21 | 22 | jobs: 23 | build-deploy: 24 | name: Build and deploy Hugo site 25 | runs-on: ubuntu-22.04 26 | permissions: 27 | contents: write 28 | 29 | steps: 30 | - uses: actions/checkout@v3 31 | 32 | - name: Setup Hugo 33 | uses: peaceiris/actions-hugo@v2 34 | with: 35 | hugo-version: '0.83.1' 36 | extended: true 37 | 38 | - name: Cache node modules 39 | uses: actions/cache@v3 40 | with: 41 | path: node_modules 42 | key: ${{ runner.OS }}-build-${{ hashFiles('**/package-lock.json') }} 43 | restore-keys: | 44 | ${{ runner.OS }}-build-${{ env.cache-name }}- 45 | ${{ runner.OS }}-build- 46 | ${{ runner.OS }}- 47 | 48 | - name: Install dependencies 49 | run: npm install 50 | 51 | - name: Build site 52 | run: hugo --gc 53 | env: 54 | HUGO_ENVIRONMENT: production 55 | 56 | - name: Deploy 57 | uses: peaceiris/actions-gh-pages@v3 58 | with: 59 | github_token: ${{ secrets.GITHUB_TOKEN }} 60 | publish_dir: ./public 61 | cname: certificate.transparency.dev 62 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .vscode 2 | .cache 3 | data/apple_current_logs.json 4 | data/google_current_logs.json 5 | dist/ 6 | keys 7 | node_modules 8 | public 9 | resources 10 | tmp 11 | uptime.csv 12 | yarn-error.log 13 | -------------------------------------------------------------------------------- /CODEOWNERS: -------------------------------------------------------------------------------- 1 | * @google/certificate-transparency 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Certificate Transparency website. 2 | 3 | This website is built as a static site using [Hugo][hugo]. Stylesheets are written in SCSS. 4 | 5 | ## Dependencies 6 | 7 | You'll need _Hugo 0.60 extended_ or greater installed on your path. For OSX, `brew install hugo` should hook you up. The site was developed against Hugo 0.62. 8 | 9 | You'll need a Javascript package manger to install PostCSS and other dependencies. [npm][npm] is recommended (primarily for compatibility with Github Actions). 10 | 11 | ## Running the site locally 12 | 13 | npm install 14 | 15 | will install the JS dependencies. Once you've done that, you can spin up a local server with 16 | 17 | hugo serve 18 | 19 | ## Where content is stored 20 | 21 | * pages are in `content/`. (.html pages work as Hugo content, as long as you include frontmatter). 22 | * images specific to pages are in subdirectories of those content directories. 23 | * community-page entries are in `content/events`. They work as a [headless page bundle][headless_bundle]. More documentation on how to update this is in `CONTRIBUTING.md`. 24 | * step-by-step entries are in `content/stepbystep`. They work as a [headless page bundle][headless_bundle], and are sorted by _weight_. Each entry is a markdown file, containing both content, and, in the frontmatter, pixel-level positioning to adjust the boxouts to the image. 25 | * Log list, certificate count for homepage, monitor list, user agent list, and list of operators for the homepage are currently in `data/` as JSON files. They are accessible via Hugo's `.Site.Data` object. In more detail: 26 | * List of log operators, monitors and user agents for the relevant individual pages are in `data/logs.json`, `data/monitors.json` and `data/user_agents.json`. These populate the relevant lists of cards on pages, in the order they are in the files. Logos should already be stored in `static/img/collab-logos`, and can be adjusted with the `customWidth` parameter if necessary. 27 | * List of "operators" for the **homepage** is in `data/operators.json`. These are displayed on the homepage in the order they're in in the JSON file. You can customise the width of a logo with the `customWidth` parameter to ensure balancing of sizes. If running the site locally, you will need to restart a `hugo serve` instance to see any changes made whilst it is running. 28 | * URLs for "Google Group" and "Github" are Site Parameters, and stored in (`./config.yaml`), and available in templates via `.Site.Params`. They are available in content pages using the {{< siteparams >}} shortcode. 29 | 30 | ## Adding new timeline/logop/useragent/monitor entries 31 | 32 | See `CONTRIBUTING.md` 33 | 34 | ## Automatic deployment 35 | 36 | We currently deploy to Github Pages. 37 | 38 | Currently, there's an action setup (in `./github/workflows/gh-pages.yml`) that will build the site and deploy it to Github Pages on every commit to master. 39 | 40 | It does this using [actions for Github Pages][actions] by `@peaceiris`. It uses the per-repository `GITHUB_TOKEN` to authenticate this. 41 | 42 | Every time you push to master, the action checks out the code, builds the site, pushes that build to the `gh-pages` branch and then, thanks to configuration, that's available at a Github Pages URL. That URL is secured through obscurity rather than anything else, which we've previously deemed acceptable for this project. 43 | 44 | The `CNAME` for the site's URL is not stored in the repository; instead, it is set every time via the `gh-pages` action, and configured with the `cname` variable inside the workflow. 45 | 46 | Note that the environment variable `HUGO_ENV` should be set to `production` to enable CSS minifcation/fingerprinting and to disable SCSS sourcemaps. This is currently the case on our Pages deployment, where it is made available as a Secret. 47 | 48 | The site also automatically deploys whenever a Pull Request is closed. 49 | 50 | [hugo]: https://gohugo.io 51 | [npm]: https://www.npmjs.com 52 | [headless_bundle]: https://gohugo.io/content-management/page-bundles/#headless-bundle 53 | [actions]: https://github.com/peaceiris/actions-gh-pages 54 | 55 | ## License 56 | 57 | Apache 2.0 58 | 59 | This is not an official Google product. 60 | -------------------------------------------------------------------------------- /archetypes/timeline.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "{{ replace .Name "-" " " | title }}" 3 | date: {{ .Date }} 4 | isNegative: false 5 | displayMonth: true 6 | --- 7 | -------------------------------------------------------------------------------- /assets/js/countUp.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2020 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | !function(a,n){"function"==typeof define&&define.amd?define(n):"object"==typeof exports?module.exports=n(require,exports,module):a.CountUp=n()}(this,function(a,n,t){var e=function(a,n,t,e,i,r){function o(a){var n,t,e,i,r,o,s=a<0;if(a=Math.abs(a).toFixed(l.decimals),a+="",n=a.split("."),t=n[0],e=n.length>1?l.options.decimal+n[1]:"",l.options.useGrouping){for(i="",r=0,o=t.length;rl.endVal,l.frameVal=l.startVal,l.initialized=!0,!0):(l.error="[CountUp] startVal ("+n+") or endVal ("+t+") is not a number",!1)):(l.error="[CountUp] target is null or undefined",!1))},l.printValue=function(a){var n=l.options.formattingFn(a);"INPUT"===l.d.tagName?this.d.value=n:"text"===l.d.tagName||"tspan"===l.d.tagName?this.d.textContent=n:this.d.innerHTML=n},l.count=function(a){l.startTime||(l.startTime=a),l.timestamp=a;var n=a-l.startTime;l.remaining=l.duration-n,l.options.useEasing?l.countDown?l.frameVal=l.startVal-l.options.easingFn(n,0,l.startVal-l.endVal,l.duration):l.frameVal=l.options.easingFn(n,l.startVal,l.endVal-l.startVal,l.duration):l.countDown?l.frameVal=l.startVal-(l.startVal-l.endVal)*(n/l.duration):l.frameVal=l.startVal+(l.endVal-l.startVal)*(n/l.duration),l.countDown?l.frameVal=l.frameVall.endVal?l.endVal:l.frameVal,l.frameVal=Math.round(l.frameVal*l.dec)/l.dec,l.printValue(l.frameVal),nl.endVal,l.rAF=requestAnimationFrame(l.count))}},l.initialize()&&l.printValue(l.startVal)};return e}); -------------------------------------------------------------------------------- /assets/scss/actors.scss: -------------------------------------------------------------------------------- 1 | #actor-grid { 2 | margin: 0; 3 | padding: 0; 4 | list-style: none; 5 | 6 | @include md { 7 | display: grid; 8 | grid-template-columns: 1fr 1fr 1fr; 9 | grid-gap: 10px; 10 | } 11 | 12 | li { 13 | margin: 0 0 2rem; 14 | padding: 0; 15 | border-radius: 2px; 16 | display: flex; 17 | flex-flow: row wrap; 18 | 19 | 20 | @include sm { 21 | width: 100%; 22 | } 23 | 24 | @include md { 25 | // min-height: 230px; 26 | } 27 | 28 | a.link { 29 | text-decoration: none; 30 | display: block; 31 | position: relative; 32 | width: 100%; 33 | border-radius: 2px; 34 | 35 | &:link, &:visited { 36 | color: $col-black; 37 | border: 1px solid $col-midgrey; 38 | } 39 | &:hover { 40 | // border: 1px solid red; 41 | border: 1px solid $col-black; 42 | text-decoration: none; 43 | 44 | .arr { 45 | transform: translate(5px, 0) 46 | } 47 | } 48 | } 49 | 50 | &.add { 51 | border: none; 52 | background: #ccc; 53 | text-align: center; 54 | .top { 55 | font-family: $font-sans; 56 | justify-content: flex-end; 57 | h3 { 58 | font-weight: normal; 59 | margin: 0; 60 | font-size: 8rem; 61 | } 62 | } 63 | .body { 64 | text-align: center; 65 | color: $col-greyish; 66 | margin-top: 0.5rem; 67 | p { 68 | width: 100%; 69 | margin: 0 0 0.3rem; 70 | } 71 | strong { 72 | font-family: $font-sans, "Helvetica", "Arial", sans-serif; 73 | font-size: 1rem; 74 | font-weight: 700; 75 | letter-spacing: -0.035em; 76 | } 77 | padding: 0 0 1rem; 78 | } 79 | } 80 | 81 | .top { 82 | padding: 1rem; 83 | text-align: center; 84 | min-height: 140px; 85 | border-radius: 2px; 86 | 87 | display: flex; 88 | flex-direction: column; 89 | justify-content: center; 90 | 91 | h3 { 92 | font-size: 1.6rem; 93 | flex: 0 0; 94 | } 95 | 96 | .img-container { 97 | display: block; 98 | flex: 1 0; 99 | text-align: center; 100 | margin: 0 auto; 101 | // max-height: 100px; 102 | width: 60%; 103 | display: flex; 104 | flex-direction: column; 105 | justify-content: center; 106 | img { 107 | flex: 0 0; 108 | display: block; 109 | width: 100%; 110 | height: auto; 111 | margin: 0 auto; 112 | } 113 | } 114 | } 115 | 116 | .body { 117 | line-height: 1.75; 118 | background: #ccc; 119 | padding: 1rem; 120 | font-family: $font-mono; 121 | color: $col-greyish; 122 | 123 | @include md { 124 | min-height: 140px; 125 | display: flex; 126 | flex-direction: column; 127 | } 128 | 129 | h4 { 130 | display: block; 131 | font-weight: bold; 132 | margin: 0; 133 | } 134 | } 135 | .arr { 136 | position: absolute; 137 | bottom: 0.5rem; 138 | right: 1rem; 139 | text-align: right; 140 | font-family: $font-mono; 141 | display: block; 142 | font-weight: bold; 143 | font-size: 2rem; 144 | line-height: 1; 145 | width: 100%; 146 | margin-top: auto; 147 | 148 | transition: 0.2s ease-in-out; 149 | } 150 | } 151 | } -------------------------------------------------------------------------------- /assets/scss/breakpoints.scss: -------------------------------------------------------------------------------- 1 | // Small tablets (portrait view) 2 | $screen-md-min: 735px; 3 | $screen-sm-max: 734px; 4 | 5 | // Desktop 6 | $screen-lg-min: 1069px; 7 | 8 | // smaller than medium devices 9 | @mixin sm { 10 | @media (max-width: $screen-sm-max) { 11 | @content; 12 | } 13 | } 14 | 15 | // Medium devices 16 | @mixin md { 17 | @media (min-width: #{$screen-md-min}) { 18 | @content; 19 | } 20 | } 21 | 22 | // Large devices 23 | @mixin lg { 24 | @media (min-width: #{$screen-lg-min}) { 25 | @content; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /assets/scss/colors.scss: -------------------------------------------------------------------------------- 1 | $col-black: #1a1b1f; 2 | $col-lightgrey: #e7e7e7; 3 | $col-midgrey: #6B6F78; 4 | $col-greyish: #3e3f42; 5 | $col-tintblue: #f8ffff; 6 | $col-turquoise: #effffd; 7 | $col-orange: #f9a11d; 8 | $col-eyebrow-grey: #636469; 9 | $col-bodyblack: #4a4b4f; 10 | $col-highlight: #b8fff6; 11 | $col-divider: #d8d8da; 12 | 13 | $palettes: ( 14 | logs: ( 15 | "tint": #f5fff7, 16 | "mid": #d4f7da, 17 | "dark": #1fad36, 18 | "full": #178229 19 | ), 20 | monitors: ( 21 | "tint": #f5faff, 22 | "mid": #e0f0ff, 23 | "dark": #3899fa, 24 | "full": #0059b2 25 | ), 26 | user_agents: ( 27 | "tint": #fafaff, 28 | "mid": #e5e5ff, 29 | "dark": #7575f0, 30 | "full": #3333cc 31 | ), 32 | howctworks: ( 33 | "tint": #fffcfa, 34 | "mid": #ffe7db, 35 | "dark": #ff9966, 36 | "full": #d96226 37 | ), 38 | community: ( 39 | "tint": #fff9f9, 40 | "mid": #ffe5e5, 41 | "dark": #ff6666, 42 | "full": #cc3333 43 | ), 44 | home: ( 45 | "tint": #F5FFFD, 46 | "mid": #D6FFF8, 47 | "dark": #00809e, 48 | "full": #178270 49 | ) 50 | ); 51 | 52 | @each $page, $colors in $palettes { 53 | body#scheme-#{$page} { 54 | section { 55 | a:link, 56 | a:visited { 57 | color: map-get($colors, "full"); 58 | text-decoration: none; 59 | 60 | svg path { 61 | stroke: map-get($colors, "full"); 62 | } 63 | } 64 | a:hover, 65 | a:active { 66 | text-decoration: underline; 67 | svg path { 68 | } 69 | } 70 | } 71 | 72 | .wrap-outer.tint { 73 | background: map-get($colors, "tint"); 74 | } 75 | 76 | .cta { 77 | a.link { 78 | background: map-get($colors, "mid"); 79 | border: 1px solid map-get($colors, "mid"); 80 | 81 | &:hover, &:active { 82 | text-decoration: none; 83 | border: 1px solid map-get($colors, "full"); 84 | } 85 | } 86 | } 87 | 88 | ul#actor-grid { 89 | li { 90 | .top { 91 | background: white; 92 | color: map-get($colors, "dark"); 93 | } 94 | .body { 95 | background: map-get($colors, "tint"); 96 | } 97 | a.link { 98 | .arr svg { 99 | path { 100 | stroke: map-get($colors, "dark") !important; 101 | } 102 | } 103 | 104 | &:link, 105 | &:visited { 106 | .arr svg { 107 | path { 108 | stroke: map-get($colors, "full") !important; 109 | } 110 | } 111 | } 112 | &:hover, 113 | &:active { 114 | border: 1px solid map-get($colors, "dark"); 115 | 116 | .arr svg { 117 | path { 118 | stroke: map-get($colors, "dark") !important; 119 | } 120 | } 121 | } 122 | } 123 | } 124 | 125 | li.add { 126 | background: map-get($colors, "mid"); 127 | .top, 128 | .body { 129 | color: $col-black; 130 | background: map-get($colors, "mid"); 131 | } 132 | a.link { 133 | &:link, &:visited { 134 | border: 1px solid map-get($colors, "mid"); 135 | span.add-join { 136 | color: map-get($colors, "full"); 137 | text-decoration: none; 138 | } 139 | } 140 | &:hover, &:active { 141 | border: 1px solid map-get($colors, "dark"); 142 | span.add-join { 143 | color: map-get($colors, "full"); 144 | text-decoration: underline; 145 | } 146 | } 147 | } 148 | } 149 | } 150 | 151 | a.linkbutton { 152 | &:link, 153 | &:visited { 154 | color: white; 155 | background: map-get($colors, "dark"); 156 | } 157 | &:hover, 158 | &:active { 159 | background: darken(map-get($colors, "dark"), 10%); 160 | text-decoration: underline; 161 | } 162 | } 163 | } 164 | // each nav element should have the background of $page 165 | nav ul.menu li.#{$page} a { 166 | &:hover, 167 | &:active { 168 | background: map-get($colors, "tint"); 169 | } 170 | } 171 | } 172 | -------------------------------------------------------------------------------- /assets/scss/community.scss: -------------------------------------------------------------------------------- 1 | .event-description { 2 | font-family: $font-mono; 3 | margin-bottom: 4rem; 4 | 5 | img, 6 | object.svg-obj { 7 | margin: 0 auto 2rem; 8 | @include sm { 9 | display: none; 10 | } 11 | @include md { 12 | display: block; 13 | float: right; 14 | } 15 | } 16 | 17 | @include md { 18 | width: 75%; 19 | margin-left: 12.5%; 20 | p { 21 | width: 50%; 22 | } 23 | } 24 | } 25 | 26 | #scheme-community { 27 | object.svg-obj.sm { 28 | display: none; 29 | @include sm { 30 | display: block; 31 | margin: 0 auto 2rem; 32 | } 33 | } 34 | } 35 | 36 | .tint .event { 37 | background: white !important; 38 | } 39 | 40 | .event-grid { 41 | @include md { 42 | display: grid; 43 | grid-template-columns: repeat(3, 1fr); 44 | grid-row-gap: 1rem; 45 | grid-column-gap: 1rem; 46 | } 47 | 48 | .event { 49 | padding: 10px 12px; 50 | border: 1px solid $col-black; 51 | border-radius: 2px; 52 | background: map-get(map-get($palettes, "community"), "tint"); 53 | 54 | flex: 1 0; 55 | 56 | @include sm { 57 | margin: 0 0 1rem; 58 | } 59 | 60 | h4 { 61 | font-weight: 700; 62 | letter-spacing: -0.035em; 63 | margin: 0.5rem 0; 64 | font-size: 1rem; 65 | color: $col-black; 66 | } 67 | 68 | .date { 69 | text-transform: uppercase; 70 | font-family: $font-mono, monospace; 71 | font-size: 0.7rem; 72 | color: $col-black; 73 | } 74 | 75 | p { 76 | font-family: $font-mono, monospace; 77 | font-size: 0.8rem; 78 | margin: 0 0 1rem; 79 | &:last-child { 80 | margin: 0; 81 | } 82 | } 83 | } 84 | .event-wrapper { 85 | display: none; 86 | } 87 | 88 | .event-wrapper[data-is-headline="true"], 89 | &.show-all .event-wrapper { 90 | display: flex; 91 | flex-direction: column; 92 | justify-content: flex-start; 93 | } 94 | } 95 | 96 | .toggle-all-events { 97 | font-family: $font-mono; 98 | text-align: center; 99 | margin: 2rem 0; 100 | } 101 | -------------------------------------------------------------------------------- /assets/scss/ct.scss: -------------------------------------------------------------------------------- 1 | @import 'normalize.scss'; 2 | @import 'breakpoints.scss'; 3 | @import 'fonts.scss'; 4 | @import 'colors.scss'; 5 | 6 | @import 'layout.scss'; 7 | @import 'typography.scss'; 8 | @import 'wrap.scss'; 9 | 10 | @import 'nav.scss'; 11 | @import 'header.scss'; 12 | @import 'footer.scss'; 13 | 14 | @import 'home.scss'; 15 | @import 'explainer.scss'; 16 | @import 'stepbystep.scss'; 17 | @import 'logtable.scss'; 18 | @import 'community.scss'; 19 | @import 'actors.scss'; 20 | -------------------------------------------------------------------------------- /assets/scss/explainer.scss: -------------------------------------------------------------------------------- 1 | .explainer { 2 | position: relative; 3 | 4 | @include md { 5 | display: flex; 6 | } 7 | 8 | .explanation { 9 | width: 100%; 10 | @include md { 11 | flex: 3; 12 | } 13 | 14 | } 15 | 16 | .illustration { 17 | flex: 5; 18 | 19 | @include md { 20 | margin-left: 6rem; 21 | } 22 | 23 | position: sticky; 24 | position: -webkit-sticky; 25 | top: 3rem; 26 | 27 | margin-bottom: 3rem; 28 | 29 | &.placeholder { 30 | @include placeholder; 31 | } 32 | } 33 | 34 | } 35 | 36 | .explanation-block { 37 | margin: 0 0 4rem; 38 | clear: both; 39 | 40 | &.half { 41 | margin-bottom: 5rem; 42 | 43 | img { 44 | width: 300px; 45 | margin: 2rem auto; 46 | display: block; 47 | } 48 | 49 | @include md { 50 | h3 { 51 | width: 75%; 52 | margin-left: 12.5%; 53 | } 54 | .copy { 55 | width: 75%; 56 | margin: 0 0 5rem; 57 | margin-left: 12.5%; 58 | } 59 | p { 60 | } 61 | } 62 | } 63 | 64 | h3 { 65 | font-weight: 700; 66 | margin: 0 0 1rem; 67 | font-size: 1.3rem; 68 | letter-spacing: -0.035em; 69 | line-height: 105%; 70 | } 71 | 72 | p, li { 73 | margin:0 0 1rem; 74 | font-family: $font-mono, monospace; 75 | font-size: 0.8rem; 76 | line-height: 1.75; 77 | } 78 | 79 | &.merkle { 80 | @include sm { 81 | img { 82 | margin: 0 auto; 83 | display: block; 84 | width: 100%; 85 | } 86 | } 87 | @include md { 88 | img { 89 | position: absolute; 90 | width: 55%; 91 | right: 0; 92 | } 93 | 94 | p { 95 | padding-right: 50%; 96 | position: relative; 97 | } 98 | 99 | h3 { 100 | padding-right: 50%; 101 | } 102 | 103 | ul { 104 | padding-right: 50%; 105 | } 106 | } 107 | 108 | @include lg { 109 | img { 110 | width: 45%; 111 | } 112 | } 113 | } 114 | } -------------------------------------------------------------------------------- /assets/scss/fonts.scss: -------------------------------------------------------------------------------- 1 | @mixin font-face($font-family, $url, $weight:"", $style:"") { 2 | @font-face { 3 | font-family: '#{$font-family}'; 4 | src: url('#{$url}.eot'); 5 | src: url('#{$url}.eot?#iefix') format('embedded-opentype'), 6 | url('#{$url}.woff') format('woff'), 7 | url('#{$url}.ttf') format('truetype'); 8 | font-display: swap; 9 | 10 | @if $weight != "" { 11 | font-weight: $weight; 12 | } 13 | @if $style != "" { 14 | font-style: $style; 15 | } 16 | } 17 | } 18 | 19 | @include font-face('iAWriterDuoS', '../fonts/iAWriterDuoS-Bold', bold); 20 | @include font-face('iAWriterDuoS', '../fonts/iAWriterDuoS-Regular', normal); 21 | 22 | $font-mono: 'iAWriterDuoS'; 23 | $font-sans: 'Inter'; 24 | -------------------------------------------------------------------------------- /assets/scss/footer.scss: -------------------------------------------------------------------------------- 1 | #footer-container { 2 | // position: absolute; 3 | // margin-top: 2rem; 4 | // bottom: 0; 5 | width: 100%; 6 | // border: 1px solid red;; 7 | } 8 | #footer { 9 | @include responsive-wrapper; 10 | 11 | margin-top: 3rem; 12 | margin-bottom: 3rem; 13 | 14 | font-family: $font-mono, monospace; 15 | font-size: 0.75rem; 16 | 17 | a { 18 | &:link, &:visited { 19 | color: $col-greyish; 20 | text-decoration: none; 21 | } 22 | &:hover, &:active { 23 | color: $col-greyish; 24 | text-decoration: underline; 25 | } 26 | } 27 | 28 | .row { 29 | line-height: 1.75; 30 | 31 | @include sm { 32 | margin-left: 1.5rem; 33 | margin-right: 1.5rem; 34 | } 35 | 36 | @include md { 37 | display: flex; 38 | &.rev { 39 | flex-direction: row-reverse; 40 | } 41 | } 42 | 43 | h3 { 44 | margin: 0 0 2rem; 45 | font-family: $font-sans, "Helvetica", "Arial", sans-serif; 46 | 47 | font-weight: 700; 48 | letter-spacing: -0.035em; 49 | 50 | @include md { 51 | flex: 1; 52 | } 53 | } 54 | 55 | .tag { 56 | @include md { 57 | flex: 1; 58 | position: relative; 59 | } 60 | span { 61 | color: $col-greyish; 62 | @include md { 63 | position: absolute; 64 | bottom: 0; 65 | } 66 | } 67 | } 68 | 69 | } 70 | 71 | ul.footer-menu { 72 | line-height: 1.75; 73 | list-style: none; 74 | padding: 0; 75 | margin: 0; 76 | 77 | @include sm { 78 | display: block; 79 | margin: 0 0 2rem; 80 | } 81 | 82 | @include md { 83 | flex: 1; 84 | display: flex; 85 | } 86 | 87 | li { 88 | margin: 0; 89 | padding: 0; 90 | } 91 | 92 | > li { 93 | @include md { 94 | flex: 1; 95 | } 96 | 97 | @include sm { 98 | margin: 0 0 1rem; 99 | } 100 | } 101 | 102 | li > ul { 103 | // margin: 1rem 0 0; 104 | padding: 0; 105 | list-style: none; 106 | text-align: left; 107 | 108 | @include sm { 109 | display: block; 110 | margin: 0 0 2rem; 111 | } 112 | 113 | 114 | li { 115 | display: block; 116 | text-align: left; 117 | margin-bottom: 1rem; 118 | 119 | &:last-child { 120 | margin: 0; 121 | } 122 | } 123 | } 124 | } 125 | 126 | } 127 | 128 | #bigfooter { 129 | clear: both; 130 | margin: 2rem 0; 131 | line-height: 105%; 132 | 133 | @include sm { 134 | font-size: 1.7rem; 135 | margin: -2rem 0 0; 136 | } 137 | 138 | @include md { 139 | font-size: 1.9rem; 140 | margin: -2rem 0 4rem; 141 | } 142 | 143 | @include lg { 144 | font-size: 2.1rem; 145 | margin: 2rem 0 4rem; 146 | } 147 | 148 | 149 | a { 150 | &:link, &:visited { 151 | color: $col-black; 152 | text-decoration: none; 153 | } 154 | &:hover, &:active { 155 | text-decoration: underline; 156 | } 157 | } 158 | 159 | p { 160 | text-align: center; 161 | line-height: 1; 162 | margin: 0 0 2rem; 163 | letter-spacing: -0.035em; 164 | font-weight: 700; 165 | &:last-of-type { 166 | // margin: 0; 167 | } 168 | } 169 | 170 | .wrap-outer { 171 | border: 1px solid white; 172 | position: relative; 173 | // min-height: unset; 174 | 175 | @include md { 176 | display: flex; 177 | flex-direction: row; 178 | align-items: center; 179 | // min-height: 312px; 180 | } 181 | 182 | @include lg { 183 | // min-height: 420px; 184 | } 185 | 186 | @include sm { 187 | &.noscroll { 188 | overflow: unset; 189 | } 190 | } 191 | } 192 | 193 | .inner { 194 | background: white; 195 | font-weight: 600; 196 | color: $col-midgrey; 197 | 198 | // flex: 1; 199 | 200 | margin: 0 auto; 201 | 202 | p { 203 | color: $col-midgrey; 204 | } 205 | 206 | br { 207 | @include sm { 208 | display: none; 209 | } 210 | } 211 | 212 | @include sm { 213 | // margin: 0 3rem; 214 | } 215 | 216 | @include sm { 217 | padding: 0 1.5em; 218 | } 219 | 220 | @include md { 221 | margin: 0 auto; 222 | width: 665px; 223 | padding: 0 4rem; 224 | } 225 | @include lg { 226 | padding: 0; 227 | } 228 | } 229 | } -------------------------------------------------------------------------------- /assets/scss/header.scss: -------------------------------------------------------------------------------- 1 | 2 | .page-heading { 3 | flex: none; 4 | 5 | position: relative; 6 | z-index: 10; 7 | 8 | &.half { 9 | @include md { 10 | width: 58%; 11 | } 12 | 13 | @include sm { 14 | margin: 10vw 0 9.5vw 0; 15 | } 16 | 17 | .head-group { 18 | @include md { 19 | padding-top: 1.15rem; 20 | min-height: 199px; 21 | } 22 | @include lg { 23 | padding-top: 1.5rem; 24 | min-height: 261px; 25 | } 26 | } 27 | } 28 | 29 | &.almost-full { 30 | margin: 2rem 0; 31 | @include sm { 32 | margin: 10vw 0 9.5vw 0; 33 | width: 100%; 34 | } 35 | @include md { 36 | margin: 3rem 0 4rem 0; 37 | width: 97%; 38 | } 39 | @include lg { 40 | margin: 4rem 0 5.5rem 0; 41 | width: 97%; 42 | } 43 | } 44 | 45 | .prehead { 46 | font-family: $font-mono, monospace; 47 | font-size: 1.3rem; 48 | line-height: 1.75; 49 | letter-spacing: -0.055em; 50 | color: $col-eyebrow-grey; 51 | 52 | @include sm { 53 | &.md { 54 | display: none; 55 | } 56 | } 57 | } 58 | 59 | h1 { 60 | margin: 0 0 2rem; 61 | font-size: 3rem; 62 | letter-spacing: -0.04em; 63 | font-weight: 800; 64 | line-height: 1.1; 65 | 66 | @include sm { 67 | font-size: 2.6rem; 68 | br { 69 | display: none; 70 | } 71 | } 72 | 73 | @include md { 74 | margin: 0 0 1rem; 75 | } 76 | } 77 | 78 | .details { 79 | font-family: $font-mono, monospace; 80 | 81 | h4 { 82 | font-weight: bold; 83 | font-size: 1rem; 84 | margin: 0; 85 | line-height: 1.75rem; 86 | } 87 | 88 | @include md { 89 | width: 85%; 90 | 91 | p:first-of-type { 92 | margin-top: 2px; 93 | } 94 | } 95 | 96 | p.link-buttons { 97 | margin-top: 3rem; 98 | } 99 | } 100 | 101 | ol { 102 | margin: 0; 103 | padding-left: 2rem; 104 | color: $col-greyish; 105 | 106 | li { 107 | line-height: 1.75rem; 108 | a { 109 | &:link, &:visited { 110 | color: $col-greyish; 111 | text-decoration: none; 112 | } 113 | &:hover, &:active { 114 | color: $col-greyish; 115 | text-decoration: underline; 116 | } 117 | } 118 | } 119 | } 120 | } 121 | 122 | body#scheme-home { 123 | .page-heading { 124 | h1 { 125 | text-align: center; 126 | 127 | @include md { 128 | padding: 0; 129 | } 130 | @include lg { 131 | padding: 0 12%; 132 | } 133 | } 134 | } 135 | } 136 | 137 | .illustrated-head { 138 | position: relative; 139 | margin: 0 0 3rem; 140 | 141 | @include md { 142 | min-height: 300px; 143 | } 144 | 145 | .svg-obj { 146 | z-index: 1; 147 | @include sm { 148 | &.sm { 149 | display: block; 150 | width: 100%; 151 | } 152 | &.md { 153 | display: none; 154 | } 155 | } 156 | 157 | @include md { 158 | position: absolute; 159 | top: 0; 160 | 161 | left: -111px; 162 | width: 955px; 163 | &.sm { 164 | display: none; 165 | } 166 | &.md { 167 | display: block; 168 | } 169 | } 170 | 171 | @include lg { 172 | left: -145px; 173 | width: 1270px 174 | } 175 | 176 | } 177 | } -------------------------------------------------------------------------------- /assets/scss/layout.scss: -------------------------------------------------------------------------------- 1 | @mixin responsive-wrapper { 2 | @include md { 3 | margin-left: auto; 4 | margin-right: auto; 5 | max-width: 733px; 6 | } 7 | 8 | @include lg { 9 | max-width: 979px; 10 | } 11 | } 12 | 13 | @mixin placeholder { 14 | width: 100%; 15 | background: pink; 16 | } 17 | 18 | section { 19 | &.alt { 20 | background: $col-tintblue; 21 | } 22 | } 23 | 24 | h2.middle { 25 | text-align: center; 26 | font-weight: 700; 27 | font-size: 2rem; 28 | margin: 2rem auto 4rem; 29 | letter-spacing: -0.035em; 30 | @include md { 31 | width: 75%; 32 | } 33 | } 34 | 35 | span.clear { 36 | display: block; 37 | clear: both; 38 | } 39 | 40 | #page-container { 41 | min-height: 100vh; 42 | position: relative; 43 | } 44 | 45 | #content-container { 46 | // padding-bottom: 6rem; 47 | } -------------------------------------------------------------------------------- /assets/scss/logtable.scss: -------------------------------------------------------------------------------- 1 | table { 2 | &#logs-table { 3 | border-spacing: 0; 4 | } 5 | font-family: $font-mono, monospace; 6 | width: 100%; 7 | 8 | th, td { 9 | padding: 10px 5px; 10 | line-height: 1.75; 11 | 12 | &.loghash { 13 | padding: 0 5px; 14 | } 15 | } 16 | 17 | td { 18 | border-top: 1px solid $col-lightgrey; 19 | } 20 | 21 | td.loading { 22 | text-align: center; 23 | padding: 3rem 0; 24 | } 25 | 26 | td.noborder { 27 | border-top: 1px solid white; 28 | } 29 | 30 | .uptime { 31 | text-align: right; 32 | } 33 | 34 | thead { 35 | th { 36 | font-weight: bold; 37 | text-align: left; 38 | &.orgcol { 39 | 40 | @include lg { 41 | width: 13rem; 42 | } 43 | } 44 | &.datecol { 45 | width: 6rem; 46 | } 47 | } 48 | } 49 | 50 | a { 51 | &:link, &:visited { 52 | color: $col-black; 53 | text-decoration: underline; 54 | &.loghash { 55 | text-decoration: none; 56 | display: inline-block; 57 | text-align: center; 58 | padding: 10px 0; 59 | width: 100%; 60 | } 61 | } 62 | &:hover, &:active { 63 | color: red; 64 | text-decoration: underline; 65 | &.loghash { 66 | text-decoration: none; 67 | } 68 | } 69 | } 70 | } 71 | 72 | .table-footnotes { 73 | text-align: right; 74 | font-family: $font-mono; 75 | font-size: 80%; 76 | margin: 1rem 0; 77 | color: $col-midgrey; 78 | } 79 | 80 | #logtable-disclaimer { 81 | text-align: center; 82 | font-family: $font-mono; 83 | margin: 3rem 0; 84 | } 85 | 86 | #show-logs { 87 | text-align: center; 88 | margin: 3rem 0; 89 | a { 90 | font-family: $font-mono, monospace; 91 | border-radius: 10px; 92 | padding: 1rem 2rem; 93 | color: white; 94 | display: inline-block; 95 | text-decoration: none; 96 | &:link, &:visited { 97 | background: $col-black; 98 | } 99 | &:hover, &:active { 100 | background: red; 101 | } 102 | } 103 | 104 | display: block; 105 | @include md { 106 | display: none; 107 | } 108 | } 109 | 110 | .cta { 111 | a.link { 112 | margin: 2rem 0; 113 | padding: 2rem 0; 114 | 115 | display: flex; 116 | flex-direction: column; 117 | 118 | background: #ccc; 119 | text-align: center; 120 | font-family: $font-mono; 121 | line-height: 1.75; 122 | 123 | display: block; 124 | 125 | &:link, &:visited { 126 | h4 { 127 | color: $col-bodyblack; 128 | } 129 | p { 130 | color: map-get(map-get($palettes, "logs"), "full"); 131 | } 132 | } 133 | 134 | &:hover, &:active { 135 | border: 1px solid $col-greyish; 136 | h4 { 137 | color: $col-bodyblack; 138 | text-decoration: none !important; 139 | } 140 | p { 141 | color: map-get(map-get($palettes, "logs"), "full"); 142 | text-decoration: underline; 143 | } 144 | } 145 | 146 | h4 { 147 | margin: 0; 148 | font-family: $font-sans, "Helvetica", "Arial", sans-serif; 149 | font-size: 1rem; 150 | font-weight: 700; 151 | letter-spacing: -0.035em; 152 | } 153 | 154 | p { 155 | margin: 0; 156 | } 157 | } 158 | 159 | @include md { 160 | width: 40%; 161 | margin: 2rem auto; 162 | } 163 | } -------------------------------------------------------------------------------- /assets/scss/stepbystep.scss: -------------------------------------------------------------------------------- 1 | #illustration-and-steps { 2 | position: relative; 3 | clear: both; 4 | margin-bottom: 3rem; 5 | 6 | @include md { 7 | display: flex; 8 | } 9 | } 10 | #large-illustration { 11 | display: none; 12 | 13 | @include md { 14 | display: block; 15 | flex:0 0 40%; 16 | width: 100%; 17 | z-index: 20; 18 | 19 | .svg-obj { 20 | width: 100%; 21 | } 22 | } 23 | @include lg { 24 | display: block; 25 | flex:0 0 50%; 26 | .svg-obj { 27 | width: unset; 28 | } 29 | } 30 | } 31 | #step-by-step { 32 | @include md { 33 | flex: 0 0 60%; 34 | z-index: 1; 35 | } 36 | @include lg { 37 | flex: 0 0 50%; 38 | } 39 | ol { 40 | list-style: none; 41 | margin: 0; 42 | padding: 0; 43 | position: relative; 44 | color: $col-black; 45 | 46 | > li { 47 | line-height: 1; 48 | 49 | color: $col-black; 50 | 51 | margin: 0; 52 | padding: 0; 53 | 54 | @include sm { 55 | margin: 0 0 2rem; 56 | margin-top: 0 !important; 57 | } 58 | 59 | @include md { 60 | margin: -3px 0 0; 61 | position: absolute; 62 | } 63 | 64 | .illustration { 65 | z-index:10; 66 | 67 | @include sm { 68 | margin: 2rem auto; 69 | } 70 | 71 | @include md { 72 | display: none; 73 | } 74 | } 75 | 76 | .arm-and-description { 77 | position: relative; 78 | 79 | @include sm { 80 | margin-top: 0 !important; 81 | } 82 | 83 | @include md { 84 | flex: 0 0 370px; 85 | justify-self: end; 86 | margin-left: 2rem; 87 | } 88 | 89 | .arm { 90 | display: none; 91 | @include md { 92 | border-top: 1px solid $col-black; 93 | width: 224px; 94 | height: 1px; 95 | display: block; 96 | position: absolute; 97 | top:40px; 98 | right: 100%; 99 | z-index: 1; 100 | } 101 | @include lg { 102 | width: 360px; 103 | } 104 | } 105 | 106 | .index { 107 | display: block !important; 108 | position: absolute; 109 | right: calc(100% + 5px); 110 | z-index: 10; 111 | font-family: $font-mono, monospace; 112 | } 113 | 114 | } 115 | 116 | .description { 117 | z-index: 3; 118 | background: white; 119 | border-left: 1px solid $col-black; 120 | padding: 0 0 0 1rem; 121 | margin: 0; 122 | overflow: auto; 123 | 124 | font-family: $font-mono, monospace; 125 | 126 | @include sm { 127 | font-size: 0.8rem; 128 | } 129 | 130 | @include md { 131 | font-size: 0.7rem; 132 | } 133 | 134 | @include lg { 135 | font-size: 0.8rem; 136 | } 137 | 138 | line-height: 1.75; 139 | 140 | h3 { 141 | margin: 0 0 0.5rem; 142 | font-weight: 600; 143 | color: $col-black; 144 | } 145 | 146 | ul { 147 | list-style: disc; 148 | li { 149 | line-height: 1.75; 150 | margin: 0 0 1rem; 151 | color: $col-bodyblack; 152 | } 153 | } 154 | 155 | p { 156 | color: $col-bodyblack; 157 | margin: 0 0 1rem; 158 | &:last-child { 159 | margin: 0; 160 | } 161 | } 162 | } 163 | 164 | } 165 | } 166 | } 167 | 168 | #merkle { 169 | clear: both; 170 | } -------------------------------------------------------------------------------- /assets/scss/typography.scss: -------------------------------------------------------------------------------- 1 | body { 2 | font-size: 15px; 3 | font-family: $font-sans, "Helvetica", "Arial", sans-serif; 4 | color: $col-black; 5 | -webkit-font-smoothing: antialiased; 6 | text-rendering: geometricPrecision; 7 | } 8 | 9 | p { 10 | line-height: 1.75; 11 | letter-spacing: -0.025rem; 12 | } 13 | 14 | p, li, dd, td { 15 | color: $col-bodyblack; 16 | } 17 | 18 | ::selection { 19 | background-color: $col-highlight; 20 | } 21 | 22 | a:link, a:visited { 23 | color: $col-black; 24 | text-decoration: underline; 25 | } 26 | 27 | a:hover, a:active { 28 | color: red; 29 | text-decoration: underline; 30 | } 31 | 32 | a.linkbutton { 33 | display: inline-block; 34 | border: 1px solid $col-black; 35 | border-radius: 2px; 36 | padding: 0.5rem 1rem; 37 | margin-right: 1rem; 38 | margin-bottom: 1rem; 39 | font-weight:bold; 40 | &:link, &:visited { 41 | text-decoration: none; 42 | background: #888; 43 | color: white; 44 | } 45 | &:hover, &:active { 46 | background: #333; 47 | color: white; 48 | } 49 | } 50 | 51 | *:focus { 52 | background-color: white; 53 | outline-color: #00B2A4; 54 | } -------------------------------------------------------------------------------- /assets/scss/wrap.scss: -------------------------------------------------------------------------------- 1 | .wrap { 2 | @include responsive-wrapper; 3 | 4 | @include sm { 5 | margin-left: 1.5rem; 6 | margin-right: 1.5rem; 7 | } 8 | 9 | &.flex { 10 | display: flex; 11 | flex-direction: column; 12 | justify-content: center; 13 | height: 100%; 14 | } 15 | 16 | &.bordered { 17 | border-top: 1px solid $col-greyish; 18 | } 19 | } 20 | 21 | .head-flex { 22 | display: flex; 23 | flex-direction: column; 24 | justify-content: center; 25 | height: 100%; 26 | } 27 | 28 | 29 | .wrap-outer { 30 | // min-height: 300px; 31 | clear: both; 32 | &.backdrop { 33 | margin: 0; 34 | @include sm { 35 | background: none; 36 | } 37 | @include md { 38 | overflow: hidden; 39 | background: url('../img/crosshair-grid.svg') no-repeat center top; 40 | // background-size: 906px; 41 | } 42 | 43 | @include lg { 44 | // background-size: 1267px; 45 | } 46 | } 47 | &.hero { 48 | @include md { 49 | overflow: hidden; 50 | background: url('../img/hero-grid.svg') no-repeat center 0; 51 | background-size: 955px; 52 | } 53 | @include lg { 54 | background-size: 1270px; 55 | } 56 | 57 | } 58 | 59 | &.noscroll { 60 | overflow: hidden; 61 | } 62 | 63 | &.tint, &.pad { 64 | padding-top: 3rem; 65 | padding-bottom: 3rem; 66 | } 67 | 68 | &.bordered { 69 | border-top: 1px solid $col-lightgrey; 70 | } 71 | } -------------------------------------------------------------------------------- /config.yaml: -------------------------------------------------------------------------------- 1 | # Copyright 2020 Google LLC 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | title: Certificate Transparency 16 | url: https://certificate.transparency.dev 17 | baseURL: https://certificate.transparency.dev 18 | disableKinds: 19 | - taxonomy 20 | - taxonomyTerm 21 | params: 22 | githubUrl: https://github.com/google/certificate-transparency-go 23 | googlegroup: https://groups.google.com/forum/#!forum/certificate-transparency 24 | 25 | markup: 26 | goldmark: 27 | renderer: 28 | unsafe: true 29 | 30 | -------------------------------------------------------------------------------- /content/community/img/community-header.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /content/community/img/how-we-grew.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /content/community/img/our-origin-story.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /content/community/img/our-successes.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /content/events/growth/CloudflareMonitor.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: CloudFlare CT monitor 3 | date: 2019-08-01 4 | --- 5 | 6 | CloudFlare launches a [CT Log monitoring service](https://blog.cloudflare.com/introducing-certificate-transparency-monitoring/) to help customers detect mississued certificates for their domains. 7 | -------------------------------------------------------------------------------- /content/events/growth/ComodoCTlog.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Comodo CT log 3 | date: 2017-03-01 4 | --- 5 | 6 | COMODO, a UK based CA, announces its contribution of a CT log to support the CT ecosystem. 7 | -------------------------------------------------------------------------------- /content/events/growth/DigicertMonitor.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: DigiCert CT monitor 3 | date: 2019-12-01 4 | --- 5 | 6 | DigiCert launches a [CT Log monitoring service](https://www.digicert.com/news/digicert-launches-ct-log-monitoring-now-available-in-secure-site-pro/) to help customers detect mississued certificates for their domains. 7 | -------------------------------------------------------------------------------- /content/events/growth/FacebookCTMonitor.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Facebook CT monitor 3 | date: 2016-12-01 4 | --- 5 | 6 | Facebook announces their [Certificate Transparency Monitoring Tool](https://www.facebook.com/notes/protect-the-graph/introducing-our-certificate-transparency-monitoring-tool/1811919779048165/) that allows website owners to monitor issues of certificates for domains they own. 7 | -------------------------------------------------------------------------------- /content/events/growth/LetsEncrypt.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Let's Encrypt CT monitor 3 | date: 2019-05-01 4 | --- 5 | 6 | [Let's Encrypt launch Oak](https://sectigo.com/blog/sectigo-is-sponsoring-a-certificate-transparency-ct-log-from-lets-encrypt-heres-why), a free and open Certificate Transparency Log. 7 | -------------------------------------------------------------------------------- /content/events/growth/MerkleTown.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: CloudFlare Merkle Town 3 | date: 2018-03-01 4 | isHeadline: true 5 | --- 6 | 7 | CloudFlare launches their [Nimbus CT log](https://blog.cloudflare.com/introducing-certificate-transparency-and-nimbus/) and [Merkle Town](http://merkle.town/), a site making it easy to monitor the CT ecosystems growth. 8 | -------------------------------------------------------------------------------- /content/events/growth/MicrosoftAD.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Microsoft AD 3 | date: 2018-04-01 4 | isHeadline: true 5 | --- 6 | 7 | Microsoft [announces support for Certificate Transparency](https://support.microsoft.com/en-us/help/4093260/introduction-of-ad-cs-certificate-transparency) in Active Directory Certificate Services. 8 | -------------------------------------------------------------------------------- /content/events/growth/crtsh.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: crt.sh 3 | date: 2015-09-01 4 | isHeadline: true 5 | --- 6 | 7 | [crt.sh](https://www.comodo.com/news/press_releases/2015/06/comodo-launches-new-certificate-transparency-search-web-site.html), a website offering a friendly environment to query Certificate Transparency logs is launched. 8 | -------------------------------------------------------------------------------- /content/events/growth/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | headless: true 3 | comment: This is a headless page, designed as a parent to hold event-grid content. 4 | --- -------------------------------------------------------------------------------- /content/events/origins/ChromeEV.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Chrome EV 3 | date: 2015-05-01 4 | --- 5 | 6 | Chrome announces that all EV certificates issued after January 1, 2015 will be required to be CT logged. 7 | -------------------------------------------------------------------------------- /content/events/origins/DigiNotarHack.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: DigiNotar Hack 3 | date: 2011-07-01 4 | isHeadline: true 5 | --- 6 | 7 | An unknown attacker compromises DigiNotar, a Dutch CA, and issues rogue certificates for numerous domains. Over 500 fake certificates are detected. These certificates were used for man-in-the-middle attacks on traffic from Iran. 8 | -------------------------------------------------------------------------------- /content/events/origins/FirstCTLog.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: First CT Log 3 | date: 2013-03-01 4 | isHeadline: true 5 | --- 6 | 7 | Google launches their CT logs pre-populated with the certificates discovered by their web crawler. 8 | -------------------------------------------------------------------------------- /content/events/origins/FirstThirdPartyLog.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: First third party log 3 | date: 2013-09-01 4 | --- 5 | 6 | DigiCert launches the first non-Google CT log to support the growth of the CT ecosystem. 7 | -------------------------------------------------------------------------------- /content/events/origins/IETF-RFC.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: IETF RFC 3 | date: 2013-06-01 4 | isHeadline: true 5 | --- 6 | 7 | The IETF publishes Certificate Transparency as RFC 6962. 8 | -------------------------------------------------------------------------------- /content/events/origins/IETFWorks.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: IETF works 3 | date: 2012-09-01 4 | --- 5 | 6 | The IETF accepts the Trans Working Group charter and begins work on the CT related RFCs. 7 | -------------------------------------------------------------------------------- /content/events/origins/TrustWavemistake.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: TrustWave issues root certificate to a customer 3 | date: 2012-02-01 4 | --- 5 | 6 | U.S. Certificate Authority TrustWave provided subordinate root certificates to a customer which could have been be used to create SSL certificates for nearly any domain on the Internet. CA missteps could lead to severe consequences. 7 | -------------------------------------------------------------------------------- /content/events/origins/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | headless: true 3 | comment: This is a headless page, designed as a parent to hold event-grid content. 4 | --- -------------------------------------------------------------------------------- /content/events/successes/AppleEnforcesCT.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Apple enforces CT 3 | isHeadline: true 4 | date: 2018-10-01 5 | --- 6 | 7 | All TLS certificates issued after October 15, 2018 must meet Apple's Certificate Transparency (CT) policy in order to be trusted on Apple platforms. 8 | -------------------------------------------------------------------------------- /content/events/successes/CertinomisMisissuance.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Certinomis misissuance 3 | date: 2019-05-01 4 | --- 5 | 6 | French CA is found to have misissued numerous certificates and is distrusted. -------------------------------------------------------------------------------- /content/events/successes/FacebookInternalPolicing.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Facebook polices certificates internally 3 | date: 2016-04-01 4 | isHeadline: true 5 | --- 6 | 7 | Facebook announces that [CT helped it detect an internal policy violation](https://www.facebook.com/notes/protect-the-graph/early-impacts-of-certificate-transparency/1709731569266987) and advocates for CT being required not only for EV certificates, but for all certificates issued by CAs. 8 | -------------------------------------------------------------------------------- /content/events/successes/GoogleEnforcesCT.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Chrome enforces CT for new TLS certificates 3 | date: 2018-05-01 4 | --- 5 | In version 68, Chrome began enforcing that all TLS server certificates issued after April 30, 2018 comply with the Chromium CT Policy in order to be trusted. Main page connections served over a non-compliant connection began to display a full page warning, and sub-resources served over a non-compliant connection stopped loading. 6 | -------------------------------------------------------------------------------- /content/events/successes/IzenpeReuse.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Izenpe reuses production keys 3 | date: 2016-05-01 4 | --- 5 | 6 | It is discovered that Izenpe, a Spanish CA and log operator reused their production CT log signing key for test/development purposes, and had inadvertently produced a split view of their log. As a result they are ultimately disqualified as a log operator. 7 | -------------------------------------------------------------------------------- /content/events/successes/WosignBackdatesCerts.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: WoSign backdates certificates 3 | date: 2017-07-01 4 | --- 5 | 6 | CT shows that Chinese CA WoSign/Startcom has backdated certificates, and would later be distrusted. 7 | -------------------------------------------------------------------------------- /content/events/successes/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | headless: true 3 | comment: This is a headless page, designed as a parent to hold event-grid content. 4 | --- -------------------------------------------------------------------------------- /content/events/successes/symantecmisissuance.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Symantec misissuance detected 3 | isHeadline: true 4 | date: 2017-09-01 5 | --- 6 | 7 | CT shows that US CA Symantec has misissued thousands of certificates. Ultimately all major platforms will distrust Symantec. -------------------------------------------------------------------------------- /content/google/index.html: -------------------------------------------------------------------------------- 1 | --- 2 | title: Google / Known Logs 3 | url: /google 4 | layout: index 5 | aliases: 6 | - /known-logs 7 | --- 8 |
9 |
10 | {{< read-markdown-file "/content/google/known-logs.md" >}} 11 |
12 |
13 | -------------------------------------------------------------------------------- /content/home/img/home-sample.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /content/home/img/home2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /content/home/img/home3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /content/home/img/home5.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /content/home/img/home6.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /content/home/img/home7.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /content/home/img/home8.svg: -------------------------------------------------------------------------------- 1 | 2 | 5 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | -------------------------------------------------------------------------------- /content/home/img/small/home2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /content/home/img/small/home3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /content/home/img/small/home5.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /content/home/img/small/home8.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /content/howctworks/img/how-it-works-header-small.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | -------------------------------------------------------------------------------- /content/howctworks/img/how-it-works-header.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | -------------------------------------------------------------------------------- /content/howctworks/img/stepby/2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 02 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /content/howctworks/img/stepby/9.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 09 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /content/howctworks/merkle.md: -------------------------------------------------------------------------------- 1 | ### Merkle Trees 2 | 3 | ![](img/merkle/merkle1.svg) 4 | 5 | CT logs use a cryptographic mechanism called Merkle trees to make it easier to publicly audit certificates and logs. Merkle trees are simple binary trees, made up of hashed leaves and nodes. **Leaves** are individual certificates that have been appended to the log. **Nodes** are the hashes of paired leaves. The root hash, or Merkle tree hash, is the concatenation of all the nodes and leaves. When the log server signs the **Merkle tree hash**, it’s called a signed tree head (STH). 6 | 7 | ### Cryptographically checking logs 8 | 9 | ![](img/merkle/merkle2.svg) 10 | 11 | 12 | 13 | Monitors and auditors regularly use consistency proofs to verify that logs are behaving properly. 14 | 15 | The consistency proof is the minimum set of intermediate node hashes you need to compute that: 16 | 17 | - The old Merkle tree hash **M** is a subset of the **new
 Merkle tree hash.** 18 | 19 | - The new **Merkle tree hash** is the concatenation of 
the old Merkle tree hash **M**, plus all the intermediate node hashes of the newly appended 
certificates. 20 | 21 | ![](img/merkle/merkle3.svg) 22 | 23 | In this example, the consistency proof consists of the following intermediate node hashes: **M**, **K** and **L**. 24 | 25 | Use **K** and **M** to create the old Merkle tree hash. This verifies that the old tree exists and is unchanged. 26 | 27 | You can then use **L** with **K** to create **N**. And then, use **N** with **M** to create the new Merkle tree hash for the log. If this Merkle tree hash matches the one advertised by the log, you have proved that the log is consistent. 28 | 29 | A monitor can calculate the consistency proof by itself and verify the consistency of a log, because it typically has the entire list of certificates that are in a log. 30 | 31 | Auditors can simply query a log server and get the consistency proof for any two signed tree heads. 32 | 33 | ### Showing a certificate is in a log 34 | 35 | Anyone can request a Merkle audit proof from a log and verify that a certificate is in the log. If a Merkle audit proof doesn’t produce a root hash that matches the Merkle tree hash, the certificate is not in the log. It’s really important to be able to verify that a specific certificate has been included in a log. CT demands that all TLS clients reject any certificates that do not show up in a certificate log. 36 | 37 | ![](img/merkle/merkle4.svg) 38 | 39 | Say you want to verify that certificate **c3** (leaf **D**) has been appended to the log. The Merkle audit proof is the missing node hashes that are needed to compute all the nodes between the leaf and tree root. If the root has you compute from the audit path matches the Merkle tree hash for the log, the certificate is in the log. 40 | 41 | Here the Merkle audit proof consists of the following node hashes: **C, I, N.** 42 | 43 | - You already know **D**, so you can use **C** to compute **J**. 44 | - You can then use **I** and **J** to compute **M**, and you can use **N** and **M** to compute the Merkle tree hash for the log. 45 | - If you want to verify that certificate **c4** has been appended to the log, the log would send you a consistency proof with the following node hashes: **F, L, M.** 46 | - You already know the leaf hash (**E**), which means you can use leaf hash **F** to calculate node hash **K**. 47 | You can then use node hash **L** to compute node hash **N**, and you can use node hash **M** and **N** to compute the Merkle tree hash for the log. -------------------------------------------------------------------------------- /content/logs/index.html: -------------------------------------------------------------------------------- 1 | --- 2 | title: Logs 3 | url: /logs 4 | layout: index 5 | --- 6 |
7 |
8 |
9 |
10 | 11 | 12 |
13 |
14 |
Logs
15 |

The list of current,
usable logs

16 |
17 |
18 |

Certificate Transparency logs are "append-only" and publicly-auditable ledgers of certificates being created, updated, and expired.

19 | 23 |
24 |
25 |
26 |
27 |
28 |
29 | 30 |
31 |
32 | 48 |
49 |
50 | 51 |
52 |
53 |
54 |

All Usable Logs

55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 |
OrganisationLog nameStartEndUptime (%)*
Loading logs...
69 | 70 |
71 | *Uptime as measured by Google's network perspectives. 72 |
73 | 74 |
75 | For production use, please refer to the published log lists from user agents. 76 |
77 | 78 | 96 |
97 |
98 | -------------------------------------------------------------------------------- /content/monitors/index.html: -------------------------------------------------------------------------------- 1 | --- 2 | title: Monitors 3 | url: /monitors 4 | layout: index 5 | aliases: 6 | - /resources-for-site-owners 7 | --- 8 |
9 |
10 |
11 |
12 | 13 | 14 |
15 |
16 |
Monitors
17 |

The list of existing monitors

18 |
19 |
20 |

Monitors make sure that all logged certificates are visible in the log and watch for suspicious certificates in logs

21 | 25 |
26 |
27 |
28 |
29 |
30 | 31 |
32 |
33 | 49 |
50 |
51 | -------------------------------------------------------------------------------- /content/stepbystep/1.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Website owner requests a certificate from the Certificate Authority (CA) 3 | weight: 1 4 | marginTop: 260 5 | marginTopMd: 140 6 | --- 7 | A certificate ties together a domain and a public key. Certificate Transparency works with Web PKI/SSL certificate system, providing transparency and verification. The append-only log is tamper-proof, the User agent checks that logs are cryptographically consistent, and the Certificate Authority's monitors will check for suspicious logs. -------------------------------------------------------------------------------- /content/stepbystep/2.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: CA issues a precertificate 3 | weight: 2 4 | marginTop: 659 5 | marginTopMd: 379 6 | --- 7 | A CA receives a request for a certificate from a domain owner. It checks that the domain owner has the right to request the certificate, and creates a precertificate, which ties the domain to a public key. A precertificate contains all the information a certificate does. It also has a poison extension so that user agents won’t accept it. Precertificates help break a deadlock in CT. Before a CA can log a certificate, the certificate needs an SCT (Signed Certificate Timestamp). But for the certificate to get an SCT, it needs to have been submitted to a log. -------------------------------------------------------------------------------- /content/stepbystep/3.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: CA sends precertificates to logs 3 | weight: 3 4 | marginTop: 1076 5 | marginTopMd: 627 6 | --- 7 | Anyone can submit a certificate to a log, but most of them are submitted by CAs. When a CA submits one of these to a log, the log responds with a signed certificate timestamp (SCT). This is a promise to add the certificate to the log within a time period called the Maximum Merge Delay (MMD). -------------------------------------------------------------------------------- /content/stepbystep/4.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Precertificates are added to the logs 3 | weight: 4 4 | marginTop: 1487 5 | marginTopMd: 874 6 | overflowAt: 420 7 | --- 8 | Logs maintain a record of certificates. They use a special cryptographic mechanism, a Merkle tree, to allow public audits. Logs are: 9 | 10 | - Append-only. Certificates can only be added to a log, not deleted, modified, or retroactively inserted. 11 | - Cryptographically assured. They use Merkle trees which prevent tampering and misbehaviour. 12 | - Publicly auditable. Anyone can query a log and verify that it’s well behaved, or verify a SSL certificate or precertificate has been legitimately appended to the log. 13 | 14 | Merkle trees are simple binary trees, made up of leaves and nodes. In CT, leaves are the hashes of individual certificates that have been appended to the log. Nodes are the hashes of paired child leaves or paired child nodes. The root hash, from which all nodes and leaves stem, is also a Merkle tree. When the log server signs the root Merkle tree it creates a Signed Tree Head (STH). Periodically, a log appends all the new certificates to the log. It creates a separate Merkle tree hash with the new certificates. It then combines this Merkle tree with the old Merkle tree to form a new Merkle tree. The new Merkle tree hash is then signed to create a new Signed Tree Head. -------------------------------------------------------------------------------- /content/stepbystep/5.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Logs return SCTs to the CA 3 | weight: 5 4 | marginTop: 2215 5 | marginTopMd: 1311 6 | overflowAt: 260 7 | --- 8 | Each log immediately returns an SCT to the CA, with a commitment to include the certificate within the Maximum Merge Delay. The MMD is usually 24 hours: this timespan is designed to give log operators the time to fix anything that's gone wrong before they are excluded from the list of approved logs. The MMD also helps ensure logs don’t block the issuance or use of certificates. 9 | 10 | CAs attach SCTs to a certificate using an X.509v3 extension. They sign the certificate and deliver the certificate to the server operator. (There are also two other, less common, ways of doing this: OCSP stapling and TLS extension.) CT doesn’t require server modification, so server operators can manage SSL certificates the way they always have. -------------------------------------------------------------------------------- /content/stepbystep/6.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: CAs send the certificate to the domain owner 3 | weight: 6 4 | marginTop: 2690 5 | marginTopMd: 1596 6 | --- 7 | The SCTs accompany the certificate throughout its lifetime. A server must deliver the SCT with the certificate during a TLS handshake. (A TLS handshake is when two sides of an encrypted communication verify each other and agree which encryption algorithms and keys to use. Here, that process begins when a user goes to an HTTPS website, and the web server responds to the HTTPS request.) -------------------------------------------------------------------------------- /content/stepbystep/7.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Browsers and user agents help keep the web secure 3 | weight: 7 4 | marginTop: 3361 5 | marginTopMd: 1997 6 | --- 7 | Some browsers, like Chrome and Safari, help enforce CT. 8 | 9 | Both the number of logs, and the selection of logs a CA chooses to log, is determined by user agent policy. Both [Safari](https://support.apple.com/en-gb/HT205280) and [Chrome](https://github.com/chromium/ct-policy#chromium-certificate-transparency-policy) user agents require at least 2 SCTs, depending on certificate lifetimes. 10 | -------------------------------------------------------------------------------- /content/stepbystep/8.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Logs are cryptographically monitored 3 | weight: 8 4 | marginTop: 4070 5 | marginTopMd: 2431 6 | --- 7 | Monitors are publicly run servers. They periodically contact all log servers and watch for suspicious certificates. Monitors work with website operators to help them understand if an unauthorized certificate has been issued for a domain. They can watch for certificates that have unusual extensions or permissions, such as certificates that have CA capabilities. Monitors can prove, efficiently and quickly, that all certificates have been consistently appended to the log. They can also prove that a particular certificate has been appended to the log. 8 | 9 | For a monitor to check the consistency of a particular log, it computes a consistency proof itself and then uses this to verify the consistency of the log. A consistent later version includes everything in the earlier version, and following the entries from the older version. 10 | 11 | If a monitor ever needs to verify that a particular certificate exists in a log, it can compute an audit proof itself and use it to verify the presence of that certificate. 12 | 13 | Some monitors are run by companies and organizations. Others will be run as subscription services for domain owners and certificate authorities. Individuals can also run their own monitors. 14 | 15 | -------------------------------------------------------------------------------- /content/stepbystep/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | headless: true 3 | comment: This is a headless page, designed as a parent to hold step-by-step content. 4 | --- -------------------------------------------------------------------------------- /content/user_agents/index.html: -------------------------------------------------------------------------------- 1 | --- 2 | title: User Agents 3 | url: /useragents 4 | layout: index 5 | --- 6 |
7 |
8 |
9 |
10 | 11 | 12 |
13 |
14 |
User Agents
15 |

User agents using CT

16 |
17 |
18 |

User agents are typically browsers and help perform certificate auditing by verifying that certificates have legitimately been added to a log.

19 | 23 |
24 |
25 |
26 |
27 |
28 | 29 |
30 |
31 | 47 |
48 |
49 | -------------------------------------------------------------------------------- /data/certcount.json: -------------------------------------------------------------------------------- 1 | { 2 | "count": 2563437540, 3 | "asof": "2020-03-24" 4 | } -------------------------------------------------------------------------------- /data/logs.json: -------------------------------------------------------------------------------- 1 | { 2 | "logs": [ 3 | { 4 | "name": "Cloudflare", 5 | "url": "https://blog.cloudflare.com/introducing-certificate-transparency-and-nimbus/", 6 | "description": "", 7 | "logo": "cloudflare.svg" 8 | }, 9 | { 10 | "name": "Digicert", 11 | "url": "https://www.digicert.com/blog/digicerts-certificate-transparency-log-approved/", 12 | "description": "", 13 | "logo": "digicert.svg" 14 | }, 15 | { 16 | "name": "Google", 17 | "url": "https://github.com/google/certificate-transparency-community-site/blob/master/docs/google/known-logs.md", 18 | "description": "", 19 | "logo": "google.svg" 20 | }, 21 | { 22 | "name": "Let's Encrypt", 23 | "url": "https://letsencrypt.org/2019/05/15/introducing-oak-ct-log.html", 24 | "description": "", 25 | "logo": "lets-encrypt.svg" 26 | }, 27 | { 28 | "name": "Sectigo", 29 | "url": "https://github.com/sectigo/CTLogs-AcceptedRoots/", 30 | "description": "", 31 | "logo": "sectigo.svg" 32 | }, 33 | { 34 | "name": "TrustAsia", 35 | "url": "https://ct.trustasia.com/blog/english/", 36 | "description": "", 37 | "logo": "trustasia.svg" 38 | } 39 | ] 40 | } 41 | -------------------------------------------------------------------------------- /data/monitors.json: -------------------------------------------------------------------------------- 1 | { 2 | "monitors": [ 3 | { 4 | "name": "Censys", 5 | "url": "https://search.censys.io", 6 | "description": "Identify expired or misconfigured SSL/TLS certificates and track vendor compliance.", 7 | "logo": "censys.png" 8 | }, 9 | { 10 | "name": "Cloudflare", 11 | "url": "https://blog.cloudflare.com/introducing-certificate-transparency-monitoring/", 12 | "description": "Get an email every time a certificate is issued for one of your monitored domains.", 13 | "logo": "cloudflare.svg" 14 | }, 15 | { 16 | "name": "crt.sh", 17 | "url": "https://crt.sh/", 18 | "description": "Certificate Search, by Sectigo.", 19 | "logo": "crt.sh.svg" 20 | }, 21 | { 22 | "name": "Digicert", 23 | "url": "https://docs.digicert.com/certificate-tools/ct-log-monitoring-service", 24 | "description": "Monitor Certificate Transparency logs for your domains. Available to Secure Site Pro certificate orders.", 25 | "logo": "digicert.svg" 26 | }, 27 | { 28 | "name": "Entrust", 29 | "url": "https://ui.ctsearch.entrust.com/ui/ctsearchui", 30 | "description": "See Who’s Issued SSL/TLS Certificates to Your Domain Name.", 31 | "logo": "entrust.svg" 32 | }, 33 | { 34 | "name": "EZMonitor", 35 | "url": "https://www.keytos.io/ezmonitor_overview.html", 36 | "description": "Proactively monitor the health of your SSL certificates and endpoints. Get notified before a problem occurs.", 37 | "logo": "Keytos.svg" 38 | }, 39 | { 40 | "name": "Facebook", 41 | "url": "https://developers.facebook.com/tools/ct/search/", 42 | "description": "Get a Facebook notification or Webhook callback every time a certificate is issued for one of your monitored domains.", 43 | "logo": "facebook_nocrop.png" 44 | }, 45 | { 46 | "name": "Hardenize", 47 | "url": "https://www.hardenize.com/product/ct", 48 | "description": "Comprehensive network infrastructure discovery and monitoring, with focus on PKI and Certificate Transparency.", 49 | "logo": "hardenize.svg" 50 | }, 51 | { 52 | "name": "Merklemap", 53 | "url": "https://www.merklemap.com/", 54 | "description": "Certificate transparency search engine.", 55 | "logo": "merklemap.svg" 56 | }, 57 | { 58 | "name": "Red Sift", 59 | "url": "https://redsift.com/pulse-platform/certificates-lite", 60 | "description": "Track and manage certificate expirations effortlessly.", 61 | "logo": "RedSift.svg" 62 | }, 63 | { 64 | "name": "Report URI", 65 | "url": "https://report-uri.com/products/certificate_transparency_monitoring", 66 | "description": "Receive notifications when certificates are issued for any of your domains.", 67 | "logo": "report-uri.svg" 68 | }, 69 | { 70 | "name": "SSLMate", 71 | "url": "https://sslmate.com/certspotter/", 72 | "description": "Monitor domains for expiring and unauthorized SSL certificates and get notified if there’s a problem.", 73 | "logo": "sslmate.svg" 74 | }, 75 | { 76 | "name": "Stellastra", 77 | "url": "https://stellastra.com/solution/certificate-transparency-log-monitor/", 78 | "description": "Monitor for Unauthorized, Expiring, and Maliciously Issued SSL/TLS Certificates.", 79 | "logo": "stellastra.svg" 80 | } 81 | ] 82 | } 83 | -------------------------------------------------------------------------------- /data/operators.json: -------------------------------------------------------------------------------- 1 | { 2 | "operators": [ 3 | { 4 | "name": "Apple", 5 | "url": "https://apple.com", 6 | "logo": "apple.svg" 7 | }, 8 | { 9 | "name": "Google", 10 | "url": "https://github.com/chromium/ct-policy/blob/master/ct_policy.md#qualifying-certificate", 11 | "logo": "google.svg" 12 | }, 13 | { 14 | "name": "Censys", 15 | "url": "https://censys.io/certificates", 16 | "customWidth": 130, 17 | "logo": "censys.png" 18 | }, 19 | { 20 | "name": "Cloudflare", 21 | "url": "https://developers.cloudflare.com/ssl/certificate-transparency-monitoring", 22 | "logo": "cloudflare.svg" 23 | }, 24 | { 25 | "name": "Digicert", 26 | "url": "https://www.digicert.com/certificate-transparency/overview.htm", 27 | "logo": "digicert.svg" 28 | }, 29 | { 30 | "name": "Facebook", 31 | "url": "https://www.facebook.com/notes/protect-the-graph/introducing-our-certificate-transparency-monitoring-tool/1811919779048165/", 32 | "logo": "facebook.png" 33 | }, 34 | { 35 | "name": "Let's Encrypt", 36 | "url": "https://letsencrypt.org/2019/11/20/how-le-runs-ct-logs.html", 37 | "logo": "lets-encrypt.svg" 38 | }, 39 | { 40 | "name": "Sectigo", 41 | "url": "https://sectigo.com/ssl-certificates-tls", 42 | "logo": "sectigo.svg" 43 | }, 44 | { 45 | "name": "SSLMate", 46 | "url": "https://sslmate.com/certspotter/", 47 | "logo": "sslmate.svg" 48 | } 49 | ] 50 | } 51 | -------------------------------------------------------------------------------- /data/user_agents.json: -------------------------------------------------------------------------------- 1 | { 2 | "user_agents": [ 3 | { 4 | "name": "Google Chrome", 5 | "url": "https://github.com/chromium/ct-policy#chromium-certificate-transparency-policy", 6 | "description": "Supporting CT since early 2015", 7 | "logo": "chrome-logo.svg", 8 | "customWidth": 90, 9 | "textTitle": true 10 | }, 11 | { 12 | "name": "Apple Safari", 13 | "url": "https://support.apple.com/en-gb/HT205280", 14 | "description": "Supporting CT since 2018", 15 | "logo": "apple.svg", 16 | "customWidth": 70, 17 | "textTitle": true 18 | }, 19 | { 20 | "name": "Brave", 21 | "url": "https://github.com/brave/brave-browser/wiki/TLS-Policy#certificate-transparency", 22 | "description": "Supporting CT since 2023", 23 | "logo": "brave.svg", 24 | "customWidth": 75, 25 | "textTitle": true 26 | }, 27 | { 28 | "name": "Firefox", 29 | "url": "https://wiki.mozilla.org/SecurityEngineering/Certificate_Transparency#CT_Policy", 30 | "description": "Supporting CT since 2025", 31 | "logo": "firefox.svg", 32 | "customWidth": 75, 33 | "textTitle": true 34 | } 35 | ] 36 | } 37 | -------------------------------------------------------------------------------- /docs/google/chrome_scts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/certificate-transparency-community-site/7ce678f7bc0a7ffcd7d186c38f74c25591cb9cf1/docs/google/chrome_scts.png -------------------------------------------------------------------------------- /layouts/404.html: -------------------------------------------------------------------------------- 1 | {{/* 2 | Copyright 2020 Google LLC 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | https://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */}} 16 | 17 | {{ define "main" }} 18 |
19 |
20 |
21 |
22 | 23 | 24 |
25 |
Page not found
26 |

These are not the logs you're looking for

27 | 28 |
29 |

Certificate Transparency works thanks to the ecosystem of people and organizations who set up and run logs and monitors.

30 |
31 |
32 |
33 |
34 |
35 |
36 | 37 | 38 | {{ end }} -------------------------------------------------------------------------------- /layouts/_default/baseof.html: -------------------------------------------------------------------------------- 1 | {{/* 2 | Copyright 2020 Google LLC 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | https://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */}} 16 | 17 | 18 | 19 | 20 | {{- partial "head.html" . -}} 21 | {{- if .IsHome }} 22 | 23 | {{- else }} 24 | 25 | {{- end }} 26 |
27 |
28 | {{- partial "topnav.html" . -}} 29 | 30 | {{- block "main" . }} 31 | {{- end }} 32 | 33 | {{- block "bigfooter" . }} 34 | {{- end }} 35 |
36 | 37 | 40 |
41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /layouts/_default/index.html: -------------------------------------------------------------------------------- 1 | {{/* 2 | Copyright 2020 Google LLC 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | https://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */}} 16 | 17 | {{ define "main"}} 18 | {{ .Content }} 19 | {{end}} -------------------------------------------------------------------------------- /layouts/home.html: -------------------------------------------------------------------------------- 1 | {{/* 2 | Copyright 2020 Google LLC 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | https://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */}} 16 | 17 | {{ define "main"}} 18 | {{ with $.Site.GetPage "content" "home" }}{{.Content}}{{end}} 19 | {{end}} -------------------------------------------------------------------------------- /layouts/partials/card.html: -------------------------------------------------------------------------------- 1 | {{/* 2 | Copyright 2020 Google LLC 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | https://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */}} 16 | 17 |
  • 18 | 19 |
    20 | {{ if .logo }} 21 |
    22 | 24 |
    25 | {{ else }} 26 |

    {{.name}}

    27 | {{ end }} 28 |
    29 |
    30 | {{ if .textTitle }} 31 |

    {{.name}}

    32 | {{ end }} 33 |
    {{.description}}
    34 |
    35 |
    36 | {{$svg := "static/img/arrow-cards.svg" }} 37 | {{ $svg | readFile | safeHTML }} 38 |
    39 |
    40 |
  • -------------------------------------------------------------------------------- /layouts/partials/footer.html: -------------------------------------------------------------------------------- 1 | {{/* 2 | Copyright 2020 Google LLC 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | https://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */}} 16 | 17 | 49 | -------------------------------------------------------------------------------- /layouts/partials/head.html: -------------------------------------------------------------------------------- 1 | {{/* 2 | Copyright 2020 Google LLC 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | https://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */}} 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | {{ if .Title }}{{.Title}} : {{end}}Certificate Transparency 24 | 25 | 26 | 27 | 28 | {{- partial "styles.html"}} 29 | 30 | {{ $waypoints := resources.Get "/js/noframework.waypoints.min.js" }} 31 | {{ $countup := resources.Get "/js/countUp.min.js" }} 32 | {{ $siteJS := resources.Get "/js/site.js" }} 33 | 34 | {{ $js := slice $waypoints $countup $siteJS | resources.Concat "js/bundle.js" | resources.Minify | resources.Fingerprint }} 35 | 36 | 37 | -------------------------------------------------------------------------------- /layouts/partials/styles.html: -------------------------------------------------------------------------------- 1 | {{/* 2 | Copyright 2020 Google LLC 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | https://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */}} 16 | 17 | {{/* this is all so we get sensible sourcemaps. Likely to be fixed around Hugo 0.63/0.64 */}} 18 | {{- $sassOptions := dict "targetPath" "/css/ct.css" -}} 19 | 20 | {{- if eq hugo.Environment "production" -}} 21 | {{- $sassOptions = merge $sassOptions (dict "outputStyle" "compressed") -}} 22 | {{- else -}} 23 | {{- $sassOptions = merge $sassOptions (dict "enableSourceMap" true) -}} 24 | {{- end -}} 25 | 26 | {{- $style := resources.Get "scss/ct.scss" | toCSS $sassOptions -}} 27 | 28 | {{- if eq hugo.Environment "production" -}} 29 | {{- $style = $style | postCSS | fingerprint -}} 30 | {{- end }} 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /layouts/partials/topnav.html: -------------------------------------------------------------------------------- 1 | {{/* 2 | Copyright 2020 Google LLC 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | https://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */}} 16 | 17 | 49 | -------------------------------------------------------------------------------- /layouts/shortcodes/abs.html: -------------------------------------------------------------------------------- 1 | {{/* 2 | Copyright 2020 Google LLC 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | https://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */}} 16 | 17 | {{ with .Get 0 }} 18 | {{- absURL . -}} 19 | {{ end }} 20 | -------------------------------------------------------------------------------- /layouts/shortcodes/approved-logs-rows.html: -------------------------------------------------------------------------------- 1 | {{/* 2 | Copyright 2020 Google LLC 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | https://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */}} 16 | 17 | {{ range $j, $operator := $.Site.Data.consolidated_log_list}} 18 | {{ range $i, $log := $operator}} 19 | 20 | {{if eq $i 0}} 21 | 22 | {{ .operator }} 23 | 24 | {{ else}} 25 | 26 | {{ end}} 27 | 28 | 29 | {{ .description}} 30 | 31 | {{ if .temporal_interval.start_inclusive}} 32 | {{ $time := .temporal_interval.start_inclusive | time}} 33 | {{ $time.Format "2006-01-02" }} 34 | {{ end}} 35 | 36 | 37 | {{ if .temporal_interval.end_exclusive}} 38 | {{ $time := .temporal_interval.end_exclusive | time}} 39 | {{ $time.Format "2006-01-02" }} 40 | {{ end}} 41 | 42 | {{ .uptime }} 43 | 44 | {{ end }} 45 | {{ end }} -------------------------------------------------------------------------------- /layouts/shortcodes/bigfooter.html: -------------------------------------------------------------------------------- 1 | {{/* 2 | Copyright 2020 Google LLC 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | https://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */}} 16 | 17 |
    18 |
    19 |
    {{.Inner}}
    20 |
    21 |
    -------------------------------------------------------------------------------- /layouts/shortcodes/certcount.html: -------------------------------------------------------------------------------- 1 | {{/* 2 | Copyright 2020 Google LLC 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | https://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */}} 16 | 17 | {{ lang.NumFmt 0 .Site.Data.certcount.count }} -------------------------------------------------------------------------------- /layouts/shortcodes/embedfile.html: -------------------------------------------------------------------------------- 1 | {{/* 2 | Copyright 2020 Google LLC 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | https://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */}} 16 | 17 | {{ if .Get "md"}} 18 | {{ readFile (.Get "src") | markdownify }} 19 | {{ else }} 20 | {{ readFile (.Get "src") }} 21 | {{ end }} -------------------------------------------------------------------------------- /layouts/shortcodes/event-grid.html: -------------------------------------------------------------------------------- 1 | {{/* 2 | Copyright 2020 Google LLC 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | https://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */}} 16 | 17 | {{ $dir := printf "/events/%s" (.Get 0)}} 18 | {{ $bundle := .Site.GetPage $dir }} 19 | {{ $events := $bundle.Resources.Match "*" }} 20 | 21 | {{ range $index, $event := sort $events "Date"}} 22 |
    23 |
    24 |
    25 | {{ if .Params.hideMonth}} 26 | {{ .Date.year}} 27 | {{ else }} 28 | {{.Date.Month}} {{.Date.Year}} 29 | {{ end }} 30 |
    31 |

    {{.Title}}

    32 | {{.Content}} 33 |
    34 |
    35 | {{ end }} 36 | -------------------------------------------------------------------------------- /layouts/shortcodes/logs-grid.html: -------------------------------------------------------------------------------- 1 | {{/* 2 | Copyright 2020 Google LLC 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | https://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */}} 16 | 17 | {{ range $.Site.Data.logs.logs }} 18 | {{ partial "card.html" .}} 19 | {{ end }} -------------------------------------------------------------------------------- /layouts/shortcodes/monitor-grid.html: -------------------------------------------------------------------------------- 1 | {{/* 2 | Copyright 2020 Google LLC 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | https://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */}} 16 | 17 | {{ range $.Site.Data.monitors.monitors }} 18 | {{ partial "card.html" .}} 19 | {{ end }} -------------------------------------------------------------------------------- /layouts/shortcodes/operator-list.html: -------------------------------------------------------------------------------- 1 | {{/* 2 | Copyright 2020 Google LLC 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | https://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */}} 16 | 17 | {{ range $.Site.Data.operators.operators }} 18 |
  • 19 | 20 | {{.name}} logo 21 | 22 |
  • 23 | {{ end }} -------------------------------------------------------------------------------- /layouts/shortcodes/read-markdown-file.html: -------------------------------------------------------------------------------- 1 | {{ readFile (.Get 0) | markdownify }} 2 | -------------------------------------------------------------------------------- /layouts/shortcodes/siteparams.html: -------------------------------------------------------------------------------- 1 | {{/* 2 | Copyright 2020 Google LLC 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | https://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */}} 16 | 17 | {{- with .Get 0 -}} 18 | {{- $data := index $.Site.Params . -}} 19 | {{- $data -}} 20 | {{- end -}} -------------------------------------------------------------------------------- /layouts/shortcodes/step-by-step-blocks.html: -------------------------------------------------------------------------------- 1 | {{/* 2 | Copyright 2020 Google LLC 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | https://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */}} 16 | 17 | {{ $stepbyBundle := .Site.GetPage "/stepbystep" }} 18 | {{ $steps := $stepbyBundle.Resources.Match "*.md" }} 19 |
      20 | {{ range $index, $step := $steps}} 21 |
    1. 22 |
      23 | 25 |
      26 |
      27 |
      28 |
      29 | 30 |
      31 |

      {{.Title}}

      32 |
      33 | {{.Content}} 34 |
      35 |
      36 |
      37 |
    2. 38 | {{ end }} 39 |
    -------------------------------------------------------------------------------- /layouts/shortcodes/svg.html: -------------------------------------------------------------------------------- 1 | {{/* 2 | Copyright 2020 Google LLC 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | https://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */}} 16 | 17 | {{$svg := .Get 0}} 18 | {{ $svg | readFile | safeHTML }} -------------------------------------------------------------------------------- /layouts/shortcodes/ua-grid.html: -------------------------------------------------------------------------------- 1 | {{/* 2 | Copyright 2020 Google LLC 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | https://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */}} 16 | 17 | {{ range $.Site.Data.user_agents.user_agents }} 18 | {{ partial "card.html" .}} 19 | {{ end }} -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "devDependencies": { 3 | "autoprefixer": "^10.4.16", 4 | "axios": "^1.7.4", 5 | "csv-parse": "^4.8.7", 6 | "deepmerge": "^4.2.2", 7 | "lodash": "^4.17.19", 8 | "postcss-cli": "^10.1.0", 9 | "postcss-custom-media": "^10.0.1" 10 | }, 11 | "scripts": { 12 | "get_latest_logs": "node scripts/get_latest_logs.js", 13 | "get_uptime": "node scripts/get_uptime.js", 14 | "process_logs": "node scripts/process_logs.js", 15 | "download_and_process_logs": "npm run get_latest_logs && npm run get_uptime && npm run process_logs", 16 | "update_certificate_count": "node scripts/update_certcount.js" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2020 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | module.exports = { 18 | plugins: [ 19 | require('autoprefixer'), 20 | require('postcss-custom-media') 21 | ] 22 | } -------------------------------------------------------------------------------- /scripts/download_google_logs.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2020 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | const https = require('https'), 18 | fs = require('fs'), 19 | path = require('path'), 20 | url = require('url'); 21 | 22 | 23 | const dataPath = path.join(__dirname, '..', 'data'); 24 | 25 | function download(urlString, filename="", log=true) { 26 | if(filename==="") { 27 | const downloadUrl = new URL(urlString); 28 | const urlFile = downloadUrl.pathname.substring(downloadUrl.pathname.lastIndexOf('/')+1); 29 | 30 | filename = path.join(dataPath, urlFile); 31 | } 32 | const file = fs.createWriteStream(filename); 33 | 34 | https.get(urlString, (response) => { 35 | if(log) { 36 | console.log(`Downloading latest Google Log List to ${filename}`); 37 | } 38 | response.pipe(file); 39 | }); 40 | } 41 | 42 | const googleLogList = "https://www.gstatic.com/ct/log_list/v3/all_logs_list.json"; 43 | 44 | const filePath = path.join(dataPath, 'log_list.json' ); 45 | 46 | download(googleLogList, filePath); 47 | -------------------------------------------------------------------------------- /scripts/get_latest_logs.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2020 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | const https = require('https'), 18 | fs = require('fs'), 19 | path = require('path'); 20 | 21 | const dataPath = path.join(__dirname, '..', 'data'); 22 | 23 | const logSources = [ 24 | { 25 | name: "apple", 26 | url: "https://valid.apple.com/ct/log_list/current_log_list.json", 27 | tempfile: "apple_current_logs.json", 28 | 29 | }, 30 | { 31 | name: "google", 32 | url: "https://www.gstatic.com/ct/log_list/v3/all_logs_list.json", 33 | tempfile: "google_current_logs.json", 34 | } 35 | ]; 36 | 37 | function download(urlString, filename="", log=true) { 38 | if(filename==="") { 39 | const downloadUrl = new URL(urlString); 40 | const urlFile = downloadUrl.pathname.substring(downloadUrl.pathname.lastIndexOf('/')+1); 41 | 42 | filename = path.join(dataPath, urlFile); 43 | } 44 | const file = fs.createWriteStream(filename); 45 | 46 | https.get(urlString, (response) => { 47 | if(log) { 48 | console.log(`Downloading ${urlString} to ${filename}`); 49 | } 50 | response.pipe(file); 51 | }); 52 | } 53 | 54 | logSources.forEach(source => { 55 | const outputPath = path.join(dataPath, source.tempfile); 56 | download(source.url, outputPath); 57 | }); 58 | -------------------------------------------------------------------------------- /scripts/get_uptime.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2020 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | const https = require('https'), 18 | fs = require('fs'), 19 | path = require('path'); 20 | 21 | function download(urlString, filename="", log=true) { 22 | if(filename==="") { 23 | const downloadUrl = new URL(urlString); 24 | const urlFile = downloadUrl.pathname.substring(downloadUrl.pathname.lastIndexOf('/')+1); 25 | 26 | filename = path.join(dataPath, urlFile); 27 | } 28 | const file = fs.createWriteStream(filename); 29 | 30 | https.get(urlString, (response) => { 31 | if(log) { 32 | console.log(`Downloading ${urlString} to ${filename}`); 33 | } 34 | response.pipe(file); 35 | }); 36 | } 37 | 38 | const outputPath = "uptime.csv" 39 | download("https://www.gstatic.com/ct/compliance/min_uptime.csv", outputPath); 40 | -------------------------------------------------------------------------------- /scripts/process_logs.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2020 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | const fs = require("fs"), 18 | deepmerge = require("deepmerge"), 19 | path = require("path"), 20 | csvParse = require('csv-parse/lib/sync'), 21 | _ = require("lodash"); 22 | 23 | const appleString = fs.readFileSync("data/apple_current_logs.json", {encoding: "utf-8"}); 24 | const googleString = fs.readFileSync("data/google_current_logs.json", {encoding: "utf-8"}); 25 | const uptimeString = fs.readFileSync("uptime.csv", {encoding: "utf-8"}); 26 | const appleLogs = JSON.parse(appleString); 27 | const googleLogs = JSON.parse(googleString); 28 | 29 | const uptimeArray = csvParse(uptimeString, {fromLine: 2}); 30 | 31 | let uptimes = {}; 32 | uptimeArray.forEach( (arr) => uptimes[arr[0]] = arr[1] ); 33 | 34 | // deepmerge works better, for our purposes, 35 | // than just using spread operators 36 | const mergedLogs = deepmerge(appleLogs, googleLogs); 37 | 38 | let allLogs = []; 39 | mergedLogs.operators.forEach(operator => { 40 | operator.logs.forEach(log => { 41 | log.operator = operator.name; 42 | allLogs.push(log); 43 | }) 44 | }); 45 | 46 | // sort 47 | allLogs = _.sortBy(allLogs,['operator', 'description'] ); 48 | 49 | let retiredIds = []; 50 | let pendingIds = []; 51 | 52 | // filter retired/rejected 53 | allLogs = _.filter(allLogs, (log) => { 54 | // filter any without a state 55 | if(!log.state) { 56 | return false; 57 | } 58 | 59 | const stateName = Object.keys(log.state)[0]; 60 | if(['retired', 'rejected', 'readonly'].includes(stateName)) { 61 | retiredIds.push(log.log_id) 62 | return false; 63 | } 64 | if(['pending'].includes(stateName)) { 65 | pendingIds.push(log.log_id) 66 | return false; 67 | } 68 | return true; 69 | }); 70 | 71 | // some logs that are marked as active are retired/rejected in other lists 72 | // they should now be removed. 73 | allLogs = _.filter(allLogs, (log) => { 74 | return !retiredIds.includes(log.log_id); 75 | }); 76 | 77 | // filter duplicates by uniq id 78 | allLogs = _.uniqBy(allLogs, "log_id"); 79 | 80 | // decorate with uptimes 81 | 82 | 83 | allLogs.forEach( (log) => { 84 | if(Object.keys(uptimes).includes(log.url)) { 85 | log.uptime = uptimes[log.url]; 86 | } 87 | }); 88 | 89 | // finally restructure by operator: 90 | const outputLogs = {} 91 | allLogs.forEach((log) => { 92 | if(outputLogs[log.operator]) { 93 | outputLogs[log.operator].push(log); 94 | } else { 95 | outputLogs[log.operator] = [log]; 96 | } 97 | }) 98 | 99 | // emit string 100 | const allLogsString = JSON.stringify(outputLogs, false, 2); 101 | const dataPath = path.join(__dirname, '..', 'data', 'consolidated_log_list.json'); 102 | 103 | fs.writeFileSync(dataPath, allLogsString); 104 | -------------------------------------------------------------------------------- /scripts/update_certcount.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2020 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | const axios = require('axios'), 18 | fs = require('fs'), 19 | path = require('path'); 20 | 21 | const dataUrl = "https://ct.cloudflare.com/data/total"; 22 | 23 | axios.get(dataUrl) 24 | .then( response => { 25 | 26 | const count = response.data; 27 | const asof = new Date().toISOString().slice(0, 10); 28 | const countString = JSON.stringify({count, asof}, false, 2); 29 | const dataPath = path.join(__dirname, '..', 'data', 'certcount.json'); 30 | 31 | fs.writeFileSync(dataPath, countString); 32 | }) 33 | .catch(error => { 34 | console.log(error) 35 | }); -------------------------------------------------------------------------------- /static/fonts/iAWriterDuoS-Bold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/certificate-transparency-community-site/7ce678f7bc0a7ffcd7d186c38f74c25591cb9cf1/static/fonts/iAWriterDuoS-Bold.eot -------------------------------------------------------------------------------- /static/fonts/iAWriterDuoS-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/certificate-transparency-community-site/7ce678f7bc0a7ffcd7d186c38f74c25591cb9cf1/static/fonts/iAWriterDuoS-Bold.ttf -------------------------------------------------------------------------------- /static/fonts/iAWriterDuoS-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/certificate-transparency-community-site/7ce678f7bc0a7ffcd7d186c38f74c25591cb9cf1/static/fonts/iAWriterDuoS-Bold.woff -------------------------------------------------------------------------------- /static/fonts/iAWriterDuoS-Regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/certificate-transparency-community-site/7ce678f7bc0a7ffcd7d186c38f74c25591cb9cf1/static/fonts/iAWriterDuoS-Regular.eot -------------------------------------------------------------------------------- /static/fonts/iAWriterDuoS-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/certificate-transparency-community-site/7ce678f7bc0a7ffcd7d186c38f74c25591cb9cf1/static/fonts/iAWriterDuoS-Regular.ttf -------------------------------------------------------------------------------- /static/fonts/iAWriterDuoS-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/certificate-transparency-community-site/7ce678f7bc0a7ffcd7d186c38f74c25591cb9cf1/static/fonts/iAWriterDuoS-Regular.woff -------------------------------------------------------------------------------- /static/img/arrow-cards.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /static/img/arrow-links.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /static/img/blackpixel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/certificate-transparency-community-site/7ce678f7bc0a7ffcd7d186c38f74c25591cb9cf1/static/img/blackpixel.png -------------------------------------------------------------------------------- /static/img/collab-logos/Keytos.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 9 | 10 | 13 | 14 | 15 | 16 | 17 | 21 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /static/img/collab-logos/RedSift.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/img/collab-logos/apple.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/certificate-transparency-community-site/7ce678f7bc0a7ffcd7d186c38f74c25591cb9cf1/static/img/collab-logos/apple.png -------------------------------------------------------------------------------- /static/img/collab-logos/apple.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /static/img/collab-logos/censys.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/certificate-transparency-community-site/7ce678f7bc0a7ffcd7d186c38f74c25591cb9cf1/static/img/collab-logos/censys.png -------------------------------------------------------------------------------- /static/img/collab-logos/cloudflare.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/certificate-transparency-community-site/7ce678f7bc0a7ffcd7d186c38f74c25591cb9cf1/static/img/collab-logos/cloudflare.png -------------------------------------------------------------------------------- /static/img/collab-logos/cloudflare.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /static/img/collab-logos/digicert.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/certificate-transparency-community-site/7ce678f7bc0a7ffcd7d186c38f74c25591cb9cf1/static/img/collab-logos/digicert.png -------------------------------------------------------------------------------- /static/img/collab-logos/entrust.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /static/img/collab-logos/facebook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/certificate-transparency-community-site/7ce678f7bc0a7ffcd7d186c38f74c25591cb9cf1/static/img/collab-logos/facebook.png -------------------------------------------------------------------------------- /static/img/collab-logos/facebook_nocrop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/certificate-transparency-community-site/7ce678f7bc0a7ffcd7d186c38f74c25591cb9cf1/static/img/collab-logos/facebook_nocrop.png -------------------------------------------------------------------------------- /static/img/collab-logos/google.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/certificate-transparency-community-site/7ce678f7bc0a7ffcd7d186c38f74c25591cb9cf1/static/img/collab-logos/google.png -------------------------------------------------------------------------------- /static/img/collab-logos/google.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /static/img/collab-logos/hardenize.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 9 | 11 | 12 | 19 | 21 | 28 | 34 | 37 | 38 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /static/img/collab-logos/lets-encrypt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/certificate-transparency-community-site/7ce678f7bc0a7ffcd7d186c38f74c25591cb9cf1/static/img/collab-logos/lets-encrypt.png -------------------------------------------------------------------------------- /static/img/collab-logos/report-uri.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 9 | 10 | 11 | 15 | 18 | 19 | 20 | 21 | 24 | 28 | 32 | 37 | 39 | 42 | 45 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /static/img/collab-logos/sectigo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/certificate-transparency-community-site/7ce678f7bc0a7ffcd7d186c38f74c25591cb9cf1/static/img/collab-logos/sectigo.png -------------------------------------------------------------------------------- /static/img/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/google/certificate-transparency-community-site/7ce678f7bc0a7ffcd7d186c38f74c25591cb9cf1/static/img/favicon.png -------------------------------------------------------------------------------- /static/img/fourohfour.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /static/img/hero-grid.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /static/img/plus-sign.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /static/img/small-crosshair-grid.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /static/img/timeline-cap.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | --------------------------------------------------------------------------------