5
5
"bytes"
6
6
"context"
7
7
"crypto/ecdsa"
8
+ "crypto/rand"
8
9
"crypto/rsa"
9
10
"crypto/sha256"
10
11
"crypto/x509"
@@ -22,6 +23,7 @@ import (
22
23
"github.com/ethereum/go-ethereum/core/stateless"
23
24
"github.com/ethereum/go-ethereum/core/types"
24
25
"github.com/ethereum/go-ethereum/crypto"
26
+ "github.com/ethereum/go-ethereum/log"
25
27
"github.com/ethereum/go-ethereum/rlp"
26
28
"github.com/ethereum/go-ethereum/trie"
27
29
"github.com/hf/nitrite"
@@ -79,35 +81,42 @@ type Server struct {
79
81
var _ RPC = (* Server )(nil )
80
82
81
83
func NewServer () (* Server , error ) {
84
+ var random io.Reader
85
+ var pcr0 []byte
82
86
session , err := nsm .OpenDefaultSession ()
83
87
if err != nil {
84
- return nil , fmt .Errorf ("failed to open session: %w" , err )
88
+ log .Warn ("failed to open Nitro Secure Module session, running in local mode" , "error" , err )
89
+ random = rand .Reader
90
+ } else {
91
+ defer func () {
92
+ _ = session .Close ()
93
+ }()
94
+ pcr , err := session .Send (& request.DescribePCR {
95
+ Index : 0 ,
96
+ })
97
+ if err != nil {
98
+ return nil , fmt .Errorf ("failed to describe PCR: %w" , err )
99
+ }
100
+ if pcr .Error != "" {
101
+ return nil , fmt .Errorf ("NSM device returned an error: %s" , pcr .Error )
102
+ }
103
+ if pcr .DescribePCR == nil || pcr .DescribePCR .Data == nil || len (pcr .DescribePCR .Data ) == 0 {
104
+ return nil , errors .New ("NSM device did not return PCR data" )
105
+ }
106
+ pcr0 = pcr .DescribePCR .Data
107
+ random = session
85
108
}
86
- defer func () {
87
- _ = session .Close ()
88
- }()
89
- decryptionKey , err := rsa .GenerateKey (session , 2048 )
109
+
110
+ decryptionKey , err := rsa .GenerateKey (random , 2048 )
90
111
if err != nil {
91
112
return nil , fmt .Errorf ("failed to generate decryption key: %w" , err )
92
113
}
93
- signerKey , err := ecdsa .GenerateKey (crypto .S256 (), session )
114
+ signerKey , err := ecdsa .GenerateKey (crypto .S256 (), random )
94
115
if err != nil {
95
116
return nil , fmt .Errorf ("failed to generate signer key: %w" , err )
96
117
}
97
- pcr , err := session .Send (& request.DescribePCR {
98
- Index : 0 ,
99
- })
100
- if err != nil {
101
- return nil , fmt .Errorf ("failed to describe PCR: %w" , err )
102
- }
103
- if pcr .Error != "" {
104
- return nil , fmt .Errorf ("NSM device returned an error: %s" , pcr .Error )
105
- }
106
- if pcr .DescribePCR == nil || pcr .DescribePCR .Data == nil || len (pcr .DescribePCR .Data ) == 0 {
107
- return nil , errors .New ("NSM device did not return PCR data" )
108
- }
109
118
return & Server {
110
- pcr0 : pcr . DescribePCR . Data ,
119
+ pcr0 : pcr0 ,
111
120
signerKey : signerKey ,
112
121
decryptionKey : decryptionKey ,
113
122
}, nil
0 commit comments