]> Sergey Matveev's repositories - godlighty.git/blob - meta4/parse.go
SHAKE it
[godlighty.git] / meta4 / parse.go
1 /*
2 godlighty -- highly-customizable HTTP, HTTP/2, HTTPS server
3 Copyright (C) 2021-2023 Sergey Matveev <stargrave@stargrave.org>
4
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, version 3 of the License.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 GNU General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with this program.  If not, see <http://www.gnu.org/licenses/>.
16 */
17
18 package meta4
19
20 import (
21         "encoding/hex"
22         "encoding/xml"
23 )
24
25 type ForHTTP struct {
26         SHA256      []byte
27         SHA512      []byte
28         Streebog256 []byte
29         Streebog512 []byte
30         SHAKE128    []byte
31         SHAKE256    []byte
32         URLs        []string
33 }
34
35 func Parse(fn string, data []byte) (*ForHTTP, error) {
36         var meta Metalink
37         err := xml.Unmarshal(data, &meta)
38         if err != nil {
39                 return nil, err
40         }
41         for _, f := range meta.Files {
42                 if f.Name != fn {
43                         continue
44                 }
45                 forHTTP := ForHTTP{}
46                 for _, h := range f.Hashes {
47                         digest, err := hex.DecodeString(h.Hash)
48                         if err != nil {
49                                 return nil, err
50                         }
51                         switch h.Type {
52                         case HashSHA256:
53                                 forHTTP.SHA256 = digest
54                         case HashSHA512:
55                                 forHTTP.SHA512 = digest
56                         case HashStreebog256:
57                                 forHTTP.Streebog256 = digest
58                         case HashStreebog512:
59                                 forHTTP.Streebog512 = digest
60                         case HashSHAKE128:
61                                 forHTTP.SHAKE128 = digest
62                         case HashSHAKE256:
63                                 forHTTP.SHAKE256 = digest
64                         }
65                 }
66                 for _, u := range f.URLs {
67                         forHTTP.URLs = append(forHTTP.URLs, u.URL)
68                 }
69                 return &forHTTP, nil
70         }
71         return nil, nil
72 }