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