@@ -305,31 +305,35 @@ func (s *ServerSession) DecodeRequestHeader(reader io.Reader) (*protocol.Request
305305}
306306
307307// DecodeRequestBody returns Reader from which caller can fetch decrypted body.
308- func (s * ServerSession ) DecodeRequestBody (request * protocol.RequestHeader , reader io.Reader ) buf.Reader {
308+ func (s * ServerSession ) DecodeRequestBody (request * protocol.RequestHeader , reader io.Reader ) ( buf.Reader , error ) {
309309 var sizeParser crypto.ChunkSizeDecoder = crypto.PlainChunkSizeParser {}
310310 if request .Option .Has (protocol .RequestOptionChunkMasking ) {
311311 sizeParser = NewShakeSizeParser (s .requestBodyIV [:])
312312 }
313313 var padding crypto.PaddingLengthGenerator
314314 if request .Option .Has (protocol .RequestOptionGlobalPadding ) {
315- padding = sizeParser .(crypto.PaddingLengthGenerator )
315+ var ok bool
316+ padding , ok = sizeParser .(crypto.PaddingLengthGenerator )
317+ if ! ok {
318+ return nil , newError ("invalid option: RequestOptionGlobalPadding" )
319+ }
316320 }
317321
318322 switch request .Security {
319323 case protocol .SecurityType_NONE :
320324 if request .Option .Has (protocol .RequestOptionChunkStream ) {
321325 if request .Command .TransferType () == protocol .TransferTypeStream {
322- return crypto .NewChunkStreamReader (sizeParser , reader )
326+ return crypto .NewChunkStreamReader (sizeParser , reader ), nil
323327 }
324328
325329 auth := & crypto.AEADAuthenticator {
326330 AEAD : new (NoOpAuthenticator ),
327331 NonceGenerator : crypto .GenerateEmptyBytes (),
328332 AdditionalDataGenerator : crypto .GenerateEmptyBytes (),
329333 }
330- return crypto .NewAuthenticationReader (auth , sizeParser , reader , protocol .TransferTypePacket , padding )
334+ return crypto .NewAuthenticationReader (auth , sizeParser , reader , protocol .TransferTypePacket , padding ), nil
331335 }
332- return buf .NewReader (reader )
336+ return buf .NewReader (reader ), nil
333337
334338 case protocol .SecurityType_LEGACY :
335339 aesStream := crypto .NewAesDecryptionStream (s .requestBodyKey [:], s .requestBodyIV [:])
@@ -340,9 +344,9 @@ func (s *ServerSession) DecodeRequestBody(request *protocol.RequestHeader, reade
340344 NonceGenerator : crypto .GenerateEmptyBytes (),
341345 AdditionalDataGenerator : crypto .GenerateEmptyBytes (),
342346 }
343- return crypto .NewAuthenticationReader (auth , sizeParser , cryptionReader , request .Command .TransferType (), padding )
347+ return crypto .NewAuthenticationReader (auth , sizeParser , cryptionReader , request .Command .TransferType (), padding ), nil
344348 }
345- return buf .NewReader (cryptionReader )
349+ return buf .NewReader (cryptionReader ), nil
346350
347351 case protocol .SecurityType_AES128_GCM :
348352 aead := crypto .NewAesGcm (s .requestBodyKey [:])
@@ -362,7 +366,7 @@ func (s *ServerSession) DecodeRequestBody(request *protocol.RequestHeader, reade
362366 }
363367 sizeParser = NewAEADSizeParser (lengthAuth )
364368 }
365- return crypto .NewAuthenticationReader (auth , sizeParser , reader , request .Command .TransferType (), padding )
369+ return crypto .NewAuthenticationReader (auth , sizeParser , reader , request .Command .TransferType (), padding ), nil
366370
367371 case protocol .SecurityType_CHACHA20_POLY1305 :
368372 aead , _ := chacha20poly1305 .New (GenerateChacha20Poly1305Key (s .requestBodyKey [:]))
@@ -384,10 +388,10 @@ func (s *ServerSession) DecodeRequestBody(request *protocol.RequestHeader, reade
384388 }
385389 sizeParser = NewAEADSizeParser (lengthAuth )
386390 }
387- return crypto .NewAuthenticationReader (auth , sizeParser , reader , request .Command .TransferType (), padding )
391+ return crypto .NewAuthenticationReader (auth , sizeParser , reader , request .Command .TransferType (), padding ), nil
388392
389393 default :
390- panic ( "Unknown security type. " )
394+ return nil , newError ( "invalid option: Security " )
391395 }
392396}
393397
@@ -448,31 +452,35 @@ func (s *ServerSession) EncodeResponseHeader(header *protocol.ResponseHeader, wr
448452}
449453
450454// EncodeResponseBody returns a Writer that auto-encrypt content written by caller.
451- func (s * ServerSession ) EncodeResponseBody (request * protocol.RequestHeader , writer io.Writer ) buf.Writer {
455+ func (s * ServerSession ) EncodeResponseBody (request * protocol.RequestHeader , writer io.Writer ) ( buf.Writer , error ) {
452456 var sizeParser crypto.ChunkSizeEncoder = crypto.PlainChunkSizeParser {}
453457 if request .Option .Has (protocol .RequestOptionChunkMasking ) {
454458 sizeParser = NewShakeSizeParser (s .responseBodyIV [:])
455459 }
456460 var padding crypto.PaddingLengthGenerator
457461 if request .Option .Has (protocol .RequestOptionGlobalPadding ) {
458- padding = sizeParser .(crypto.PaddingLengthGenerator )
462+ var ok bool
463+ padding , ok = sizeParser .(crypto.PaddingLengthGenerator )
464+ if ! ok {
465+ return nil , newError ("invalid option: RequestOptionGlobalPadding" )
466+ }
459467 }
460468
461469 switch request .Security {
462470 case protocol .SecurityType_NONE :
463471 if request .Option .Has (protocol .RequestOptionChunkStream ) {
464472 if request .Command .TransferType () == protocol .TransferTypeStream {
465- return crypto .NewChunkStreamWriter (sizeParser , writer )
473+ return crypto .NewChunkStreamWriter (sizeParser , writer ), nil
466474 }
467475
468476 auth := & crypto.AEADAuthenticator {
469477 AEAD : new (NoOpAuthenticator ),
470478 NonceGenerator : crypto .GenerateEmptyBytes (),
471479 AdditionalDataGenerator : crypto .GenerateEmptyBytes (),
472480 }
473- return crypto .NewAuthenticationWriter (auth , sizeParser , writer , protocol .TransferTypePacket , padding )
481+ return crypto .NewAuthenticationWriter (auth , sizeParser , writer , protocol .TransferTypePacket , padding ), nil
474482 }
475- return buf .NewWriter (writer )
483+ return buf .NewWriter (writer ), nil
476484
477485 case protocol .SecurityType_LEGACY :
478486 if request .Option .Has (protocol .RequestOptionChunkStream ) {
@@ -481,9 +489,9 @@ func (s *ServerSession) EncodeResponseBody(request *protocol.RequestHeader, writ
481489 NonceGenerator : crypto .GenerateEmptyBytes (),
482490 AdditionalDataGenerator : crypto .GenerateEmptyBytes (),
483491 }
484- return crypto .NewAuthenticationWriter (auth , sizeParser , s .responseWriter , request .Command .TransferType (), padding )
492+ return crypto .NewAuthenticationWriter (auth , sizeParser , s .responseWriter , request .Command .TransferType (), padding ), nil
485493 }
486- return & buf.SequentialWriter {Writer : s .responseWriter }
494+ return & buf.SequentialWriter {Writer : s .responseWriter }, nil
487495
488496 case protocol .SecurityType_AES128_GCM :
489497 aead := crypto .NewAesGcm (s .responseBodyKey [:])
@@ -503,7 +511,7 @@ func (s *ServerSession) EncodeResponseBody(request *protocol.RequestHeader, writ
503511 }
504512 sizeParser = NewAEADSizeParser (lengthAuth )
505513 }
506- return crypto .NewAuthenticationWriter (auth , sizeParser , writer , request .Command .TransferType (), padding )
514+ return crypto .NewAuthenticationWriter (auth , sizeParser , writer , request .Command .TransferType (), padding ), nil
507515
508516 case protocol .SecurityType_CHACHA20_POLY1305 :
509517 aead , _ := chacha20poly1305 .New (GenerateChacha20Poly1305Key (s .responseBodyKey [:]))
@@ -525,9 +533,9 @@ func (s *ServerSession) EncodeResponseBody(request *protocol.RequestHeader, writ
525533 }
526534 sizeParser = NewAEADSizeParser (lengthAuth )
527535 }
528- return crypto .NewAuthenticationWriter (auth , sizeParser , writer , request .Command .TransferType (), padding )
536+ return crypto .NewAuthenticationWriter (auth , sizeParser , writer , request .Command .TransferType (), padding ), nil
529537
530538 default :
531- panic ( "Unknown security type. " )
539+ return nil , newError ( "invalid option: Security " )
532540 }
533541}
0 commit comments