@@ -84,6 +84,10 @@ srtp_err_status_t srtp_validate_encrypted_extensions_headers_gcm(void);
84
84
85
85
srtp_err_status_t srtp_validate_aes_256 (void );
86
86
87
+ #ifdef GCM
88
+ srtp_err_status_t srtp_validate_aes_192 (void );
89
+ #endif
90
+
87
91
srtp_err_status_t srtp_create_big_policy (srtp_policy_t * * list );
88
92
89
93
srtp_err_status_t srtp_dealloc_big_policy (srtp_policy_t * list );
@@ -772,6 +776,21 @@ int main(int argc, char *argv[])
772
776
}
773
777
#endif
774
778
779
+ #ifdef GCM
780
+ /*
781
+ * run validation test against the reference packets for
782
+ * AES-192
783
+ */
784
+ printf ("testing srtp_protect and srtp_unprotect against "
785
+ "reference packet (AES-192)\n" );
786
+ if (srtp_validate_aes_192 () == srtp_err_status_ok ) {
787
+ printf ("passed\n\n" );
788
+ } else {
789
+ printf ("failed\n" );
790
+ exit (1 );
791
+ }
792
+ #endif
793
+
775
794
/*
776
795
* run validation test against the reference packets for
777
796
* AES-256
@@ -3985,6 +4004,105 @@ srtp_err_status_t srtp_validate_encrypted_extensions_headers_gcm(void)
3985
4004
3986
4005
return srtp_err_status_ok ;
3987
4006
}
4007
+
4008
+ /*
4009
+ * srtp_validate_aes_192() verifies the correctness of libsrtp by comparing
4010
+ * some computed packets against some pre-computed reference values.
4011
+ * These packets were made with the AES-CM-192/HMAC-SHA-1-80 policy.
4012
+ *
4013
+ * The master key and master salt come from RFC 6188 section 7.4 .
4014
+ * The test vectors where generated using the cipher key and cipher salt
4015
+ * in section 7.4 with cipher_driver with the nonce and plaintext in the
4016
+ * srtp_plaintext_ref.
4017
+ */
4018
+
4019
+ srtp_err_status_t srtp_validate_aes_192 (void )
4020
+ {
4021
+ // clang-format off
4022
+ uint8_t aes_192_test_key [38 ] = {
4023
+ 0x73 , 0xed , 0xc6 , 0x6c , 0x4f , 0xa1 , 0x57 , 0x76 ,
4024
+ 0xfb , 0x57 , 0xf9 , 0x50 , 0x5c , 0x17 , 0x13 , 0x65 ,
4025
+ 0x50 , 0xff , 0xda , 0x71 , 0xf3 , 0xe8 , 0xe5 , 0xf1 ,
4026
+
4027
+ 0xc8 , 0x52 , 0x2f , 0x3a , 0xcd , 0x4c , 0xe8 , 0x6d ,
4028
+ 0x5a , 0xdd , 0x78 , 0xed , 0xbb , 0x11
4029
+ };
4030
+ uint8_t srtp_plaintext_ref [28 ] = {
4031
+ 0x80 , 0x0f , 0x00 , 0x00 , 0xde , 0xca , 0xfb , 0xad ,
4032
+ 0x00 , 0x00 , 0x00 , 0x00 , 0xab , 0xab , 0xab , 0xab ,
4033
+ 0xab , 0xab , 0xab , 0xab , 0xab , 0xab , 0xab , 0xab ,
4034
+ 0xab , 0xab , 0xab , 0xab
4035
+ };
4036
+ uint8_t srtp_plaintext [38 ] = {
4037
+ 0x80 , 0x0f , 0x00 , 0x00 , 0xde , 0xca , 0xfb , 0xad ,
4038
+ 0x00 , 0x00 , 0x00 , 0x00 , 0xab , 0xab , 0xab , 0xab ,
4039
+ 0xab , 0xab , 0xab , 0xab , 0xab , 0xab , 0xab , 0xab ,
4040
+ 0xab , 0xab , 0xab , 0xab , 0x00 , 0x00 , 0x00 , 0x00 ,
4041
+ 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
4042
+ };
4043
+ uint8_t srtp_ciphertext [38 ] = {
4044
+ 0x80 , 0x0f , 0x00 , 0x00 , 0xde , 0xca , 0xfb , 0xad ,
4045
+ 0x00 , 0x00 , 0x00 , 0x00 , 0xd9 , 0x88 , 0x65 , 0x55 ,
4046
+ 0x2f , 0x27 , 0x62 , 0xc3 , 0xef , 0x37 , 0xf8 , 0x37 ,
4047
+ 0xac , 0xfd , 0xb7 , 0x12 , 0x2d , 0x6b , 0xc4 , 0xdc ,
4048
+ 0x84 , 0xc7 , 0x6f , 0x74 , 0xae , 0xa5
4049
+ };
4050
+ // clang-format on
4051
+
4052
+ srtp_t srtp_snd , srtp_recv ;
4053
+ size_t len ;
4054
+ srtp_policy_t policy ;
4055
+
4056
+ /*
4057
+ * create a session with a single stream using the default srtp
4058
+ * policy and with the SSRC value 0xcafebabe
4059
+ */
4060
+ memset (& policy , 0 , sizeof (policy ));
4061
+ srtp_crypto_policy_set_aes_cm_192_hmac_sha1_80 (& policy .rtp );
4062
+ srtp_crypto_policy_set_aes_cm_192_hmac_sha1_80 (& policy .rtcp );
4063
+ policy .ssrc .type = ssrc_specific ;
4064
+ policy .ssrc .value = 0x00000000 ;
4065
+ policy .key = aes_192_test_key ;
4066
+ policy .window_size = 128 ;
4067
+ policy .allow_repeat_tx = false;
4068
+ policy .next = NULL ;
4069
+
4070
+ CHECK_OK (srtp_create (& srtp_snd , & policy ));
4071
+
4072
+ /*
4073
+ * protect plaintext, then compare with ciphertext
4074
+ */
4075
+ len = 28 ;
4076
+ CHECK_OK (call_srtp_protect (srtp_snd , srtp_plaintext , & len , 0 ));
4077
+ CHECK (len == 38 );
4078
+
4079
+ debug_print (mod_driver , "ciphertext:\n %s" ,
4080
+ octet_string_hex_string (srtp_plaintext , len ));
4081
+ debug_print (mod_driver , "ciphertext reference:\n %s" ,
4082
+ octet_string_hex_string (srtp_ciphertext , len ));
4083
+
4084
+ CHECK_BUFFER_EQUAL (srtp_plaintext , srtp_ciphertext , len );
4085
+
4086
+ /*
4087
+ * create a receiver session context comparable to the one created
4088
+ * above - we need to do this so that the replay checking doesn't
4089
+ * complain
4090
+ */
4091
+ CHECK_OK (srtp_create (& srtp_recv , & policy ));
4092
+
4093
+ /*
4094
+ * unprotect ciphertext, then compare with plaintext
4095
+ */
4096
+ CHECK_OK (call_srtp_unprotect (srtp_recv , srtp_ciphertext , & len ));
4097
+ CHECK (len == 28 );
4098
+
4099
+ CHECK_BUFFER_EQUAL (srtp_ciphertext , srtp_plaintext_ref , len );
4100
+
4101
+ CHECK_OK (srtp_dealloc (srtp_snd ));
4102
+ CHECK_OK (srtp_dealloc (srtp_recv ));
4103
+
4104
+ return srtp_err_status_ok ;
4105
+ }
3988
4106
#endif
3989
4107
3990
4108
/*
0 commit comments