88 "math/big"
99 "sync"
1010
11- "github.com/cloudflare/circl/hpke"
1211 "github.com/refraction-networking/utls/dicttls"
12+ "github.com/refraction-networking/utls/internal/hpke"
1313 "golang.org/x/crypto/cryptobyte"
1414)
1515
@@ -96,8 +96,7 @@ func (g *GREASEEncryptedClientHelloExtension) init() error {
9696 // but MAY be held constant for successive connections to the same server
9797 // in the same session.
9898 if len (g .CandidateCipherSuites ) == 0 {
99- _ , kdf , aead := defaultHPKESuite .Params ()
100- g .cipherSuite = HPKESymmetricCipherSuite {uint16 (kdf ), uint16 (aead )}
99+ g .cipherSuite = HPKESymmetricCipherSuite {uint16 (defaultHpkeKdf ), uint16 (defaultHpkeAead )}
101100 } else {
102101 // randomly pick one from the list
103102 rndIndex , err := rand .Int (rand .Reader , big .NewInt (int64 (len (g .CandidateCipherSuites ))))
@@ -113,21 +112,18 @@ func (g *GREASEEncryptedClientHelloExtension) init() error {
113112 }
114113
115114 if len (g .EncapsulatedKey ) == 0 {
116- // use default random key from cloudflare/go
117- kem := hpke .KEM_X25519_HKDF_SHA256
115+ kem := uint16 (defaultHpkeKem )
118116
119- pk , err := kem . Scheme (). UnmarshalBinaryPublicKey ( dummyX25519PublicKey )
117+ echPK , err := hpke . ParseHPKEPublicKey ( uint16 ( kem ), dummyX25519PublicKey )
120118 if err != nil {
121119 initErr = fmt .Errorf ("tls: grease ech: failed to parse dummy public key: %w" , err )
122120 return
123121 }
124- sender , err := defaultHPKESuite .NewSender (pk , nil )
125- if err != nil {
126- initErr = fmt .Errorf ("tls: grease ech: failed to create sender: %w" , err )
127- return
122+ suite := echCipher {
123+ KDFID : defaultHpkeKdf ,
124+ AEADID : defaultHpkeAead ,
128125 }
129-
130- g .EncapsulatedKey , _ , err = sender .Setup (rand .Reader )
126+ g .EncapsulatedKey , _ , err = hpke .SetupSender (kem , suite .KDFID , suite .AEADID , echPK , []byte {})
131127 if err != nil {
132128 initErr = fmt .Errorf ("tls: grease ech: failed to setup encapsulated key: %w" , err )
133129 return
@@ -158,8 +154,7 @@ func (g *GREASEEncryptedClientHelloExtension) randomizePayload(encodedHelloInner
158154 return errors .New ("tls: grease ech: regenerating payload is forbidden" )
159155 }
160156
161- aead := hpke .AEAD (g .cipherSuite .AeadId )
162- g .payload = make ([]byte , int (aead .CipherLen (uint (encodedHelloInnerLen ))))
157+ g .payload = make ([]byte , cipherLen (g .cipherSuite .AeadId , int (encodedHelloInnerLen )))
163158 _ , err := rand .Read (g .payload )
164159 if err != nil {
165160 return fmt .Errorf ("tls: generating grease ech payload: %w" , err )
@@ -269,8 +264,7 @@ func (g *GREASEEncryptedClientHelloExtension) Write(b []byte) (int, error) {
269264 if ! extData .ReadUint16LengthPrefixed (& ignored ) {
270265 return fullLen , errors .New ("bad payload" )
271266 }
272- aead := hpke .AEAD (g .cipherSuite .AeadId )
273- g .CandidatePayloadLens = []uint16 {uint16 (len (ignored ) - int (aead .CipherLen (0 )))}
267+ g .CandidatePayloadLens = []uint16 {uint16 (len (ignored ) - cipherLen (g .cipherSuite .AeadId , 0 ))}
274268
275269 return fullLen , nil
276270}
0 commit comments