Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
The DSIG table contains the digital signature of the OpenType™ font. Signature formats are widely documented and rely on a key pair architecture. Software developers, or publishers posting material on the Internet, create signatures using a private key. Operating systems or applications authenticate the signature using a public key.
The W3C and major software and operating system developers have specified security standards that describe signature formats, specify secure collections of web objects, and recommend authentication architecture. OpenType fonts with signatures will support these standards.
OpenType fonts offer many security features:
- Operating systems and browsing applications can identify the source and integrity of font files before using them,
- Font developers can specify embedding restrictions in OpenType fonts, and these restrictions cannot be altered in a font signed by the developer.
The enforcement of signatures is an administrative policy that may be supported by the host environment in which fonts are used. Systems may restrict use of unsigned fonts, or may allow policy to be controlled by a system administrator.
Anyone can obtain identity certificates and encryption keys from a certifying agency, such as Verisign or GTE’s Cybertrust, free or at a very low cost.
The DSIG table is organized as follows. The first portion of the table is the header:
DSIG header
| Type | Name | Description |
|---|---|---|
| uint32 | version | Version number of the DSIG table (0x00000001) |
| uint16 | numSignatures | Number of signatures in the table |
| uint16 | flags | permission flags Bit 0: cannot be resigned Bits 1-7: Reserved (Set to 0) |
| SignatureRecord | signatureRecords[numSignatures] | Array of signature records |
The version of the DSIG table is expressed as a uint32, beginning at 0. The version of the DSIG table currently used is version 1 (0x00000001).
Permission bit 0 allows a party signing the font to prevent any other parties from also signing the font (counter-signatures). If this bit is set to zero (0) the font may have a signature applied over the existing digital signature(s). A party who wants to ensure that their signature is the last signature can set this bit.
The DSIG header has an array of signature records, which specify the format and offset of signature blocks.
SignatureRecord
| Type | Name | Description |
|---|---|---|
| uint32 | format | Format of the signature |
| uint32 | length | Length of signature in bytes |
| Offset32 | signatureBlockOffset | Offset to the signature block from the beginning of the table |
Signatures are contained in one or more signature blocks. Signature blocks may have various formats; currently one format is defined. The format identifier specifies both the format of the signature block, as well as the hashing algorithm used to create and authenticate the signature.
Signature Block Format 1
| Type | Name | Description |
|---|---|---|
| uint16 | reserved1 | Reserved for future use; set to zero. |
| uint16 | reserved2 | Reserved for future use; set to zero. |
| uint32 | signatureLength | Length (in bytes) of the PKCS#7 packet in the signature field. |
| uint8 | signature[signatureLength] | PKCS#7 packet |
For more information about PKCS#7 signatures, see RFC 2315, PKCS #7: Cryptographic Message Syntax, Version 1.5 (https://www.rfc-editor.org/info/rfc2315).
For more information about counter-signatures, see RFC 2985, PKCS #9: Selected Object Classes and Attribute Types, Version 2.0 (https://www.rfc-editor.org/info/rfc2985).
Format 1: For whole fonts, with either TrueType outlines and/or CFF data
PKCS#7 or PKCS#9. The signed content digest is created as follows:
- If there is an existing DSIG table in the font:
a. Remove the DSIG table from font.
b. Remove the DSIG table entry from the Table Directory.
c. Adjust table offsets as necessary.
d. Recalculate the checksumAdjustment in the 'head' table. - Select the flags value, and append it to a copy of the revised font data.
- Hash the revised font data using a secure one-way hash (such as MD5) to create the content digest.
- Create the PKCS#7 signature block using the content digest.