@@ -182,7 +182,7 @@ static skdp_errors client_establish_request(skdp_client_state* ctx, const skdp_n
182182 if (skdp_packet_time_valid (packetin ) == true)
183183 {
184184 /* generate the encryption and mac keys */
185- qsc_cshake_initialize (& kctx , SKDP_PERMUTATION_RATE , ctx -> ddk , SKDP_STK_SIZE , NULL , 0U , ctx -> ssh , SKDP_STH_SIZE );
185+ qsc_cshake_initialize (& kctx , SKDP_PERMUTATION_RATE , ctx -> ddk , SKDP_DDK_SIZE , NULL , 0U , ctx -> ssh , SKDP_STH_SIZE );
186186 qsc_cshake_squeezeblocks (& kctx , SKDP_PERMUTATION_RATE , prnd , RNDBLK );
187187
188188 /* mac the encrypted token key */
@@ -266,37 +266,46 @@ static skdp_errors client_establish_verify(skdp_client_state* ctx, const skdp_ne
266266
267267 err = skdp_error_none ;
268268
269- /* serialize the packet header and add it to associated data */
270- skdp_packet_header_serialize (packetin , hdr );
271- skdp_cipher_set_associated (& ctx -> rxcpr , hdr , SKDP_HEADER_SIZE );
272-
273- /* authenticate and decrypt the cipher-text */
274- if (skdp_cipher_transform (& ctx -> rxcpr , msg , packetin -> pmessage , packetin -> msglen - SKDP_MACTAG_SIZE ) == true)
269+ if (packetin -> flag == skdp_flag_establish_response &&
270+ packetin -> msglen == SKDP_ESTABLISH_RESPONSE_MESSAGE_SIZE )
275271 {
276- qsc_keccak_state kctx = { 0 };
277- uint8_t vhash [SKDP_HASH_SIZE ] = { 0U };
272+ /* serialize the packet header and add it to associated data */
273+ skdp_packet_header_serialize (packetin , hdr );
274+ skdp_cipher_set_associated (& ctx -> rxcpr , hdr , SKDP_HEADER_SIZE );
278275
279- /* hash the stored random verification-token */
280- qsc_sha3_initialize (& kctx );
281- qsc_sha3_update (& kctx , SKDP_PERMUTATION_RATE , ctx -> dsh , SKDP_STH_SIZE );
282- qsc_sha3_finalize (& kctx , SKDP_PERMUTATION_RATE , vhash );
276+ /* authenticate and decrypt the cipher-text */
277+ if (skdp_cipher_transform (& ctx -> rxcpr , msg , packetin -> pmessage , packetin -> msglen - SKDP_MACTAG_SIZE ) == true)
278+ {
279+ qsc_keccak_state kctx = { 0 };
280+ uint8_t vhash [SKDP_HASH_SIZE ] = { 0U };
283281
284- qsc_memutils_secure_erase (& kctx , sizeof (qsc_keccak_state ));
282+ /* hash the stored random verification-token */
283+ qsc_sha3_initialize (& kctx );
284+ qsc_sha3_update (& kctx , SKDP_PERMUTATION_RATE , ctx -> dsh , SKDP_STH_SIZE );
285+ qsc_sha3_finalize (& kctx , SKDP_PERMUTATION_RATE , vhash );
285286
286- if (qsc_intutils_verify (vhash , msg , SKDP_HASH_SIZE ) == 0 )
287- {
288- ctx -> exflag = skdp_flag_session_established ;
287+ qsc_memutils_secure_erase (& kctx , sizeof (qsc_keccak_state ));
288+
289+ if (qsc_intutils_verify (vhash , msg , SKDP_HASH_SIZE ) == 0 )
290+ {
291+ ctx -> exflag = skdp_flag_session_established ;
292+ }
293+ else
294+ {
295+ ctx -> exflag = skdp_flag_none ;
296+ err = skdp_error_establish_failure ;
297+ }
289298 }
290299 else
291300 {
292301 ctx -> exflag = skdp_flag_none ;
293- err = skdp_error_establish_failure ;
302+ err = skdp_error_cipher_auth_failure ;
294303 }
295304 }
296305 else
297306 {
298307 ctx -> exflag = skdp_flag_none ;
299- err = skdp_error_cipher_auth_failure ;
308+ err = skdp_error_invalid_input ;
300309 }
301310
302311 return err ;
@@ -333,7 +342,7 @@ static skdp_errors client_key_exchange(skdp_client_state* ctx, qsc_socket* sock)
333342 if (rlen == SKDP_CONNECT_RESPONSE_PACKET_SIZE )
334343 {
335344 /* convert server response to packet */
336- skdp_packet_header_deserialize (mresp , & resp );
345+ skdp_packet_header_deserialize (mresp , SKDP_HEADER_SIZE , & resp );
337346 resp .pmessage = mresp + SKDP_HEADER_SIZE ;
338347
339348 if (resp .sequence == ctx -> rxseq )
@@ -397,7 +406,7 @@ static skdp_errors client_key_exchange(skdp_client_state* ctx, qsc_socket* sock)
397406
398407 if (rlen == SKDP_EXCHANGE_RESPONSE_PACKET_SIZE )
399408 {
400- skdp_packet_header_deserialize (mresp , & resp );
409+ skdp_packet_header_deserialize (mresp , SKDP_HEADER_SIZE , & resp );
401410 resp .pmessage = mresp + SKDP_HEADER_SIZE ;
402411
403412 if (resp .sequence == ctx -> rxseq )
@@ -460,7 +469,7 @@ static skdp_errors client_key_exchange(skdp_client_state* ctx, qsc_socket* sock)
460469
461470 if (rlen == SKDP_ESTABLISH_RESPONSE_PACKET_SIZE )
462471 {
463- skdp_packet_header_deserialize (mresp , & resp );
472+ skdp_packet_header_deserialize (mresp , SKDP_HEADER_SIZE , & resp );
464473 resp .pmessage = mresp + SKDP_HEADER_SIZE ;
465474
466475 if (resp .sequence == ctx -> rxseq )
@@ -654,7 +663,7 @@ void skdp_client_connection_close(skdp_client_state* ctx, qsc_socket* sock, skdp
654663 client_dispose (ctx );
655664}
656665
657- skdp_errors skdp_client_decrypt_packet (skdp_client_state * ctx , const skdp_network_packet * packetin , uint8_t * message , size_t * msglen )
666+ skdp_errors skdp_client_decrypt_packet (skdp_client_state * ctx , const skdp_network_packet * packetin , uint8_t * message , size_t message_capacity , size_t * msglen )
658667{
659668 SKDP_ASSERT (ctx != NULL );
660669 SKDP_ASSERT (message != NULL );
@@ -675,22 +684,26 @@ skdp_errors skdp_client_decrypt_packet(skdp_client_state* ctx, const skdp_networ
675684 /* change 1.1 anti-replay; verify the packet time */
676685 if (skdp_packet_time_valid (packetin ) == true)
677686 {
678- /* serialize the header and add it to the ciphers associated data */
679- skdp_packet_header_serialize (packetin , hdr );
680- skdp_cipher_set_associated (& ctx -> rxcpr , hdr , SKDP_HEADER_SIZE );
681-
682- if (packetin -> msglen >= SKDP_MACTAG_SIZE )
687+ if (packetin -> flag == skdp_flag_encrypted_message &&
688+ packetin -> msglen >= SKDP_MACTAG_SIZE &&
689+ packetin -> msglen <= SKDP_MESSAGE_SIZE + SKDP_MACTAG_SIZE &&
690+ packetin -> msglen - SKDP_MACTAG_SIZE <= message_capacity )
683691 {
692+ /* serialize the header and add it to the ciphers associated data */
693+ skdp_packet_header_serialize (packetin , hdr );
694+ skdp_cipher_set_associated (& ctx -> rxcpr , hdr , SKDP_HEADER_SIZE );
695+
684696 * msglen = packetin -> msglen - SKDP_MACTAG_SIZE ;
685- ctx -> rxseq += 1 ;
686697
687698 /* authenticate then decrypt the data */
688699 if (skdp_cipher_transform (& ctx -> rxcpr , message , packetin -> pmessage , * msglen ) == true)
689700 {
701+ ctx -> rxseq += 1U ;
690702 err = skdp_error_none ;
691703 }
692704 else
693705 {
706+ ctx -> exflag = skdp_flag_none ;
694707 err = skdp_error_cipher_auth_failure ;
695708 }
696709 }
@@ -716,7 +729,7 @@ skdp_errors skdp_client_decrypt_packet(skdp_client_state* ctx, const skdp_networ
716729 }
717730 }
718731
719- if (err != skdp_error_none )
732+ if (msglen != NULL && err != skdp_error_none )
720733 {
721734 * msglen = 0 ;
722735 }
@@ -738,22 +751,29 @@ skdp_errors skdp_client_encrypt_packet(skdp_client_state* ctx, const uint8_t* me
738751 {
739752 if (ctx -> exflag == skdp_flag_session_established )
740753 {
741- uint8_t hdr [SKDP_HEADER_SIZE ] = { 0U };
754+ if (msglen <= SKDP_MESSAGE_SIZE )
755+ {
756+ uint8_t hdr [SKDP_HEADER_SIZE ] = { 0U };
742757
743- /* assemble the encryption packet */
744- ctx -> txseq += 1 ;
745- packetout -> flag = skdp_flag_encrypted_message ;
746- packetout -> msglen = (uint32_t )msglen + SKDP_MACTAG_SIZE ;
747- packetout -> sequence = ctx -> txseq ;
748- /* change 1.1 anti-replay; set the packet utc time field */
749- skdp_packet_set_utc_time (packetout );
750- /* serialize the header and add it to the ciphers associated data */
751- skdp_packet_header_serialize (packetout , hdr );
752- skdp_cipher_set_associated (& ctx -> txcpr , hdr , SKDP_HEADER_SIZE );
753- /* encrypt the message */
754- skdp_cipher_transform (& ctx -> txcpr , packetout -> pmessage , message , msglen );
755-
756- err = skdp_error_none ;
758+ /* assemble the encryption packet */
759+ ctx -> txseq += 1U ;
760+ packetout -> flag = skdp_flag_encrypted_message ;
761+ packetout -> msglen = (uint32_t )msglen + SKDP_MACTAG_SIZE ;
762+ packetout -> sequence = ctx -> txseq ;
763+ /* change 1.1 anti-replay; set the packet utc time field */
764+ skdp_packet_set_utc_time (packetout );
765+ /* serialize the header and add it to the ciphers associated data */
766+ skdp_packet_header_serialize (packetout , hdr );
767+ skdp_cipher_set_associated (& ctx -> txcpr , hdr , SKDP_HEADER_SIZE );
768+ /* encrypt the message */
769+ skdp_cipher_transform (& ctx -> txcpr , packetout -> pmessage , message , msglen );
770+
771+ err = skdp_error_none ;
772+ }
773+ else
774+ {
775+ err = skdp_error_invalid_input ;
776+ }
757777 }
758778 else
759779 {
0 commit comments