You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
63 lines
1.7 KiB
63 lines
1.7 KiB
package magic
|
|
|
|
import "bytes"
|
|
|
|
var (
|
|
// Pdf matches a Portable Document Format file.
|
|
// https://github.com/file/file/blob/11010cc805546a3e35597e67e1129a481aed40e8/magic/Magdir/pdf
|
|
Pdf = prefix(
|
|
// usual pdf signature
|
|
[]byte("%PDF-"),
|
|
// new-line prefixed signature
|
|
[]byte("\012%PDF-"),
|
|
// UTF-8 BOM prefixed signature
|
|
[]byte("\xef\xbb\xbf%PDF-"),
|
|
)
|
|
// Fdf matches a Forms Data Format file.
|
|
Fdf = prefix([]byte("%FDF"))
|
|
// Mobi matches a Mobi file.
|
|
Mobi = offset([]byte("BOOKMOBI"), 60)
|
|
// Lit matches a Microsoft Lit file.
|
|
Lit = prefix([]byte("ITOLITLS"))
|
|
)
|
|
|
|
// DjVu matches a DjVu file.
|
|
func DjVu(raw []byte, limit uint32) bool {
|
|
if len(raw) < 12 {
|
|
return false
|
|
}
|
|
if !bytes.HasPrefix(raw, []byte{0x41, 0x54, 0x26, 0x54, 0x46, 0x4F, 0x52, 0x4D}) {
|
|
return false
|
|
}
|
|
return bytes.HasPrefix(raw[12:], []byte("DJVM")) ||
|
|
bytes.HasPrefix(raw[12:], []byte("DJVU")) ||
|
|
bytes.HasPrefix(raw[12:], []byte("DJVI")) ||
|
|
bytes.HasPrefix(raw[12:], []byte("THUM"))
|
|
}
|
|
|
|
// P7s matches an .p7s signature File (PEM, Base64).
|
|
func P7s(raw []byte, limit uint32) bool {
|
|
// Check for PEM Encoding.
|
|
if bytes.HasPrefix(raw, []byte("-----BEGIN PKCS7")) {
|
|
return true
|
|
}
|
|
// Check if DER Encoding is long enough.
|
|
if len(raw) < 20 {
|
|
return false
|
|
}
|
|
// Magic Bytes for the signedData ASN.1 encoding.
|
|
startHeader := [][]byte{{0x30, 0x80}, {0x30, 0x81}, {0x30, 0x82}, {0x30, 0x83}, {0x30, 0x84}}
|
|
signedDataMatch := []byte{0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x07}
|
|
// Check if Header is correct. There are multiple valid headers.
|
|
for i, match := range startHeader {
|
|
// If first bytes match, then check for ASN.1 Object Type.
|
|
if bytes.HasPrefix(raw, match) {
|
|
if bytes.HasPrefix(raw[i+2:], signedDataMatch) {
|
|
return true
|
|
}
|
|
}
|
|
}
|
|
|
|
return false
|
|
}
|