Merge pull request #3890 from guggero/custom-shared-key

signrpc: derive custom shared key
This commit is contained in:
Olaoluwa Osuntokun 2020-01-06 13:42:14 -08:00 committed by GitHub
commit 66ff2c1e7a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 92 additions and 64 deletions

@ -664,10 +664,14 @@ func (m *VerifyMessageResp) GetValid() bool {
type SharedKeyRequest struct { type SharedKeyRequest struct {
// The ephemeral public key to use for the DH key derivation. // The ephemeral public key to use for the DH key derivation.
EphemeralPubkey []byte `protobuf:"bytes,1,opt,name=ephemeral_pubkey,json=ephemeralPubkey,proto3" json:"ephemeral_pubkey,omitempty"` EphemeralPubkey []byte `protobuf:"bytes,1,opt,name=ephemeral_pubkey,json=ephemeralPubkey,proto3" json:"ephemeral_pubkey,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` //*
XXX_unrecognized []byte `json:"-"` //The optional key locator of the local key that should be used. If this
XXX_sizecache int32 `json:"-"` //parameter is not set then the node's identity private key will be used.
KeyLoc *KeyLocator `protobuf:"bytes,2,opt,name=key_loc,json=keyLoc,proto3" json:"key_loc,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
} }
func (m *SharedKeyRequest) Reset() { *m = SharedKeyRequest{} } func (m *SharedKeyRequest) Reset() { *m = SharedKeyRequest{} }
@ -702,6 +706,13 @@ func (m *SharedKeyRequest) GetEphemeralPubkey() []byte {
return nil return nil
} }
func (m *SharedKeyRequest) GetKeyLoc() *KeyLocator {
if m != nil {
return m.KeyLoc
}
return nil
}
type SharedKeyResponse struct { type SharedKeyResponse struct {
// The shared public key, hashed with sha256. // The shared public key, hashed with sha256.
SharedKey []byte `protobuf:"bytes,1,opt,name=shared_key,json=sharedKey,proto3" json:"shared_key,omitempty"` SharedKey []byte `protobuf:"bytes,1,opt,name=shared_key,json=sharedKey,proto3" json:"shared_key,omitempty"`
@ -762,55 +773,55 @@ func init() {
func init() { proto.RegisterFile("signrpc/signer.proto", fileDescriptor_4ecd772f6c7ffacf) } func init() { proto.RegisterFile("signrpc/signer.proto", fileDescriptor_4ecd772f6c7ffacf) }
var fileDescriptor_4ecd772f6c7ffacf = []byte{ var fileDescriptor_4ecd772f6c7ffacf = []byte{
// 754 bytes of a gzipped FileDescriptorProto // 756 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x55, 0xed, 0x8e, 0xdb, 0x44, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x55, 0x5d, 0x8f, 0xdb, 0x44,
0x14, 0xd5, 0x26, 0x6c, 0x92, 0xbd, 0x4e, 0x76, 0xb3, 0xc3, 0xaa, 0xb8, 0x0b, 0x88, 0x60, 0xa9, 0x14, 0xd5, 0x26, 0x6c, 0x92, 0xbd, 0x4e, 0x76, 0xb3, 0xc3, 0xaa, 0xb8, 0x0b, 0x88, 0x60, 0xa9,
0x28, 0x95, 0x20, 0x11, 0x01, 0x21, 0x81, 0x84, 0x84, 0x4a, 0xb5, 0x6a, 0x95, 0xa2, 0x56, 0xce, 0x28, 0x95, 0x20, 0x11, 0x01, 0x21, 0xc1, 0x13, 0x2a, 0xd5, 0xaa, 0x55, 0x8a, 0x5a, 0x39, 0x2b,
0x8a, 0x1f, 0xfd, 0x63, 0x39, 0xce, 0xad, 0x33, 0xb2, 0x63, 0xcf, 0xce, 0x8c, 0xeb, 0xf8, 0x39, 0x1e, 0xfa, 0x62, 0x39, 0xce, 0xad, 0x33, 0xb2, 0x63, 0xcf, 0xce, 0x8c, 0xeb, 0xf8, 0x77, 0xf0,
0x78, 0x35, 0x1e, 0x08, 0xcd, 0x47, 0x1c, 0x3b, 0x05, 0xa4, 0xfe, 0x8a, 0xef, 0x99, 0x3b, 0xe7, 0xd7, 0xf8, 0x41, 0x68, 0x3e, 0xe2, 0xd8, 0x29, 0x54, 0xea, 0xd3, 0xfa, 0x9e, 0xb9, 0x73, 0xee,
0x9e, 0x9c, 0x73, 0x13, 0xc3, 0x8d, 0xa0, 0x71, 0xc6, 0x59, 0x34, 0x57, 0x9f, 0xc8, 0x67, 0x8c, 0xd9, 0x73, 0xae, 0x63, 0xb8, 0x11, 0x34, 0xce, 0x38, 0x8b, 0xe6, 0xea, 0x2f, 0xf2, 0x19, 0xe3,
0xe7, 0x32, 0x27, 0x7d, 0x8b, 0x7a, 0x2f, 0x00, 0x96, 0x58, 0xbd, 0xca, 0xa3, 0x50, 0xe6, 0x9c, 0xb9, 0xcc, 0x49, 0xdf, 0xa2, 0xde, 0x0b, 0x80, 0x25, 0x56, 0xaf, 0xf2, 0x28, 0x94, 0x39, 0x27,
0x7c, 0x09, 0x90, 0x60, 0x15, 0xbc, 0x0b, 0x77, 0x34, 0xad, 0xdc, 0xb3, 0xc9, 0xd9, 0xf4, 0xdc, 0x5f, 0x03, 0x24, 0x58, 0x05, 0xef, 0xc2, 0x1d, 0x4d, 0x2b, 0xf7, 0x6c, 0x72, 0x36, 0x3d, 0xf7,
0xbf, 0x48, 0xb0, 0xba, 0xd3, 0x00, 0xf9, 0x1c, 0x54, 0x11, 0xd0, 0x6c, 0x83, 0x7b, 0xb7, 0xa3, 0x2f, 0x12, 0xac, 0xee, 0x34, 0x40, 0xbe, 0x04, 0x55, 0x04, 0x34, 0xdb, 0xe0, 0xde, 0xed, 0xe8,
0x4f, 0x07, 0x09, 0x56, 0x2f, 0x55, 0xed, 0x85, 0x30, 0x5a, 0x62, 0xf5, 0x1c, 0x45, 0xc4, 0x29, 0xd3, 0x41, 0x82, 0xd5, 0x4b, 0x55, 0x7b, 0x21, 0x8c, 0x96, 0x58, 0x3d, 0x47, 0x11, 0x71, 0xca,
0x53, 0x64, 0x1e, 0x8c, 0x78, 0x58, 0x06, 0xea, 0xc6, 0xba, 0x92, 0x28, 0x34, 0xdf, 0xd0, 0x77, 0x14, 0x99, 0x07, 0x23, 0x1e, 0x96, 0x81, 0xba, 0xb1, 0xae, 0x24, 0x0a, 0xcd, 0x37, 0xf4, 0x1d,
0x78, 0x58, 0x2e, 0xb1, 0x7a, 0xa6, 0x20, 0xf2, 0x2d, 0xf4, 0xd5, 0x79, 0x9a, 0x47, 0x9a, 0xcf, 0x1e, 0x96, 0x4b, 0xac, 0x9e, 0x29, 0x88, 0x7c, 0x0f, 0x7d, 0x75, 0x9e, 0xe6, 0x91, 0xe6, 0x73,
0x59, 0x7c, 0x3a, 0xb3, 0xca, 0x66, 0x47, 0x59, 0x7e, 0x2f, 0xd1, 0xcf, 0xde, 0x2f, 0x70, 0x7e, 0x16, 0x9f, 0xcf, 0xac, 0xb2, 0xd9, 0x51, 0x96, 0xdf, 0x4b, 0xf4, 0xb3, 0xf7, 0x1b, 0x9c, 0xdf,
0xbf, 0x7f, 0x5d, 0x48, 0x72, 0x03, 0xe7, 0xef, 0xc3, 0xb4, 0x40, 0x4d, 0xd9, 0xf5, 0x4d, 0xa1, 0xef, 0x5f, 0x17, 0x92, 0xdc, 0xc0, 0xf9, 0xfb, 0x30, 0x2d, 0x50, 0x53, 0x76, 0x7d, 0x53, 0x28,
0xe4, 0xb1, 0x24, 0x30, 0xf3, 0x35, 0xdd, 0xd0, 0x1f, 0xb0, 0x64, 0xa5, 0x6b, 0xef, 0xaf, 0x0e, 0x79, 0x2c, 0x09, 0xcc, 0x7c, 0x4d, 0x37, 0xf4, 0x07, 0x2c, 0x59, 0xe9, 0xda, 0xfb, 0xbb, 0x03,
0x5c, 0xae, 0x68, 0x9c, 0x35, 0x04, 0x7e, 0x0f, 0x4a, 0x7d, 0xb0, 0x41, 0x11, 0x69, 0x22, 0x67, 0x97, 0x2b, 0x1a, 0x67, 0x0d, 0x81, 0x3f, 0x82, 0x52, 0x1f, 0x6c, 0x50, 0x44, 0x9a, 0xc8, 0x59,
0xf1, 0xa8, 0x39, 0xfd, 0xd8, 0xe9, 0x2b, 0x91, 0xaa, 0x24, 0x5f, 0xc3, 0x50, 0xd0, 0x2c, 0x4e, 0x3c, 0x6a, 0x4e, 0x3f, 0x76, 0xfa, 0x4a, 0xa4, 0x2a, 0xc9, 0xb7, 0x30, 0x14, 0x34, 0x8b, 0x53,
0x31, 0x90, 0x25, 0x86, 0x89, 0x9d, 0xe2, 0x18, 0xec, 0x5e, 0x41, 0xaa, 0x65, 0x93, 0x17, 0xeb, 0x0c, 0x64, 0x89, 0x61, 0x62, 0xa7, 0x38, 0x06, 0xbb, 0x57, 0x90, 0x6a, 0xd9, 0xe4, 0xc5, 0xba,
0xba, 0xa5, 0x6b, 0x5a, 0x0c, 0x66, 0x5a, 0x9e, 0xc0, 0x65, 0x49, 0x65, 0x86, 0x42, 0x1c, 0xd4, 0x6e, 0xe9, 0x9a, 0x16, 0x83, 0x99, 0x96, 0x27, 0x70, 0x59, 0x52, 0x99, 0xa1, 0x10, 0x07, 0xb5,
0x7e, 0xa2, 0x9b, 0x46, 0x16, 0x35, 0x92, 0xc9, 0x37, 0xd0, 0xcb, 0x0b, 0xc9, 0x0a, 0xe9, 0x9e, 0x9f, 0xe9, 0xa6, 0x91, 0x45, 0x8d, 0x64, 0xf2, 0x1d, 0xf4, 0xf2, 0x42, 0xb2, 0x42, 0xba, 0xe7,
0x6b, 0x75, 0x97, 0xb5, 0x3a, 0xed, 0x82, 0x6f, 0x4f, 0x89, 0x0b, 0x2a, 0xce, 0x6d, 0x28, 0xb6, 0x5a, 0xdd, 0x65, 0xad, 0x4e, 0xbb, 0xe0, 0xdb, 0x53, 0xe2, 0x82, 0x8a, 0x73, 0x1b, 0x8a, 0xad,
0x6e, 0x7f, 0x72, 0x36, 0x1d, 0xf9, 0x87, 0x92, 0x7c, 0x05, 0x0e, 0xcd, 0x58, 0x21, 0x6d, 0x64, 0xdb, 0x9f, 0x9c, 0x4d, 0x47, 0xfe, 0xa1, 0x24, 0xdf, 0x80, 0x43, 0x33, 0x56, 0x48, 0x1b, 0xd9,
0x03, 0x1d, 0x19, 0x68, 0xc8, 0x84, 0x16, 0x41, 0x5f, 0x99, 0xe2, 0xe3, 0x03, 0x99, 0xc0, 0x50, 0x40, 0x47, 0x06, 0x1a, 0x32, 0xa1, 0x45, 0xd0, 0x57, 0xa6, 0xf8, 0xf8, 0x40, 0x26, 0x30, 0x54,
0xc5, 0x25, 0xf7, 0xad, 0xb4, 0x80, 0x87, 0xe5, 0xfd, 0xde, 0x84, 0xf5, 0x13, 0x80, 0x12, 0xa0, 0x71, 0xc9, 0x7d, 0x2b, 0x2d, 0xe0, 0x61, 0x79, 0xbf, 0x37, 0x61, 0xfd, 0x02, 0xa0, 0x04, 0x68,
0x0d, 0x13, 0x6e, 0x67, 0xd2, 0x9d, 0x3a, 0x8b, 0xcf, 0x6a, 0x4d, 0x6d, 0x73, 0xfd, 0x0b, 0x61, 0xc3, 0x84, 0xdb, 0x99, 0x74, 0xa7, 0xce, 0xe2, 0x8b, 0x5a, 0x53, 0xdb, 0x5c, 0xff, 0x42, 0xd8,
0x6b, 0xe1, 0x3d, 0x81, 0x81, 0x19, 0x22, 0x18, 0x79, 0x0c, 0x03, 0x35, 0x45, 0xd0, 0x58, 0x4d, 0x5a, 0x78, 0x4f, 0x60, 0x60, 0x86, 0x08, 0x46, 0x1e, 0xc3, 0x40, 0x4d, 0x11, 0x34, 0x56, 0x13,
0xe8, 0x4e, 0x87, 0x7e, 0x9f, 0x87, 0xe5, 0x8a, 0xc6, 0xc2, 0xbb, 0x03, 0xe7, 0xa5, 0x52, 0x66, 0xba, 0xd3, 0xa1, 0xdf, 0xe7, 0x61, 0xb9, 0xa2, 0xb1, 0xf0, 0xee, 0xc0, 0x79, 0xa9, 0x94, 0xd9,
0xbf, 0xbd, 0x0b, 0x7d, 0x6b, 0xc7, 0xa1, 0xd1, 0x96, 0x6a, 0x4b, 0x05, 0x8d, 0xdb, 0x41, 0xab, 0xff, 0xde, 0x85, 0xbe, 0xb5, 0xe3, 0xd0, 0x68, 0x4b, 0xb5, 0xa5, 0x82, 0xc6, 0xed, 0xa0, 0xd5,
0x71, 0x36, 0xe9, 0x57, 0x70, 0xd5, 0xe0, 0xd1, 0x53, 0x7f, 0x86, 0x91, 0xf1, 0xc1, 0xdc, 0x31, 0x38, 0x9b, 0xf4, 0x2b, 0xb8, 0x6a, 0xf0, 0xe8, 0xa9, 0xbf, 0xc2, 0xc8, 0xf8, 0x60, 0xee, 0x18,
0x8c, 0xce, 0xe2, 0xa6, 0x16, 0xdf, 0xbc, 0x30, 0xa4, 0xc7, 0x42, 0x78, 0x6f, 0xcc, 0xda, 0xfc, 0x46, 0x67, 0x71, 0x53, 0x8b, 0x6f, 0x5e, 0x18, 0xd2, 0x63, 0x21, 0xbc, 0x37, 0x66, 0x6d, 0xfe,
0x81, 0x42, 0x84, 0x31, 0x2a, 0xa3, 0xc6, 0xd0, 0xdd, 0x89, 0xd8, 0xfa, 0xa3, 0x1e, 0x3f, 0x72, 0x44, 0x21, 0xc2, 0x18, 0x95, 0x51, 0x63, 0xe8, 0xee, 0x44, 0x6c, 0xfd, 0x51, 0x8f, 0x9f, 0xb8,
0x8b, 0xe7, 0x70, 0xd5, 0x62, 0x14, 0x8c, 0x7c, 0x01, 0xda, 0xae, 0x50, 0x16, 0x1c, 0x2d, 0xf1, 0xc5, 0x73, 0xb8, 0x6a, 0x31, 0x0a, 0x46, 0xbe, 0x02, 0x6d, 0x57, 0x28, 0x0b, 0x8e, 0x96, 0xf8,
0x11, 0xf0, 0xde, 0xc2, 0xf8, 0x4f, 0xe4, 0xf4, 0x5d, 0xf5, 0xbf, 0x22, 0x5a, 0x1c, 0x9d, 0x13, 0x08, 0x78, 0x6f, 0x61, 0xfc, 0x17, 0x72, 0xfa, 0xae, 0xfa, 0xa8, 0x88, 0x16, 0x47, 0xe7, 0x84,
0x0e, 0xf2, 0x08, 0x7a, 0xac, 0x58, 0x27, 0x58, 0xd9, 0x7d, 0xb4, 0x95, 0xf7, 0x14, 0xae, 0x4f, 0x83, 0x3c, 0x82, 0x1e, 0x2b, 0xd6, 0x09, 0x56, 0x76, 0x1f, 0x6d, 0xe5, 0x3d, 0x85, 0xeb, 0x13,
0xb8, 0x05, 0xb3, 0x3f, 0x2f, 0xba, 0xd1, 0xf4, 0x03, 0xdf, 0x14, 0xde, 0xaf, 0x30, 0x5e, 0x6d, 0x6e, 0xc1, 0xec, 0xeb, 0x45, 0x37, 0x9a, 0x7e, 0xe0, 0x9b, 0xc2, 0x4b, 0x60, 0xbc, 0xda, 0x86,
0x43, 0x8e, 0x9b, 0x25, 0x56, 0x3e, 0x3e, 0x14, 0x28, 0x24, 0x79, 0x0a, 0x63, 0x64, 0x5b, 0xdc, 0x1c, 0x37, 0x4b, 0xac, 0x7c, 0x7c, 0x28, 0x50, 0x48, 0xf2, 0x14, 0xc6, 0xc8, 0xb6, 0xb8, 0x43,
0x21, 0x0f, 0xd3, 0xc0, 0x0e, 0x30, 0x9a, 0xae, 0x6a, 0xfc, 0x8d, 0x99, 0xb4, 0x80, 0xeb, 0xc6, 0x1e, 0xa6, 0x81, 0x1d, 0x60, 0x34, 0x5d, 0xd5, 0xf8, 0x1b, 0x0d, 0x7f, 0xa2, 0x49, 0x0b, 0xb8,
0x75, 0xc1, 0xf2, 0x4c, 0xa0, 0x8e, 0x52, 0x83, 0xc1, 0xf1, 0xe6, 0x85, 0x38, 0xb4, 0x2d, 0xfe, 0x6e, 0x0c, 0x13, 0x2c, 0xcf, 0x04, 0xea, 0xe0, 0x35, 0x18, 0x1c, 0xe7, 0x5c, 0x88, 0x43, 0xdb,
0xee, 0x40, 0x6f, 0xa5, 0xff, 0xb7, 0xc8, 0x8f, 0x30, 0x52, 0x4f, 0xaf, 0xf5, 0xca, 0xfb, 0x61, 0xe2, 0x9f, 0x0e, 0xf4, 0x56, 0xfa, 0x57, 0x8e, 0xfc, 0x0c, 0x23, 0xf5, 0xf4, 0x5a, 0xbf, 0x20,
0x49, 0xc6, 0xad, 0xcd, 0xf3, 0xf1, 0xe1, 0xf6, 0xfa, 0x04, 0x11, 0x8c, 0xfc, 0x06, 0xe4, 0xf7, 0x7e, 0x58, 0x92, 0x71, 0x6b, 0x4f, 0x7d, 0x7c, 0xb8, 0xbd, 0x3e, 0x41, 0x04, 0x23, 0xbf, 0x03,
0x7c, 0xc7, 0x0a, 0x89, 0xcd, 0xd5, 0xfa, 0xf0, 0xaa, 0xfb, 0xaf, 0x9b, 0x60, 0x18, 0x9c, 0x46, 0xf9, 0x23, 0xdf, 0xb1, 0x42, 0x62, 0x73, 0x11, 0x3f, 0xbc, 0xea, 0xfe, 0xe7, 0xde, 0x18, 0x06,
0x5a, 0xa4, 0xbd, 0xef, 0xc7, 0x40, 0x1a, 0x0c, 0xa7, 0xe1, 0xde, 0xc1, 0xa8, 0x65, 0x31, 0x79, 0xa7, 0x91, 0x2d, 0x69, 0xbf, 0x1d, 0xc7, 0xf8, 0x1a, 0x0c, 0xa7, 0xab, 0x70, 0x07, 0xa3, 0x56,
0x5c, 0xb7, 0x9e, 0xc6, 0x7a, 0x7b, 0xfb, 0x5f, 0x47, 0x82, 0x91, 0x17, 0x70, 0xf5, 0x1c, 0x39, 0x20, 0xe4, 0x71, 0xdd, 0x7a, 0xba, 0x04, 0xb7, 0xb7, 0xff, 0x77, 0x24, 0x18, 0x79, 0x01, 0x57,
0x7d, 0x8f, 0xb5, 0x8d, 0x0d, 0xa6, 0xd3, 0x64, 0x1a, 0x4c, 0x1f, 0xb8, 0xfe, 0x6c, 0xfe, 0xf6, 0xcf, 0x91, 0xd3, 0xf7, 0x58, 0xdb, 0xd8, 0x60, 0x3a, 0xcd, 0xb1, 0xc1, 0xf4, 0x81, 0xeb, 0xcf,
0xbb, 0x98, 0xca, 0x6d, 0xb1, 0x9e, 0x45, 0xf9, 0x6e, 0x9e, 0xd2, 0x78, 0x2b, 0x33, 0x9a, 0xc5, 0xe6, 0x6f, 0x7f, 0x88, 0xa9, 0xdc, 0x16, 0xeb, 0x59, 0x94, 0xef, 0xe6, 0x29, 0x8d, 0xb7, 0x32,
0x19, 0xca, 0x32, 0xe7, 0xc9, 0x3c, 0xcd, 0x36, 0xf3, 0xb4, 0x7e, 0x67, 0x70, 0x16, 0xad, 0x7b, 0xa3, 0x59, 0x9c, 0xa1, 0x2c, 0x73, 0x9e, 0xcc, 0xd3, 0x6c, 0x33, 0x4f, 0xeb, 0x2f, 0x0c, 0x67,
0xfa, 0xad, 0xf1, 0xc3, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x86, 0xd3, 0xf4, 0xe0, 0x4d, 0x06, 0xd1, 0xba, 0xa7, 0xbf, 0x31, 0x3f, 0xfd, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x73, 0xb0, 0xe9, 0x51,
0x00, 0x00, 0x7b, 0x06, 0x00, 0x00,
} }
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.
@ -864,8 +875,9 @@ type SignerClient interface {
// //
//DeriveSharedKey returns a shared secret key by performing Diffie-Hellman key //DeriveSharedKey returns a shared secret key by performing Diffie-Hellman key
//derivation between the ephemeral public key in the request and the node's //derivation between the ephemeral public key in the request and the node's
//identity private key: //key specified in the key_loc parameter (or the node's identity private key
//P_shared = privKeyNodeID * ephemeralPubkey //if no key locator is specified):
//P_shared = privKeyNode * ephemeralPubkey
//The resulting shared public key is serialized in the compressed format and //The resulting shared public key is serialized in the compressed format and
//hashed with sha256, resulting in the final key length of 256bit. //hashed with sha256, resulting in the final key length of 256bit.
DeriveSharedKey(ctx context.Context, in *SharedKeyRequest, opts ...grpc.CallOption) (*SharedKeyResponse, error) DeriveSharedKey(ctx context.Context, in *SharedKeyRequest, opts ...grpc.CallOption) (*SharedKeyResponse, error)
@ -965,8 +977,9 @@ type SignerServer interface {
// //
//DeriveSharedKey returns a shared secret key by performing Diffie-Hellman key //DeriveSharedKey returns a shared secret key by performing Diffie-Hellman key
//derivation between the ephemeral public key in the request and the node's //derivation between the ephemeral public key in the request and the node's
//identity private key: //key specified in the key_loc parameter (or the node's identity private key
//P_shared = privKeyNodeID * ephemeralPubkey //if no key locator is specified):
//P_shared = privKeyNode * ephemeralPubkey
//The resulting shared public key is serialized in the compressed format and //The resulting shared public key is serialized in the compressed format and
//hashed with sha256, resulting in the final key length of 256bit. //hashed with sha256, resulting in the final key length of 256bit.
DeriveSharedKey(context.Context, *SharedKeyRequest) (*SharedKeyResponse, error) DeriveSharedKey(context.Context, *SharedKeyRequest) (*SharedKeyResponse, error)

@ -154,6 +154,12 @@ message VerifyMessageResp {
message SharedKeyRequest { message SharedKeyRequest {
// The ephemeral public key to use for the DH key derivation. // The ephemeral public key to use for the DH key derivation.
bytes ephemeral_pubkey = 1; bytes ephemeral_pubkey = 1;
/**
The optional key locator of the local key that should be used. If this
parameter is not set then the node's identity private key will be used.
*/
KeyLocator key_loc = 2;
} }
message SharedKeyResponse { message SharedKeyResponse {
@ -209,8 +215,9 @@ service Signer {
/* /*
DeriveSharedKey returns a shared secret key by performing Diffie-Hellman key DeriveSharedKey returns a shared secret key by performing Diffie-Hellman key
derivation between the ephemeral public key in the request and the node's derivation between the ephemeral public key in the request and the node's
identity private key: key specified in the key_loc parameter (or the node's identity private key
P_shared = privKeyNodeID * ephemeralPubkey if no key locator is specified):
P_shared = privKeyNode * ephemeralPubkey
The resulting shared public key is serialized in the compressed format and The resulting shared public key is serialized in the compressed format and
hashed with sha256, resulting in the final key length of 256bit. hashed with sha256, resulting in the final key length of 256bit.
*/ */

@ -485,8 +485,9 @@ func (s *Server) VerifyMessage(ctx context.Context,
// DeriveSharedKey returns a shared secret key by performing Diffie-Hellman key // DeriveSharedKey returns a shared secret key by performing Diffie-Hellman key
// derivation between the ephemeral public key in the request and the node's // derivation between the ephemeral public key in the request and the node's
// identity private key: // key specified in the key_loc parameter (or the node's identity private key
// P_shared = privKeyNodeID * ephemeralPubkey // if no key locator is specified):
// P_shared = privKeyNode * ephemeralPubkey
// The resulting shared public key is serialized in the compressed format and // The resulting shared public key is serialized in the compressed format and
// hashed with sha256, resulting in the final key length of 256bit. // hashed with sha256, resulting in the final key length of 256bit.
func (s *Server) DeriveSharedKey(_ context.Context, in *SharedKeyRequest) ( func (s *Server) DeriveSharedKey(_ context.Context, in *SharedKeyRequest) (
@ -503,12 +504,19 @@ func (s *Server) DeriveSharedKey(_ context.Context, in *SharedKeyRequest) (
return nil, fmt.Errorf("unable to parse pubkey: %v", err) return nil, fmt.Errorf("unable to parse pubkey: %v", err)
} }
// By default, use the node identity private key.
locator := keychain.KeyLocator{
Family: keychain.KeyFamilyNodeKey,
Index: 0,
}
if in.KeyLoc != nil {
locator.Family = keychain.KeyFamily(in.KeyLoc.KeyFamily)
locator.Index = uint32(in.KeyLoc.KeyIndex)
}
// Derive our node's private key from the key ring. // Derive our node's private key from the key ring.
idPrivKey, err := s.cfg.KeyRing.DerivePrivKey(keychain.KeyDescriptor{ idPrivKey, err := s.cfg.KeyRing.DerivePrivKey(keychain.KeyDescriptor{
KeyLocator: keychain.KeyLocator{ KeyLocator: locator,
Family: keychain.KeyFamilyNodeKey,
Index: 0,
},
}) })
if err != nil { if err != nil {
err := fmt.Errorf("unable to derive node private key: %v", err) err := fmt.Errorf("unable to derive node private key: %v", err)