Separate channel_id and sequence in bink1998
This commit is contained in:
parent
49ce9a47f3
commit
c380be1eae
1 changed files with 21 additions and 8 deletions
|
@ -26,7 +26,8 @@ const EVERYTHING_ELSE: u8 = HASH_LENGTH_BITS + SERIAL_LENGTH_BITS + UPGRADE_LENG
|
|||
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
||||
pub struct ProductKey {
|
||||
upgrade: bool,
|
||||
serial: u32,
|
||||
channel_id: u32,
|
||||
sequence: u32,
|
||||
hash: u32,
|
||||
signature: u64,
|
||||
}
|
||||
|
@ -59,7 +60,8 @@ impl ProductKey {
|
|||
&curve.gen_point,
|
||||
&private_key.gen_order,
|
||||
&private_key.private_key,
|
||||
channel_id * 1_000_000 + sequence,
|
||||
channel_id,
|
||||
sequence,
|
||||
upgrade,
|
||||
)?;
|
||||
|
||||
|
@ -85,7 +87,8 @@ impl ProductKey {
|
|||
base_point: &EcPoint,
|
||||
gen_order: &BigNum,
|
||||
private_key: &BigNum,
|
||||
serial: u32,
|
||||
channel_id: u32,
|
||||
sequence: u32,
|
||||
upgrade: bool,
|
||||
) -> Result<Self> {
|
||||
let mut num_context = BigNumContext::new().unwrap();
|
||||
|
@ -97,6 +100,7 @@ impl ProductKey {
|
|||
|
||||
let mut ek: BigNum;
|
||||
|
||||
let serial = channel_id * 1_000_000 + sequence;
|
||||
let data = serial << 1 | upgrade as u32;
|
||||
|
||||
let product_key = loop {
|
||||
|
@ -139,7 +143,8 @@ impl ProductKey {
|
|||
if signature <= bitmask(55) {
|
||||
break Self {
|
||||
upgrade,
|
||||
serial,
|
||||
channel_id,
|
||||
sequence,
|
||||
hash,
|
||||
signature,
|
||||
};
|
||||
|
@ -182,7 +187,8 @@ impl ProductKey {
|
|||
let mut y_bin = y.to_vec_padded(FIELD_BYTES as i32)?;
|
||||
y_bin.reverse();
|
||||
|
||||
let data = self.serial << 1 | self.upgrade as u32;
|
||||
let serial = self.channel_id * 1_000_000 + self.sequence;
|
||||
let data = serial << 1 | self.upgrade as u32;
|
||||
|
||||
msg_buffer[0..4].copy_from_slice(&data.to_le_bytes());
|
||||
msg_buffer[4..4 + FIELD_BYTES].copy_from_slice(&x_bin);
|
||||
|
@ -206,9 +212,13 @@ impl ProductKey {
|
|||
let serial = reader.read_u32(SERIAL_LENGTH_BITS)?;
|
||||
let upgrade = reader.read_bool()?;
|
||||
|
||||
let sequence = serial % 1_000_000;
|
||||
let channel_id = serial / 1_000_000;
|
||||
|
||||
Ok(Self {
|
||||
upgrade,
|
||||
serial,
|
||||
channel_id,
|
||||
sequence,
|
||||
hash,
|
||||
signature,
|
||||
})
|
||||
|
@ -217,9 +227,11 @@ impl ProductKey {
|
|||
fn pack(&self) -> Vec<u8> {
|
||||
let mut packed_key: u128 = 0;
|
||||
|
||||
let serial = self.channel_id * 1_000_000 + self.sequence;
|
||||
|
||||
packed_key |= (self.signature as u128) << EVERYTHING_ELSE;
|
||||
packed_key |= (self.hash as u128) << (SERIAL_LENGTH_BITS + UPGRADE_LENGTH_BITS);
|
||||
packed_key |= (self.serial as u128) << UPGRADE_LENGTH_BITS;
|
||||
packed_key |= (serial as u128) << UPGRADE_LENGTH_BITS;
|
||||
packed_key |= self.upgrade as u128;
|
||||
|
||||
packed_key
|
||||
|
@ -287,7 +299,8 @@ mod tests {
|
|||
fn pack_test() {
|
||||
let key = super::ProductKey {
|
||||
upgrade: false,
|
||||
serial: 640010550,
|
||||
channel_id: 640,
|
||||
sequence: 10550,
|
||||
hash: 39185432,
|
||||
signature: 6939952665262054,
|
||||
};
|
||||
|
|
Loading…
Add table
Reference in a new issue