pub struct Handshake(/* private fields */);
Expand description
The 1536 bytes handshake data. This respectively consists of following parts:
Range | Representation |
---|---|
First 4 bytes | Timestamp (in milliseconds) |
Second 4 bytes | Flash Player version/Flash Media Server version |
Remained bytes | Randoms for handshake (may be contained digest/signature) |
Implementations§
Source§impl Handshake
impl Handshake
Sourcepub const CLIENT_KEY: &'static [u8] = b"Genuine Adobe Flash Player 001"
pub const CLIENT_KEY: &'static [u8] = b"Genuine Adobe Flash Player 001"
The key which is used to imprint ant client-side digest.
Sourcepub const SERVER_KEY: &'static [u8] = b"Genuine Adobe Flash Media Server 001"
pub const SERVER_KEY: &'static [u8] = b"Genuine Adobe Flash Media Server 001"
The key which is used to imprint any server-side digest.
Sourcepub const COMMON_KEY: &'static [u8] = _
pub const COMMON_KEY: &'static [u8] = _
The key which is used to imprint any signature. Both sides are required to contain this into a key of signature.
Sourcepub fn new(timestamp: Duration, version: Version) -> Self
pub fn new(timestamp: Duration, version: Version) -> Self
Constructs handshake data.
§Examples
use std::time::Duration;
use sheave_core::handshake::{
Handshake,
Version,
EncryptionAlgorithm
};
// If you are a client.
let mut client_handshake = Handshake::new(Duration::default(), Version::LATEST_CLIENT);
// If you are a server.
let mut server_handshake = Handshake::new(Duration::default(), Version::LATEST_SERVER);
Sourcepub fn get_timestamp(&self) -> Duration
pub fn get_timestamp(&self) -> Duration
Gets first 4 bytes as timestamp.
Sourcepub fn get_version(&self) -> Version
pub fn get_version(&self) -> Version
Gets second 4 bytes as Flash Player version/Flash Media Server version.
Sourcepub fn get_digest(&self, encryption_algorithm: EncryptionAlgorithm) -> &[u8] ⓘ
pub fn get_digest(&self, encryption_algorithm: EncryptionAlgorithm) -> &[u8] ⓘ
Gets a digest contained in this handshake bytes. Note its place is different by whether encrypts handshake bytes.
§Examples
use std::time::Instant;
use sheave_core::handshake::{
EncryptionAlgorithm,
Handshake,
Version
};
let handshake = Handshake::new(Instant::now().elapsed(), Version::LATEST_CLIENT);
assert_ne!(handshake.get_digest(EncryptionAlgorithm::NotEncrypted), handshake.get_digest(EncryptionAlgorithm::DiffieHellman))
Sourcepub fn imprint_digest(
&mut self,
encryption_algorithm: EncryptionAlgorithm,
key: &[u8],
)
pub fn imprint_digest( &mut self, encryption_algorithm: EncryptionAlgorithm, key: &[u8], )
Imprints an HMAC-SHA256 digest into handshake data.
§Examples
use std::time::Duration;
use sheave_core::handshake::{
Handshake,
Version,
EncryptionAlgorithm
};
// In a case of sending client-side request.
let mut client_handshake = Handshake::new(Duration::default(), Version::LATEST_CLIENT);
client_handshake.imprint_digest(EncryptionAlgorithm::NotEncrypted, Handshake::CLIENT_KEY);
// In a case of sending server-side request.
let mut server_handshake = Handshake::new(Duration::default(), Version::LATEST_SERVER);
server_handshake.imprint_digest(EncryptionAlgorithm::NotEncrypted, Handshake::SERVER_KEY);
Sourcepub fn did_digest_match(
&self,
encryption_algorithm: EncryptionAlgorithm,
key: &[u8],
) -> bool
pub fn did_digest_match( &self, encryption_algorithm: EncryptionAlgorithm, key: &[u8], ) -> bool
Checks whether imprinted digest matches with one computed by given key.
§Examples
use std::time::Duration;
use sheave_core::handshake::{
Handshake,
Version,
EncryptionAlgorithm
};
// In a case of checking server-side request.
let mut server_handshake = Handshake::new(Duration::default(), Version::LATEST_SERVER);
server_handshake.imprint_digest(EncryptionAlgorithm::NotEncrypted, Handshake::SERVER_KEY);
assert!(server_handshake.did_digest_match(EncryptionAlgorithm::NotEncrypted, Handshake::SERVER_KEY));
// In a case of checking client-side request.
let mut client_handshake = Handshake::new(Duration::default(), Version::LATEST_CLIENT);
server_handshake.imprint_digest(EncryptionAlgorithm::NotEncrypted, Handshake::CLIENT_KEY);
assert!(server_handshake.did_digest_match(EncryptionAlgorithm::NotEncrypted, Handshake::CLIENT_KEY));
Sourcepub fn get_signature(&self) -> &[u8] ⓘ
pub fn get_signature(&self) -> &[u8] ⓘ
Gets a signature contained into this handshake bytes.
Sourcepub fn imprint_signature(
&mut self,
encryption_algorithm: EncryptionAlgorithm,
key: &[u8],
)
pub fn imprint_signature( &mut self, encryption_algorithm: EncryptionAlgorithm, key: &[u8], )
Imprints an HMAC-SHA256 signature into handshake data.
§Examples
use std::time::Duration;
use sheave_core::handshake::{
Handshake,
Version,
EncryptionAlgorithm
};
// In a case of exchanging client-side request with server-side response.
let mut client_handshake = Handshake::new(Duration::default(), Version::LATEST_CLIENT);
client_handshake.imprint_digest(EncryptionAlgorithm::NotEncrypted, Handshake::CLIENT_KEY);
let mut key: Vec<u8> = Vec::new();
key.extend_from_slice(Handshake::SERVER_KEY);
key.extend_from_slice(Handshake::COMMON_KEY);
client_handshake.imprint_signature(EncryptionAlgorithm::NotEncrypted, key.as_slice());
// In a case of exchanging server-side request with client-side response.
let mut server_handshake = Handshake::new(Duration::default(), Version::LATEST_SERVER);
server_handshake.imprint_digest(EncryptionAlgorithm::NotEncrypted, Handshake::SERVER_KEY);
let mut key: Vec<u8> = Vec::new();
key.extend_from_slice(Handshake::CLIENT_KEY);
key.extend_from_slice(Handshake::COMMON_KEY);
server_handshake.imprint_signature(EncryptionAlgorithm::NotEncrypted, key.as_slice());
Sourcepub fn did_signature_match(
&self,
encryption_algorithm: EncryptionAlgorithm,
key: &[u8],
) -> bool
pub fn did_signature_match( &self, encryption_algorithm: EncryptionAlgorithm, key: &[u8], ) -> bool
Checks whether imprinted signature matches one computed by given key.
§Examples
use std::time::Duration;
use sheave_core::handshake::{
Handshake,
Version,
EncryptionAlgorithm
};
// In a case of checking client-side response.
let mut client_handshake = Handshake::new(Duration::default(), Version::LATEST_CLIENT);
client_handshake.imprint_digest(EncryptionAlgorithm::NotEncrypted, Handshake::CLIENT_KEY);
let mut key: Vec<u8> = Vec::new();
key.extend_from_slice(Handshake::SERVER_KEY);
key.extend_from_slice(Handshake::COMMON_KEY);
client_handshake.imprint_signature(EncryptionAlgorithm::NotEncrypted, key.as_slice());
assert!(client_handshake.did_signature_match(EncryptionAlgorithm::NotEncrypted, key.as_slice()));
// In a case of checking server-side response.
let mut server_handshake = Handshake::new(Duration::default(), Version::LATEST_SERVER);
server_handshake.imprint_digest(EncryptionAlgorithm::NotEncrypted, Handshake::SERVER_KEY);
let mut key: Vec<u8> = Vec::new();
key.extend_from_slice(Handshake::CLIENT_KEY);
key.extend_from_slice(Handshake::COMMON_KEY);
server_handshake.imprint_signature(EncryptionAlgorithm::NotEncrypted, key.as_slice());
assert!(server_handshake.did_signature_match(EncryptionAlgorithm::NotEncrypted, key.as_slice()));