From 0e67a05edcc3ba01221a6bfd14750b5b8090887f Mon Sep 17 00:00:00 2001 From: jakob Date: Wed, 1 Mar 2017 19:03:20 -0500 Subject: First working commit of the rewrite. --- src/crypto.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 src/crypto.c (limited to 'src/crypto.c') diff --git a/src/crypto.c b/src/crypto.c new file mode 100644 index 0000000..1189882 --- /dev/null +++ b/src/crypto.c @@ -0,0 +1,73 @@ +/* crypto.c -- Code for deriving encryption keys. + + Copyright (C) 2017 Jakob Tsar-Fox, All Rights Reserved. + + This file is part of Nekopack. + + Nekopack 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 3 of the License, or (at + your option) any later version. + + Nekopack 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 Nekopack. If not, see . */ + +#include +#include + +#include "crypto.h" + + +/* Returns the game_key structure for a given game identifier, as + defined in crypto.h */ +struct game_key get_key(int game) { + struct game_key k = {0}; + switch (game) { + case NEKOPARA_VOLUME_0: + k.master = 0x1548e29c; + k.fallback_initial = 0x9c; + k.fallback_primary = 0xd7; + k.uses_initial = true; + break; + case NEKOPARA_VOLUME_0_STEAM: + k.master = 0x44528b87; + k.fallback_initial = 0x87; + k.fallback_primary = 0x23; + k.uses_initial = true; + break; + case NEKOPARA_VOLUME_1: + k.master = 0x1548e29c; + k.fallback_initial = 0x00; + k.fallback_primary = 0xd7; + k.uses_initial = false; + break; + case NEKOPARA_VOLUME_1_STEAM: + k.master = 0x44528b87; + k.fallback_initial = 0x00; + k.fallback_primary = 0x23; + k.uses_initial = false; + break; + } + return k; +} + + +/* Generates an initial key for the given key structure and file key. */ +uint8_t derive_initial(struct game_key k, uint64_t file_key) { + if (!k.uses_initial) return 0x00; + uint8_t initial = (k.master ^ file_key) & 0xff; + return initial == 0 ? k.fallback_initial : initial; +} + + +/* Generates a primary key for the given key structure and file key. */ +uint8_t derive_primary(struct game_key k, uint64_t file_key) { + uint32_t tmp = k.master ^ file_key; + uint8_t primary = (tmp >> 24 ^ tmp >> 16 ^ tmp >> 8 ^ tmp) & 0xff; + return primary == 0 ? k.fallback_primary : primary; +} -- cgit v1.3