]> Sergey Matveev's repositories - mmc.git/blob - internal/cert.go
internal package
[mmc.git] / internal / cert.go
1 // mmc -- Mattermost client
2 // Copyright (C) 2023-2024 Sergey Matveev <stargrave@stargrave.org>
3 //
4 // This program is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU Affero General Public License as
6 // published by the Free Software Foundation, either version 3 of the
7 // 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 Affero General Public License for more details.
13 //
14 // You should have received a copy of the GNU Affero General Public License
15 // along with this program.  If not, see <http://www.gnu.org/licenses/>.
16
17 package mmc
18
19 import (
20         "crypto/sha256"
21         "crypto/x509"
22         "encoding/hex"
23         "errors"
24 )
25
26 func NewVerifyPeerCertificate(hashExpected string) func(
27         rawCerts [][]byte, verifiedChains [][]*x509.Certificate,
28 ) error {
29         return func(
30                 rawCerts [][]byte, verifiedChains [][]*x509.Certificate,
31         ) error {
32                 cer, err := x509.ParseCertificate(rawCerts[0])
33                 if err != nil {
34                         return err
35                 }
36                 spki := cer.RawSubjectPublicKeyInfo
37                 hsh := sha256.Sum256(spki)
38                 if hashExpected != hex.EncodeToString(hsh[:]) {
39                         return errors.New("server certificate's SPKI hash mismatch")
40                 }
41                 return nil
42         }
43 }