📄 dvbcsa_bs_block.c
字号:
/* This file is part of libdvbcsa. libdvbcsa is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. libdvbcsa is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with libdvbcsa; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Based on FFdecsa, Copyright (C) 2003-2004 fatih89r (c) 2006-2008 Alexandre Becoulet <alexandre.becoulet@free.fr>*/#include "dvbcsa/dvbcsa.h"#include "dvbcsa_bs.h"DVBCSA_INLINE static inline voiddvbcsa_bs_block_sbox(dvbcsa_bs_word_t *w){ // table lookup, works one byte at a time uint8_t *si = (uint8_t *)w; int i; for (i = 0; i < BS_BATCH_BYTES; i++) si[i] = dvbcsa_block_sbox[si[i]];}DVBCSA_INLINE static inline voiddvbcsa_bs_block_decrypt_register (const dvbcsa_bs_word_t *kkmulti, dvbcsa_bs_word_t *r){ int i, g; r += 8 * 56; // loop over kk[55]..kk[0] for (i = 55; i >= 0; i--) { dvbcsa_bs_word_t *r6_N = r + 8 * 6; r -= 8; /* virtual shift of registers */ for (g = 0; g < 8; g++) { dvbcsa_bs_word_t sbox_out = BS_XOR(kkmulti[i], r6_N[g]); dvbcsa_bs_block_sbox(&sbox_out); // bit permutation dvbcsa_bs_word_t in = BS_OR( BS_OR( BS_OR (BS_SHL (BS_AND (sbox_out, BS_VAL8(29)), 1), BS_SHL (BS_AND (sbox_out, BS_VAL8(02)), 6)), BS_OR (BS_SHL (BS_AND (sbox_out, BS_VAL8(04)), 3), BS_SHR (BS_AND (sbox_out, BS_VAL8(10)), 2))), BS_OR( BS_SHR (BS_AND (sbox_out, BS_VAL8(40)), 6), BS_SHR (BS_AND (sbox_out, BS_VAL8(80)), 4))); dvbcsa_bs_word_t w = BS_XOR(r[8 * 8 + g], sbox_out); r[8 * 0 + g] = w; BS_XOREQ(r[8 * 2 + g], w); BS_XOREQ(r[8 * 3 + g], w); BS_XOREQ(r[8 * 4 + g], w); BS_XOREQ(r[8 * 6 + g], in); } }}DVBCSA_INLINE static inline voiddvbcsa_bs_block_decrypt_block(const struct dvbcsa_bs_key_s *key, const struct dvbcsa_bs_batch_s *pcks, unsigned int offset){ dvbcsa_bs_word_t r[8 * (8 + 56)]; dvbcsa_bs_block_transpose_in(r + 8 * 56, pcks, offset); dvbcsa_bs_block_decrypt_register(key->kkmulti, r); dvbcsa_bs_block_transpose_out(r, pcks, offset);}void dvbcsa_bs_block_decrypt_batch(const struct dvbcsa_bs_key_s *key, const struct dvbcsa_bs_batch_s *pcks, unsigned int maxlen){ unsigned int i; /* decrypt first block */ dvbcsa_bs_block_decrypt_block(key, pcks, 0); for (i = 8; i < maxlen; i += 8) { unsigned int g; /* chained cipher XOR */ for (g = 0; pcks[g].data; g++) if (i < (pcks[g].len & (unsigned)~0x7)) dvbcsa_xor_64(pcks[g].data + i - 8, pcks[g].data + i); /* decrypt other blocks */ dvbcsa_bs_block_decrypt_block(key, pcks, i); }}DVBCSA_INLINE static inline voiddvbcsa_bs_block_encrypt_register (const dvbcsa_bs_word_t *kkmulti, dvbcsa_bs_word_t *r){ int i, g; // loop over kk[55]..kk[0] for (i = 0; i < 56; i++) { dvbcsa_bs_word_t *r7_N = r + 8 * 7; r += 8; /* virtual shift of registers */ for (g = 0; g < 8; g++) { dvbcsa_bs_word_t sbox_out = BS_XOR(kkmulti[i], r7_N[g]); dvbcsa_bs_block_sbox(&sbox_out); // bit permutation dvbcsa_bs_word_t in = BS_OR( BS_OR( BS_OR (BS_SHL (BS_AND (sbox_out, BS_VAL8(29)), 1), BS_SHL (BS_AND (sbox_out, BS_VAL8(02)), 6)), BS_OR (BS_SHL (BS_AND (sbox_out, BS_VAL8(04)), 3), BS_SHR (BS_AND (sbox_out, BS_VAL8(10)), 2))), BS_OR( BS_SHR (BS_AND (sbox_out, BS_VAL8(40)), 6), BS_SHR (BS_AND (sbox_out, BS_VAL8(80)), 4))); dvbcsa_bs_word_t w = r[-8 * 1 + g]; r[8 * 7 + g] = BS_XOR(w, sbox_out); BS_XOREQ(r[8 * 1 + g], w); BS_XOREQ(r[8 * 2 + g], w); BS_XOREQ(r[8 * 3 + g], w); BS_XOREQ(r[8 * 5 + g], in); } }}DVBCSA_INLINE static inline voiddvbcsa_bs_block_encrypt_block(const struct dvbcsa_bs_key_s *key, const struct dvbcsa_bs_batch_s *pcks, unsigned int offset){ dvbcsa_bs_word_t r[8 * (8 + 56)]; dvbcsa_bs_block_transpose_in(r, pcks, offset); dvbcsa_bs_block_encrypt_register(key->kkmulti, r); dvbcsa_bs_block_transpose_out(r + 8 * 56, pcks, offset);}void dvbcsa_bs_block_encrypt_batch(const struct dvbcsa_bs_key_s *key, const struct dvbcsa_bs_batch_s *pcks, unsigned int maxlen){ int i; dvbcsa_bs_block_encrypt_block(key, pcks, maxlen - 8); for (i = maxlen - 16; i >= 0; i -= 8) { unsigned int g; /* chained cipher XOR */ for (g = 0; pcks[g].data; g++) if (i + 8 < (pcks[g].len & (unsigned)~0x7)) dvbcsa_xor_64(pcks[g].data + i, pcks[g].data + i + 8); /* encrypt other blocks */ dvbcsa_bs_block_encrypt_block(key, pcks, i); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -