-
Notifications
You must be signed in to change notification settings - Fork 0
/
canon.go
82 lines (71 loc) · 1.59 KB
/
canon.go
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
// Copyright 2019, Shulhan <ms@kilabit.info>. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package dkim
import (
"bytes"
"fmt"
)
//
// Canon define type of canonicalization algorithm.
//
type Canon byte
//
// List of valid and known canonicalization algorithms.
//
const (
CanonSimple Canon = iota // "simple" (default)
CanonRelaxed
)
//
// canonNames contains mapping between canonical type and their human
// readabale names.
//
var canonNames = map[Canon][]byte{
CanonSimple: []byte("simple"),
CanonRelaxed: []byte("relaxed"),
}
//
// unpackCanons unpack Signature canonicalization algorithms.
//
func unpackCanons(v []byte) (canonHeader, canonBody *Canon, err error) {
var vHeader, vBody []byte
canons := bytes.Split(v, sepSlash)
switch len(canons) {
case 0:
case 1:
vHeader = canons[0]
case 2:
vHeader = canons[0]
vBody = canons[1]
default:
err = fmt.Errorf("dkim: invalid canonicalization: '%s'", v)
return nil, nil, err
}
canonHeader, err = parseCanonValue(vHeader)
if err != nil {
return nil, nil, err
}
if canonHeader != nil {
canonBody, err = parseCanonValue(vBody)
if err != nil {
return nil, nil, err
}
}
return canonHeader, canonBody, nil
}
//
// parseCanonValue parse canonicalization name and return their numeric type.
//
func parseCanonValue(v []byte) (*Canon, error) {
if len(v) == 0 {
return nil, nil
}
for k, cname := range canonNames {
if bytes.Equal(v, cname) {
k := k
return &k, nil
}
}
return nil, fmt.Errorf("dkim: invalid canonicalization: '%s'", v)
}