PKœ¢£M£Mchallenge.pb.go// Copyright 2021 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and // limitations under the License. // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.26.0 // protoc v3.12.4 // source: pb/challenge.proto package pb import ( protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) type EcdhKey_CurveID int32 const ( EcdhKey_RESERVED EcdhKey_CurveID = 0 EcdhKey_SECP224R1 EcdhKey_CurveID = 1 EcdhKey_SECP256R1 EcdhKey_CurveID = 2 ) // Enum value maps for EcdhKey_CurveID. var ( EcdhKey_CurveID_name = map[int32]string{ 0: "RESERVED", 1: "SECP224R1", 2: "SECP256R1", } EcdhKey_CurveID_value = map[string]int32{ "RESERVED": 0, "SECP224R1": 1, "SECP256R1": 2, } ) func (x EcdhKey_CurveID) Enum() *EcdhKey_CurveID { p := new(EcdhKey_CurveID) *p = x return p } func (x EcdhKey_CurveID) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (EcdhKey_CurveID) Descriptor() protoreflect.EnumDescriptor { return file_pb_challenge_proto_enumTypes[0].Descriptor() } func (EcdhKey_CurveID) Type() protoreflect.EnumType { return &file_pb_challenge_proto_enumTypes[0] } func (x EcdhKey_CurveID) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use EcdhKey_CurveID.Descriptor instead. func (EcdhKey_CurveID) EnumDescriptor() ([]byte, []int) { return file_pb_challenge_proto_rawDescGZIP(), []int{2, 0} } type Point struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields X []byte `protobuf:"bytes,1,opt,name=x,proto3" json:"x,omitempty"` Y []byte `protobuf:"bytes,2,opt,name=y,proto3" json:"y,omitempty"` } func (x *Point) Reset() { *x = Point{} if protoimpl.UnsafeEnabled { mi := &file_pb_challenge_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Point) String() string { return protoimpl.X.MessageStringOf(x) } func (*Point) ProtoMessage() {} func (x *Point) ProtoReflect() protoreflect.Message { mi := &file_pb_challenge_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Point.ProtoReflect.Descriptor instead. func (*Point) Descriptor() ([]byte, []int) { return file_pb_challenge_proto_rawDescGZIP(), []int{0} } func (x *Point) GetX() []byte { if x != nil { return x.X } return nil } func (x *Point) GetY() []byte { if x != nil { return x.Y } return nil } type Ciphertext struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Iv []byte `protobuf:"bytes,1,opt,name=iv,proto3" json:"iv,omitempty"` Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` Mac []byte `protobuf:"bytes,3,opt,name=mac,proto3" json:"mac,omitempty"` } func (x *Ciphertext) Reset() { *x = Ciphertext{} if protoimpl.UnsafeEnabled { mi := &file_pb_challenge_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Ciphertext) String() string { return protoimpl.X.MessageStringOf(x) } func (*Ciphertext) ProtoMessage() {} func (x *Ciphertext) ProtoReflect() protoreflect.Message { mi := &file_pb_challenge_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Ciphertext.ProtoReflect.Descriptor instead. func (*Ciphertext) Descriptor() ([]byte, []int) { return file_pb_challenge_proto_rawDescGZIP(), []int{1} } func (x *Ciphertext) GetIv() []byte { if x != nil { return x.Iv } return nil } func (x *Ciphertext) GetData() []byte { if x != nil { return x.Data } return nil } func (x *Ciphertext) GetMac() []byte { if x != nil { return x.Mac } return nil } type EcdhKey struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Curve EcdhKey_CurveID `protobuf:"varint,1,opt,name=curve,proto3,enum=challenge.EcdhKey_CurveID" json:"curve,omitempty"` Public *Point `protobuf:"bytes,2,opt,name=public,proto3" json:"public,omitempty"` } func (x *EcdhKey) Reset() { *x = EcdhKey{} if protoimpl.UnsafeEnabled { mi := &file_pb_challenge_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *EcdhKey) String() string { return protoimpl.X.MessageStringOf(x) } func (*EcdhKey) ProtoMessage() {} func (x *EcdhKey) ProtoReflect() protoreflect.Message { mi := &file_pb_challenge_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use EcdhKey.ProtoReflect.Descriptor instead. func (*EcdhKey) Descriptor() ([]byte, []int) { return file_pb_challenge_proto_rawDescGZIP(), []int{2} } func (x *EcdhKey) GetCurve() EcdhKey_CurveID { if x != nil { return x.Curve } return EcdhKey_RESERVED } func (x *EcdhKey) GetPublic() *Point { if x != nil { return x.Public } return nil } type EcdhPrivateKey struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Key *EcdhKey `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` Private []byte `protobuf:"bytes,2,opt,name=private,proto3" json:"private,omitempty"` } func (x *EcdhPrivateKey) Reset() { *x = EcdhPrivateKey{} if protoimpl.UnsafeEnabled { mi := &file_pb_challenge_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *EcdhPrivateKey) String() string { return protoimpl.X.MessageStringOf(x) } func (*EcdhPrivateKey) ProtoMessage() {} func (x *EcdhPrivateKey) ProtoReflect() protoreflect.Message { mi := &file_pb_challenge_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use EcdhPrivateKey.ProtoReflect.Descriptor instead. func (*EcdhPrivateKey) Descriptor() ([]byte, []int) { return file_pb_challenge_proto_rawDescGZIP(), []int{3} } func (x *EcdhPrivateKey) GetKey() *EcdhKey { if x != nil { return x.Key } return nil } func (x *EcdhPrivateKey) GetPrivate() []byte { if x != nil { return x.Private } return nil } type ServerHello struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Key *EcdhKey `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` EncryptedFlag *Ciphertext `protobuf:"bytes,2,opt,name=encrypted_flag,json=encryptedFlag,proto3" json:"encrypted_flag,omitempty"` } func (x *ServerHello) Reset() { *x = ServerHello{} if protoimpl.UnsafeEnabled { mi := &file_pb_challenge_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *ServerHello) String() string { return protoimpl.X.MessageStringOf(x) } func (*ServerHello) ProtoMessage() {} func (x *ServerHello) ProtoReflect() protoreflect.Message { mi := &file_pb_challenge_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ServerHello.ProtoReflect.Descriptor instead. func (*ServerHello) Descriptor() ([]byte, []int) { return file_pb_challenge_proto_rawDescGZIP(), []int{4} } func (x *ServerHello) GetKey() *EcdhKey { if x != nil { return x.Key } return nil } func (x *ServerHello) GetEncryptedFlag() *Ciphertext { if x != nil { return x.EncryptedFlag } return nil } type ClientHello struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Key *EcdhKey `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` } func (x *ClientHello) Reset() { *x = ClientHello{} if protoimpl.UnsafeEnabled { mi := &file_pb_challenge_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *ClientHello) String() string { return protoimpl.X.MessageStringOf(x) } func (*ClientHello) ProtoMessage() {} func (x *ClientHello) ProtoReflect() protoreflect.Message { mi := &file_pb_challenge_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ClientHello.ProtoReflect.Descriptor instead. func (*ClientHello) Descriptor() ([]byte, []int) { return file_pb_challenge_proto_rawDescGZIP(), []int{5} } func (x *ClientHello) GetKey() *EcdhKey { if x != nil { return x.Key } return nil } type SessionMessage struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields EncryptedData *Ciphertext `protobuf:"bytes,1,opt,name=encrypted_data,json=encryptedData,proto3" json:"encrypted_data,omitempty"` } func (x *SessionMessage) Reset() { *x = SessionMessage{} if protoimpl.UnsafeEnabled { mi := &file_pb_challenge_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *SessionMessage) String() string { return protoimpl.X.MessageStringOf(x) } func (*SessionMessage) ProtoMessage() {} func (x *SessionMessage) ProtoReflect() protoreflect.Message { mi := &file_pb_challenge_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use SessionMessage.ProtoReflect.Descriptor instead. func (*SessionMessage) Descriptor() ([]byte, []int) { return file_pb_challenge_proto_rawDescGZIP(), []int{6} } func (x *SessionMessage) GetEncryptedData() *Ciphertext { if x != nil { return x.EncryptedData } return nil } var File_pb_challenge_proto protoreflect.FileDescriptor var file_pb_challenge_proto_rawDesc = []byte{ 0x0a, 0x12, 0x70, 0x62, 0x2f, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x09, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x22, 0x23, 0x0a, 0x05, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x01, 0x79, 0x22, 0x42, 0x0a, 0x0a, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x76, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x02, 0x69, 0x76, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x61, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6d, 0x61, 0x63, 0x22, 0x9c, 0x01, 0x0a, 0x07, 0x45, 0x63, 0x64, 0x68, 0x4b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x63, 0x75, 0x72, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x2e, 0x45, 0x63, 0x64, 0x68, 0x4b, 0x65, 0x79, 0x2e, 0x43, 0x75, 0x72, 0x76, 0x65, 0x49, 0x44, 0x52, 0x05, 0x63, 0x75, 0x72, 0x76, 0x65, 0x12, 0x28, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x2e, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0x35, 0x0a, 0x07, 0x43, 0x75, 0x72, 0x76, 0x65, 0x49, 0x44, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x45, 0x53, 0x45, 0x52, 0x56, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x45, 0x43, 0x50, 0x32, 0x32, 0x34, 0x52, 0x31, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x45, 0x43, 0x50, 0x32, 0x35, 0x36, 0x52, 0x31, 0x10, 0x02, 0x22, 0x50, 0x0a, 0x0e, 0x45, 0x63, 0x64, 0x68, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x24, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x2e, 0x45, 0x63, 0x64, 0x68, 0x4b, 0x65, 0x79, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x22, 0x71, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x12, 0x24, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x2e, 0x45, 0x63, 0x64, 0x68, 0x4b, 0x65, 0x79, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3c, 0x0a, 0x0e, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x5f, 0x66, 0x6c, 0x61, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x2e, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, 0x52, 0x0d, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x46, 0x6c, 0x61, 0x67, 0x22, 0x33, 0x0a, 0x0b, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x12, 0x24, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x2e, 0x45, 0x63, 0x64, 0x68, 0x4b, 0x65, 0x79, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x4e, 0x0a, 0x0e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3c, 0x0a, 0x0e, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x2e, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, 0x52, 0x0d, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x42, 0x05, 0x5a, 0x03, 0x2f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_pb_challenge_proto_rawDescOnce sync.Once file_pb_challenge_proto_rawDescData = file_pb_challenge_proto_rawDesc ) func file_pb_challenge_proto_rawDescGZIP() []byte { file_pb_challenge_proto_rawDescOnce.Do(func() { file_pb_challenge_proto_rawDescData = protoimpl.X.CompressGZIP(file_pb_challenge_proto_rawDescData) }) return file_pb_challenge_proto_rawDescData } var file_pb_challenge_proto_enumTypes = make([]protoimpl.EnumInfo, 1) var file_pb_challenge_proto_msgTypes = make([]protoimpl.MessageInfo, 7) var file_pb_challenge_proto_goTypes = []interface{}{ (EcdhKey_CurveID)(0), // 0: challenge.EcdhKey.CurveID (*Point)(nil), // 1: challenge.Point (*Ciphertext)(nil), // 2: challenge.Ciphertext (*EcdhKey)(nil), // 3: challenge.EcdhKey (*EcdhPrivateKey)(nil), // 4: challenge.EcdhPrivateKey (*ServerHello)(nil), // 5: challenge.ServerHello (*ClientHello)(nil), // 6: challenge.ClientHello (*SessionMessage)(nil), // 7: challenge.SessionMessage } var file_pb_challenge_proto_depIdxs = []int32{ 0, // 0: challenge.EcdhKey.curve:type_name -> challenge.EcdhKey.CurveID 1, // 1: challenge.EcdhKey.public:type_name -> challenge.Point 3, // 2: challenge.EcdhPrivateKey.key:type_name -> challenge.EcdhKey 3, // 3: challenge.ServerHello.key:type_name -> challenge.EcdhKey 2, // 4: challenge.ServerHello.encrypted_flag:type_name -> challenge.Ciphertext 3, // 5: challenge.ClientHello.key:type_name -> challenge.EcdhKey 2, // 6: challenge.SessionMessage.encrypted_data:type_name -> challenge.Ciphertext 7, // [7:7] is the sub-list for method output_type 7, // [7:7] is the sub-list for method input_type 7, // [7:7] is the sub-list for extension type_name 7, // [7:7] is the sub-list for extension extendee 0, // [0:7] is the sub-list for field type_name } func init() { file_pb_challenge_proto_init() } func file_pb_challenge_proto_init() { if File_pb_challenge_proto != nil { return } if !protoimpl.UnsafeEnabled { file_pb_challenge_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Point); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_pb_challenge_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Ciphertext); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_pb_challenge_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EcdhKey); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_pb_challenge_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EcdhPrivateKey); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_pb_challenge_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ServerHello); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_pb_challenge_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ClientHello); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_pb_challenge_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SessionMessage); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_pb_challenge_proto_rawDesc, NumEnums: 1, NumMessages: 7, NumExtensions: 0, NumServices: 0, }, GoTypes: file_pb_challenge_proto_goTypes, DependencyIndexes: file_pb_challenge_proto_depIdxs, EnumInfos: file_pb_challenge_proto_enumTypes, MessageInfos: file_pb_challenge_proto_msgTypes, }.Build() File_pb_challenge_proto = out.File file_pb_challenge_proto_rawDesc = nil file_pb_challenge_proto_goTypes = nil file_pb_challenge_proto_depIdxs = nil } PKÒy ‰‰challenge.proto// Copyright 2021 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and // limitations under the License. syntax = "proto3"; package challenge; option go_package="/pb"; message Point { bytes x = 1; bytes y = 2; } message Ciphertext { bytes iv = 1; bytes data = 2; bytes mac = 3; } message EcdhKey { enum CurveID { RESERVED = 0; SECP224R1 = 1; SECP256R1 = 2; } CurveID curve = 1; Point public = 2; } message EcdhPrivateKey { EcdhKey key = 1; bytes private = 2; } message ServerHello { EcdhKey key = 1; Ciphertext encrypted_flag = 2; } message ClientHello { EcdhKey key = 1; } message SessionMessage { Ciphertext encrypted_data = 1; } PKÆ©5©5challenge_pb2.py# -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! # source: pb/challenge.proto from google.protobuf import descriptor as _descriptor from google.protobuf import message as _message from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() DESCRIPTOR = _descriptor.FileDescriptor( name='pb/challenge.proto', package='challenge', syntax='proto3', serialized_options=b'Z\003/pb', create_key=_descriptor._internal_create_key, serialized_pb=b'\n\x12pb/challenge.proto\x12\tchallenge\"\x1d\n\x05Point\x12\t\n\x01x\x18\x01 \x01(\x0c\x12\t\n\x01y\x18\x02 \x01(\x0c\"3\n\nCiphertext\x12\n\n\x02iv\x18\x01 \x01(\x0c\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\x12\x0b\n\x03mac\x18\x03 \x01(\x0c\"\x8d\x01\n\x07\x45\x63\x64hKey\x12)\n\x05\x63urve\x18\x01 \x01(\x0e\x32\x1a.challenge.EcdhKey.CurveID\x12 \n\x06public\x18\x02 \x01(\x0b\x32\x10.challenge.Point\"5\n\x07\x43urveID\x12\x0c\n\x08RESERVED\x10\x00\x12\r\n\tSECP224R1\x10\x01\x12\r\n\tSECP256R1\x10\x02\"B\n\x0e\x45\x63\x64hPrivateKey\x12\x1f\n\x03key\x18\x01 \x01(\x0b\x32\x12.challenge.EcdhKey\x12\x0f\n\x07private\x18\x02 \x01(\x0c\"]\n\x0bServerHello\x12\x1f\n\x03key\x18\x01 \x01(\x0b\x32\x12.challenge.EcdhKey\x12-\n\x0e\x65ncrypted_flag\x18\x02 \x01(\x0b\x32\x15.challenge.Ciphertext\".\n\x0b\x43lientHello\x12\x1f\n\x03key\x18\x01 \x01(\x0b\x32\x12.challenge.EcdhKey\"?\n\x0eSessionMessage\x12-\n\x0e\x65ncrypted_data\x18\x01 \x01(\x0b\x32\x15.challenge.CiphertextB\x05Z\x03/pbb\x06proto3' ) _ECDHKEY_CURVEID = _descriptor.EnumDescriptor( name='CurveID', full_name='challenge.EcdhKey.CurveID', filename=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key, values=[ _descriptor.EnumValueDescriptor( name='RESERVED', index=0, number=0, serialized_options=None, type=None, create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( name='SECP224R1', index=1, number=1, serialized_options=None, type=None, create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( name='SECP256R1', index=2, number=2, serialized_options=None, type=None, create_key=_descriptor._internal_create_key), ], containing_type=None, serialized_options=None, serialized_start=206, serialized_end=259, ) _sym_db.RegisterEnumDescriptor(_ECDHKEY_CURVEID) _POINT = _descriptor.Descriptor( name='Point', full_name='challenge.Point', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='x', full_name='challenge.Point.x', index=0, number=1, type=12, cpp_type=9, label=1, has_default_value=False, default_value=b"", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='y', full_name='challenge.Point.y', index=1, number=2, type=12, cpp_type=9, label=1, has_default_value=False, default_value=b"", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], nested_types=[], enum_types=[ ], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[ ], serialized_start=33, serialized_end=62, ) _CIPHERTEXT = _descriptor.Descriptor( name='Ciphertext', full_name='challenge.Ciphertext', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='iv', full_name='challenge.Ciphertext.iv', index=0, number=1, type=12, cpp_type=9, label=1, has_default_value=False, default_value=b"", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='data', full_name='challenge.Ciphertext.data', index=1, number=2, type=12, cpp_type=9, label=1, has_default_value=False, default_value=b"", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='mac', full_name='challenge.Ciphertext.mac', index=2, number=3, type=12, cpp_type=9, label=1, has_default_value=False, default_value=b"", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], nested_types=[], enum_types=[ ], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[ ], serialized_start=64, serialized_end=115, ) _ECDHKEY = _descriptor.Descriptor( name='EcdhKey', full_name='challenge.EcdhKey', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='curve', full_name='challenge.EcdhKey.curve', index=0, number=1, type=14, cpp_type=8, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='public', full_name='challenge.EcdhKey.public', index=1, number=2, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], nested_types=[], enum_types=[ _ECDHKEY_CURVEID, ], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[ ], serialized_start=118, serialized_end=259, ) _ECDHPRIVATEKEY = _descriptor.Descriptor( name='EcdhPrivateKey', full_name='challenge.EcdhPrivateKey', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='key', full_name='challenge.EcdhPrivateKey.key', index=0, number=1, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='private', full_name='challenge.EcdhPrivateKey.private', index=1, number=2, type=12, cpp_type=9, label=1, has_default_value=False, default_value=b"", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], nested_types=[], enum_types=[ ], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[ ], serialized_start=261, serialized_end=327, ) _SERVERHELLO = _descriptor.Descriptor( name='ServerHello', full_name='challenge.ServerHello', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='key', full_name='challenge.ServerHello.key', index=0, number=1, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='encrypted_flag', full_name='challenge.ServerHello.encrypted_flag', index=1, number=2, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], nested_types=[], enum_types=[ ], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[ ], serialized_start=329, serialized_end=422, ) _CLIENTHELLO = _descriptor.Descriptor( name='ClientHello', full_name='challenge.ClientHello', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='key', full_name='challenge.ClientHello.key', index=0, number=1, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], nested_types=[], enum_types=[ ], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[ ], serialized_start=424, serialized_end=470, ) _SESSIONMESSAGE = _descriptor.Descriptor( name='SessionMessage', full_name='challenge.SessionMessage', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='encrypted_data', full_name='challenge.SessionMessage.encrypted_data', index=0, number=1, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], nested_types=[], enum_types=[ ], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[ ], serialized_start=472, serialized_end=535, ) _ECDHKEY.fields_by_name['curve'].enum_type = _ECDHKEY_CURVEID _ECDHKEY.fields_by_name['public'].message_type = _POINT _ECDHKEY_CURVEID.containing_type = _ECDHKEY _ECDHPRIVATEKEY.fields_by_name['key'].message_type = _ECDHKEY _SERVERHELLO.fields_by_name['key'].message_type = _ECDHKEY _SERVERHELLO.fields_by_name['encrypted_flag'].message_type = _CIPHERTEXT _CLIENTHELLO.fields_by_name['key'].message_type = _ECDHKEY _SESSIONMESSAGE.fields_by_name['encrypted_data'].message_type = _CIPHERTEXT DESCRIPTOR.message_types_by_name['Point'] = _POINT DESCRIPTOR.message_types_by_name['Ciphertext'] = _CIPHERTEXT DESCRIPTOR.message_types_by_name['EcdhKey'] = _ECDHKEY DESCRIPTOR.message_types_by_name['EcdhPrivateKey'] = _ECDHPRIVATEKEY DESCRIPTOR.message_types_by_name['ServerHello'] = _SERVERHELLO DESCRIPTOR.message_types_by_name['ClientHello'] = _CLIENTHELLO DESCRIPTOR.message_types_by_name['SessionMessage'] = _SESSIONMESSAGE _sym_db.RegisterFileDescriptor(DESCRIPTOR) Point = _reflection.GeneratedProtocolMessageType('Point', (_message.Message,), { 'DESCRIPTOR' : _POINT, '__module__' : 'pb.challenge_pb2' # @@protoc_insertion_point(class_scope:challenge.Point) }) _sym_db.RegisterMessage(Point) Ciphertext = _reflection.GeneratedProtocolMessageType('Ciphertext', (_message.Message,), { 'DESCRIPTOR' : _CIPHERTEXT, '__module__' : 'pb.challenge_pb2' # @@protoc_insertion_point(class_scope:challenge.Ciphertext) }) _sym_db.RegisterMessage(Ciphertext) EcdhKey = _reflection.GeneratedProtocolMessageType('EcdhKey', (_message.Message,), { 'DESCRIPTOR' : _ECDHKEY, '__module__' : 'pb.challenge_pb2' # @@protoc_insertion_point(class_scope:challenge.EcdhKey) }) _sym_db.RegisterMessage(EcdhKey) EcdhPrivateKey = _reflection.GeneratedProtocolMessageType('EcdhPrivateKey', (_message.Message,), { 'DESCRIPTOR' : _ECDHPRIVATEKEY, '__module__' : 'pb.challenge_pb2' # @@protoc_insertion_point(class_scope:challenge.EcdhPrivateKey) }) _sym_db.RegisterMessage(EcdhPrivateKey) ServerHello = _reflection.GeneratedProtocolMessageType('ServerHello', (_message.Message,), { 'DESCRIPTOR' : _SERVERHELLO, '__module__' : 'pb.challenge_pb2' # @@protoc_insertion_point(class_scope:challenge.ServerHello) }) _sym_db.RegisterMessage(ServerHello) ClientHello = _reflection.GeneratedProtocolMessageType('ClientHello', (_message.Message,), { 'DESCRIPTOR' : _CLIENTHELLO, '__module__' : 'pb.challenge_pb2' # @@protoc_insertion_point(class_scope:challenge.ClientHello) }) _sym_db.RegisterMessage(ClientHello) SessionMessage = _reflection.GeneratedProtocolMessageType('SessionMessage', (_message.Message,), { 'DESCRIPTOR' : _SESSIONMESSAGE, '__module__' : 'pb.challenge_pb2' # @@protoc_insertion_point(class_scope:challenge.SessionMessage) }) _sym_db.RegisterMessage(SessionMessage) DESCRIPTOR._options = None # @@protoc_insertion_point(module_scope) PKE‘«s s cipher.go// Copyright 2021 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package server import ( "crypto-tiramisu/pb" "crypto/aes" "crypto/cipher" "crypto/hmac" "crypto/sha256" "fmt" "io" "golang.org/x/crypto/hkdf" ) type AuthCipher struct { aes cipher.Block macKey []byte } func deriveKey(secret, info []byte) ([]byte, error) { hash := sha256.New hkdf := hkdf.New(hash, secret, nil, info) key := make([]byte, aes.BlockSize) if _, err := io.ReadFull(hkdf, key); err != nil { return nil, err } return key, nil } func newAuthCipher(secret, cipherInfo, macInfo []byte) (*AuthCipher, error) { var err error authCipher := &AuthCipher{} cipherKey, err := deriveKey(secret, cipherInfo) if err != nil { return nil, err } authCipher.aes, err = aes.NewCipher(cipherKey) if err != nil { return nil, err } authCipher.macKey, err = deriveKey(secret, macInfo) if err != nil { return nil, err } return authCipher, nil } func (authCipher *AuthCipher) Encrypt(iv, plaintext []byte) (*pb.Ciphertext, error) { if len(iv) != aes.BlockSize { return nil, fmt.Errorf("len(iv) != aes.BlockSize, want %d, got %d", aes.BlockSize, len(iv)) } ciphertext := make([]byte, len(plaintext)) stream := cipher.NewCTR(authCipher.aes, iv) stream.XORKeyStream(ciphertext, plaintext) mac := hmac.New(sha256.New, authCipher.macKey) mac.Write(iv) mac.Write(ciphertext) return &pb.Ciphertext{ Iv: iv, Data: ciphertext, Mac: mac.Sum(nil), }, nil } func (authCipher *AuthCipher) Decrypt(ciphertext *pb.Ciphertext) ([]byte, error) { if len(ciphertext.Iv) != aes.BlockSize { return nil, fmt.Errorf("len(iv) != aes.BlockSize, want %d, got %d", aes.BlockSize, len(ciphertext.Iv)) } mac := hmac.New(sha256.New, authCipher.macKey) mac.Write(ciphertext.Iv) mac.Write(ciphertext.Data) expectedMAC := mac.Sum(nil) if !hmac.Equal(ciphertext.Mac, expectedMAC) { return nil, fmt.Errorf("mac mismatch, want %x, got %x", expectedMAC, ciphertext.Mac) } plaintext := make([]byte, len(ciphertext.Data)) stream := cipher.NewCTR(authCipher.aes, ciphertext.Iv) stream.XORKeyStream(plaintext, ciphertext.Data) return plaintext, nil } PKUd«Òœœclient_skel.py#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Copyright 2020 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import argparse import pwnlib import challenge_pb2 import struct import sys from cryptography.hazmat.primitives import hashes, hmac from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes from cryptography.hazmat.primitives.kdf.hkdf import HKDF from cryptography.hazmat.primitives.asymmetric import ec CHANNEL_CIPHER_KDF_INFO = b"Channel Cipher v1.0" CHANNEL_MAC_KDF_INFO = b"Channel MAC v1.0" IV = b'\x00\x11\x22\x33\x44\x55\x66\x77\x88\x99\xaa\xbb\xcc\xdd\xee\xff' class AuthCipher(object): def __init__(self, secret, cipher_info, mac_info): self.cipher_key = self.derive_key(secret, cipher_info) self.mac_key = self.derive_key(secret, mac_info) def derive_key(self, secret, info): hkdf = HKDF( algorithm=hashes.SHA256(), length=16, salt=None, info=info, ) return hkdf.derive(secret) def encrypt(self, iv, plaintext): cipher = Cipher(algorithms.AES(self.cipher_key), modes.CTR(iv)) encryptor = cipher.encryptor() ct = encryptor.update(plaintext) + encryptor.finalize() h = hmac.HMAC(self.mac_key, hashes.SHA256()) h.update(iv) h.update(ct) mac = h.finalize() out = challenge_pb2.Ciphertext() out.iv = iv out.data = ct out.mac = mac return out def handle_pow(tube): raise NotImplemented() def read_message(tube, typ): n = struct.unpack(' maxMessageLengh { return fmt.Errorf("want legnth <= %d, got %d", maxMessageLengh, length) } buf := make([]byte, length) if n, err := r.Read(buf); n != len(buf) || err != nil { return fmt.Errorf("failed to read serialized message, r.Read(buf) = %v, %v, want n=%d and nil error", n, err, len(buf)) } if err := proto.Unmarshal(buf, m); err != nil { return fmt.Errorf("failed to unmarshal message, proto.Unmarshal(%X, m) = %v, want nil error", buf, err) } return nil } func runSession(server *server.Server, r io.Reader, w io.Writer) error { serverHello := server.ServerHello() if err := writeMessage(w, serverHello); err != nil { return fmt.Errorf("writeMessage(w, serverHello=%X)=%v, want nil err", serverHello, err) } clientHello := &pb.ClientHello{} if err := readMessage(r, clientHello); err != nil { return fmt.Errorf("readMessage(r, clientHello)=%v, want nil err", err) } if err := server.EstablishChannel(clientHello); err != nil { return fmt.Errorf("server.EstablishChannel(clientHello=%X)=%v, want nil err", clientHello, err) } for { clientMsg := &pb.SessionMessage{} if err := readMessage(r, clientMsg); err != nil { return fmt.Errorf("readMessage(r, clientMsg)=%v, want nil err", err) } serverMsg := server.EchoSessionMessage(clientMsg) if err := writeMessage(w, serverMsg); err != nil { return fmt.Errorf("writeMessage(w, serverMsg=%X)=%v, want nil err", serverMsg, err) } } } func init() { flag.StringVar(&flagFile, "flag", "/flag", "flag filename") flag.StringVar(&keyFile, "key", "/server_ecdh_private.textproto", "input key filename") } func main() { defer func() { if r := recover(); r != nil { // Uncomment to catch panics during development. // panic(r) } }() flag.Parse() f, err := ioutil.ReadFile(flagFile) if err != nil { panic(err) } keyData, err := ioutil.ReadFile(keyFile) if err != nil { panic(err) } key := &pb.EcdhPrivateKey{} if err = prototext.Unmarshal(keyData, key); err != nil { panic(err) } server, err := server.NewServer(strings.TrimSpace(string(f)), key) if err != nil { panic(err) } err = runSession(server, os.Stdin, os.Stdout) if err != nil { panic(err) } } PKœ¢£M£M¤challenge.pb.goPKÒy ‰‰¤ÐMchallenge.protoPKÆ©5©5¤†Rchallenge_pb2.pyPKE‘«s s ¤]ˆcipher.goPKUd«Òœœ¤÷’client_skel.pyPKù¸‘VV ¤¿£pb_util.goPKTPKŠöö ¤=©server.goPKÝñýÜ^^¤Z¹server_main.goPKÖäÈ