OLD | NEW |
(Empty) | |
| 1 What's OTS? |
| 2 =========== |
| 3 |
| 4 Sanitiser for OpenType (OTS) is a small library which parses OpenType files |
| 5 (usually from `@font-face`) and attempts to validate and sanitise them. This |
| 6 library is primarily intended to be used with Chromium. We hope this reduces |
| 7 the attack surface of the system font libraries. |
| 8 |
| 9 What the sanitiser does is as follows: |
| 10 |
| 11 1. Parses an original font. If the parsing fails, OTS rejects the original |
| 12 font. |
| 13 2. Validates the parsed data structure. If the validation fails, it rejects the |
| 14 original font as well. |
| 15 3. Creates a new font on memory by serializing the data structure, and we call |
| 16 this "transcoding". |
| 17 |
| 18 By transcoding fonts in this way, it is ensured that: |
| 19 |
| 20 1. All information in an original font that OTS doesn't know or can't parse is |
| 21 dropped from the transcoded font. |
| 22 2. All information in the transcoded font is valid (standard compliant). |
| 23 Particularly 'length' and 'offset' values, that are often used as attack |
| 24 vectors, are ensured to be correct. |
| 25 |
| 26 Supported OpenType tables |
| 27 ========================= |
| 28 |
| 29 | Name | Mandatory table? | Supported by OTS? | Note | |
| 30 |--------|-----------------------------|-------------------|--------| |
| 31 | `sfnt` | Yes | Yes | Overlapped tables a
re not allowed; it is treated as a fatal parser error.| |
| 32 | `maxp` | Yes | Yes | | |
| 33 | `head` | Yes | Yes | | |
| 34 | `hhea` | Yes | Yes | | |
| 35 | `hmtx` | Yes | Yes | | |
| 36 | `name` | Yes | Yes | | |
| 37 | `OS/2` | Yes | Yes | | |
| 38 | `post` | Yes | Yes | | |
| 39 | `cmap` | Yes | Partialy | see below | |
| 40 | `glyf` | Yes, for TrueType fonts | Yes | TrueType bytecode i
s supported, but OTS does **not** validate it.| |
| 41 | `loca` | Yes, when glyf table exists | Yes | | |
| 42 | `CFF ` | Yes, for OpenType fonts | Yes | OpenType bytecode i
s also supported, and OTS **does** validate it.| |
| 43 | `cvt ` | No | Yes | Though this table i
s not mandatory, OTS can't drop the table from a transcoded font since it might
be referred from other hinting-related tables. Errors on this table should be tr
eated as fatal.| |
| 44 | `fpgm` | No | Yes | Ditto. | |
| 45 | `prep` | No | Yes | Ditto. | |
| 46 | `VDMX` | No | Yes | This table is impor
tant for calculating the correct line spacing, at least on Chromium Windows and
Chromium Linux.| |
| 47 | `hdmx` | No | Yes | | |
| 48 | `gasp` | No | Yes | | |
| 49 | `VORG` | No | Yes | | |
| 50 | `LTSH` | No | Yes | | |
| 51 | `kern` | No | Yes | | |
| 52 | `GDEF` | No | Yes | | |
| 53 | `GSUB` | No | Yes | | |
| 54 | `GPOS` | No | Yes | | |
| 55 | `morx` | No | No | | |
| 56 | `jstf` | No | No | | |
| 57 | `vmtx` | No | Yes | | |
| 58 | `vhea` | No | Yes | | |
| 59 | `EBDT` | No | No | We don't support em
bedded bitmap strikes.| |
| 60 | `EBLC` | No | No | Ditto. | |
| 61 | `EBSC` | No | No | Ditto. | |
| 62 | `bdat` | No | No | Ditto. | |
| 63 | `bhed` | No | No | Ditto. | |
| 64 | `bloc` | No | No | Ditto. | |
| 65 | `DSIG` | No | No | | |
| 66 | All other tables | - | No | | |
| 67 |
| 68 Please note that OTS library does not parse "unsupported" tables. These |
| 69 unsupported tables never appear in a transcoded font. |
| 70 |
| 71 Supported cmap formats |
| 72 ---------------------- |
| 73 |
| 74 The following 9 formats are supported: |
| 75 |
| 76 * "MS Unicode" (platform 3 encoding 1 format 4) |
| 77 * BMP |
| 78 * "MS UCS-4" (platform 3 encoding 10 format 12) |
| 79 * "MS UCS-4 fallback" (platform 3 encoding 10 format 13) |
| 80 * "MS Symbol" (platform 3 encoding 0 format 4) |
| 81 * "Mac Roman" (platform 1 encoding 0 format 0) |
| 82 * 1-0-0 format is supported while 1-0-6 is not. |
| 83 * "Unicode default" format (platform 0 encoding 0 format 4) |
| 84 * treated as 3-1-4 format |
| 85 * "Unicode 1.1" format (platform 0 encoding 1 format 4) |
| 86 * ditto |
| 87 * "Unicode 2.0+" format (platform 0 encoding 3 format 4) |
| 88 * "Unicode UCS-4" format (platform 0 encoding 4 format 12) |
| 89 * treated as 3-10-12 format |
| 90 * Unicode Variation Sequences (platform 0 encoding 5 format 14) |
| 91 |
| 92 All other types of subtables are not supported and do not appear in transcoded f
onts. |
| 93 |
| 94 Validation strategies |
| 95 ===================== |
| 96 |
| 97 With regards to 8 mandatory tables, glyph-related tables (`glyf`, `loca` and `CF
F`), |
| 98 and hinting-related tables (`cvt`, `prep`, and `fpgm`): |
| 99 |
| 100 * If OTS finds table-length, table-offset, or table-alignment errors, in other |
| 101 words it cannot continue parsing, OTS treats the error as fatal. |
| 102 * If OTS finds simple value error which could be automatically fixed (e.g., |
| 103 font weight is greater than 900 - that's undefined), and if the error is |
| 104 considered common among non-malicious fonts, OTS rewrites the value and |
| 105 continues transcoding. |
| 106 * If OTS finds a value error which is hard to fix (e.g., values which should be |
| 107 sorted are left unsorted), OTS treats the error as fatal. |
| 108 |
| 109 With regards to optional tables (`VORG`, `gasp`, `hdmx`, `LTSH`, and `VDMX`): |
| 110 |
| 111 * If OTS finds table-length, table-offset, or table-alignment errors, OTS |
| 112 treats the error as fatal. |
| 113 * If OTS finds other errors, it simply drops the table from a transcoded font. |
| 114 |
| 115 Files |
| 116 ===== |
| 117 |
| 118 * include/opentype-sanitiser.h |
| 119 * Declaration for the public API, `ots::Process()`. |
| 120 * Definition of the `OTSStream` interface, a write-only memory stream. |
| 121 * include/ots-memory-stream.h |
| 122 * Definition of the `MemoryStream` class which implements the `OTSStream` |
| 123 interface above. |
| 124 * src/ots.h |
| 125 * Debug macros. |
| 126 * Definition of a `Buffer` class which is a read-only memory stream. |
| 127 * src/ots.cc |
| 128 * Definition of the `ots::Process()` function. |
| 129 * `sfnt` table parser. |
| 130 * test/\*.cc |
| 131 * test tools. see test/README for details. |
| 132 |
| 133 Known issues |
| 134 ============ |
| 135 |
| 136 Please check the [issues](https://github.com/khaledhosny/ots/issues) page. |
OLD | NEW |