#!/usr/bin/env python
# -*- coding: utf-8 -*-

# ############################################################################
##                                                                         ##
## This file is part of DPAPIck                                            ##
## Windows DPAPI decryption & forensic toolkit                             ##
##                                                                         ##
##                                                                         ##
## Copyright (C) 2010, 2011 Cassidian SAS. All rights reserved.            ##
## This document is the property of Cassidian SAS, it may not be copied or ##
## circulated without prior licence                                        ##
##                                                                         ##
##  Author: Jean-Michel Picod <jmichel.p@gmail.com>                        ##
##                                                                         ##
## This program is distributed under GPLv3 licence (see LICENCE.txt)       ##
##                                                                         ##
#############################################################################
##                                                                         ##
## iCloud Apple token decryption                                           ##
##                                                                         ##
##  Author: Francesco Picasso <francesco.picasso@gmail.com>                ##
##                                                                         ##
#############################################################################

from DPAPI.Core import masterkey
from DPAPI.Probes import icloud
from optparse import OptionParser

import sys


if __name__ == "__main__":
    parser = OptionParser()
    parser.add_option("--sid", metavar="SID", dest="sid")
    parser.add_option("--masterkey", metavar="DIRECTORY", dest="masterkeydir")
    parser.add_option("--credhist", metavar="FILE", dest="credhist")
    parser.add_option("--password", metavar="PASSWORD", dest="password")
    parser.add_option("--hash", metavar="HASH", dest="h")
    parser.add_option("--aoskit", metavar="AOSKIT", dest="aoskit")
    parser.add_option("--fout", metavar="FOUT", dest="fout")

    (options, args) = parser.parse_args()

    if not options.aoskit:
        print >> sys.stderr, "Please provide the com.apple.AOSKit.plist file"
        sys.exit(1)
    if not options.fout:
        print >> sys.stderr, "Please provide the filename (no ext) for the output"
        sys.exit(1)
    if options.password and options.h:
        print >> sys.stderr, "Choose either password or hash option"
        sys.exit(1)

    mkp = masterkey.MasterKeyPool()
    if options.masterkeydir:
        mkp.loadDirectory(options.masterkeydir)
    if options.credhist and options.sid:
        mkp.addCredhistFile(options.sid, options.credhist)

    # TODO: add exception/error management.
    datablob = icloud.iCloud()

    if options.h:
        datablob.try_decrypt_with_hash(options.h, mkp, options.sid, aoskit=options.aoskit)
    if options.password:
        datablob.try_decrypt_with_password(options.password, mkp, options.sid, aoskit=options.aoskit)
    print datablob
    if datablob.decrypted:
        fout_name = options.fout + '.plist'
        with open(fout_name, 'wb') as fo:
            fo.write(datablob.decrypted)
        print 'Decrypted plist written in file \"{}\"'.format(fout_name)

# vim:ts=4:expandtab:sw=4
