talm

Форк
0
79 строк · 1.9 Кб
1
// This Source Code Form is subject to the terms of the Mozilla Public
2
// License, v. 2.0. If a copy of the MPL was not distributed with this
3
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
4

5
// Package tpm2 provides TPM2.0 related functionality helpers.
6
package tpm2
7

8
import (
9
	"crypto/sha256"
10
	"fmt"
11

12
	"github.com/google/go-tpm/tpm2"
13
)
14

15
// CalculatePolicy calculates the policy hash for a given PCR value and PCR selection.
16
func CalculatePolicy(pcrValue []byte, pcrSelection tpm2.TPMLPCRSelection) ([]byte, error) {
17
	calculator, err := tpm2.NewPolicyCalculator(tpm2.TPMAlgSHA256)
18
	if err != nil {
19
		return nil, err
20
	}
21

22
	pcrHash := sha256.Sum256(pcrValue)
23

24
	policy := tpm2.PolicyPCR{
25
		PcrDigest: tpm2.TPM2BDigest{
26
			Buffer: pcrHash[:],
27
		},
28
		Pcrs: pcrSelection,
29
	}
30

31
	if err := policy.Update(calculator); err != nil {
32
		return nil, err
33
	}
34

35
	return calculator.Hash().Digest, nil
36
}
37

38
// CalculateSealingPolicyDigest calculates the sealing policy digest for a given PCR value, PCR selection and public key.
39
func CalculateSealingPolicyDigest(pcrValue []byte, pcrSelection tpm2.TPMLPCRSelection, pubKey string) ([]byte, error) {
40
	calculator, err := tpm2.NewPolicyCalculator(tpm2.TPMAlgSHA256)
41
	if err != nil {
42
		return nil, err
43
	}
44

45
	pubKeyData, err := ParsePCRSigningPubKey(pubKey)
46
	if err != nil {
47
		return nil, err
48
	}
49

50
	publicKeyTemplate := RSAPubKeyTemplate(pubKeyData.N.BitLen(), pubKeyData.E, pubKeyData.N.Bytes())
51

52
	name, err := tpm2.ObjectName(&publicKeyTemplate)
53
	if err != nil {
54
		return nil, fmt.Errorf("failed to calculate name: %v", err)
55
	}
56

57
	policyAuthorize := tpm2.PolicyAuthorize{
58
		KeySign: *name,
59
	}
60

61
	if err := policyAuthorize.Update(calculator); err != nil {
62
		return nil, err
63
	}
64

65
	pcrHash := sha256.Sum256(pcrValue)
66

67
	policy := tpm2.PolicyPCR{
68
		PcrDigest: tpm2.TPM2BDigest{
69
			Buffer: pcrHash[:],
70
		},
71
		Pcrs: pcrSelection,
72
	}
73

74
	if err := policy.Update(calculator); err != nil {
75
		return nil, err
76
	}
77

78
	return calculator.Hash().Digest, nil
79
}
80

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.