protected virtual void PrepareSrtpSharedSecret() { //Set master secret back to security parameters (only works in old bouncy castle versions) //mContext.SecurityParameters.MasterSecret = masterSecret; SrtpParameters srtpParams = SrtpParameters.GetSrtpParametersForProfile(clientSrtpData.ProtectionProfiles[0]); int keyLen = srtpParams.GetCipherKeyLength(); int saltLen = srtpParams.GetCipherSaltLength(); srtpPolicy = srtpParams.GetSrtpPolicy(); srtcpPolicy = srtpParams.GetSrtcpPolicy(); srtpMasterClientKey = new byte[keyLen]; srtpMasterServerKey = new byte[keyLen]; srtpMasterClientSalt = new byte[saltLen]; srtpMasterServerSalt = new byte[saltLen]; // 2* (key + salt length) / 8. From http://tools.ietf.org/html/rfc5764#section-4-2 // No need to divide by 8 here since lengths are already in bits byte[] sharedSecret = GetKeyingMaterial(2 * (keyLen + saltLen)); /* * * See: http://tools.ietf.org/html/rfc5764#section-4.2 * * sharedSecret is an equivalent of : * * struct { * client_write_SRTP_master_key[SRTPSecurityParams.master_key_len]; * server_write_SRTP_master_key[SRTPSecurityParams.master_key_len]; * client_write_SRTP_master_salt[SRTPSecurityParams.master_salt_len]; * server_write_SRTP_master_salt[SRTPSecurityParams.master_salt_len]; * } ; * * Here, client = local configuration, server = remote. * NOTE [ivelin]: 'local' makes sense if this code is used from a DTLS SRTP client. * Here we run as a server, so 'local' referring to the client is actually confusing. * * l(k) = KEY length * s(k) = salt lenght * * So we have the following repartition : * l(k) 2*l(k)+s(k) * 2*l(k) 2*(l(k)+s(k)) * +------------------------+------------------------+---------------+-------------------+ * + local key | remote key | local salt | remote salt | * +------------------------+------------------------+---------------+-------------------+ */ Buffer.BlockCopy(sharedSecret, 0, srtpMasterClientKey, 0, keyLen); Buffer.BlockCopy(sharedSecret, keyLen, srtpMasterServerKey, 0, keyLen); Buffer.BlockCopy(sharedSecret, 2 * keyLen, srtpMasterClientSalt, 0, saltLen); Buffer.BlockCopy(sharedSecret, (2 * keyLen + saltLen), srtpMasterServerSalt, 0, saltLen); }
private IPacketTransformer GenerateTransformer(SDPSecurityDescription securityDescription, bool isRtp) { var srtpParams = SrtpParameters.GetSrtpParametersForProfile((int)securityDescription.CryptoSuite); var engine = new SrtpTransformEngine(securityDescription.KeyParams[0].Key, securityDescription.KeyParams[0].Salt, srtpParams.GetSrtpPolicy(), srtpParams.GetSrtcpPolicy()); if (isRtp) { return(engine.GetRTPTransformer()); } else { return(engine.GetRTCPTransformer()); } }