libreoffice/include/oox/core/binarycodec.hxx
Noel Grandin ff339c89b5 loplugin:constantparam part2
Change-Id: I7ec4c946be52a6b56aee908426f95ecacc7b0746
Reviewed-on: https://gerrit.libreoffice.org/36072
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
2017-04-05 06:42:40 +00:00

249 lines
8.0 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#ifndef INCLUDED_OOX_CORE_BINARYCODEC_HXX
#define INCLUDED_OOX_CORE_BINARYCODEC_HXX
#include <com/sun/star/uno/Sequence.hxx>
#include <oox/dllapi.h>
#include <rtl/cipher.h>
#include <rtl/digest.h>
#include <sal/types.h>
namespace com { namespace sun { namespace star {
namespace beans { struct NamedValue; }
} } }
namespace oox { class AttributeList; }
namespace oox {
namespace core {
namespace CodecHelper
{
/** Returns the password hash if it is in the required 16-bit limit. */
OOX_DLLPUBLIC sal_uInt16 getPasswordHash( const AttributeList& rAttribs, sal_Int32 nElement );
}
/** Encodes and decodes data from/to protected MS Office documents.
Implements a simple XOR encoding/decoding algorithm used in MS Excel Office
versions up to MSO 95.
*/
class OOX_DLLPUBLIC BinaryCodec_XOR
{
public:
/** Default constructor.
Two-step construction in conjunction with the initKey() and verifyKey()
functions allows to try to initialize with different passwords (e.g.
built-in default password used for Excel workbook protection).
*/
explicit BinaryCodec_XOR();
~BinaryCodec_XOR();
/** Initializes the algorithm with the specified password.
@param pnPassData
Character array containing the password. Must be zero terminated,
which results in a maximum length of 15 characters.
*/
void initKey( const sal_uInt8 pnPassData[ 16 ] );
/** Initializes the algorithm with the encryption data.
@param aData
The sequence contains the necessary data to initialize
the codec.
*/
bool initCodec( const css::uno::Sequence< css::beans::NamedValue >& aData );
/** Retrieves the encryption data
@return
The sequence contains the necessary data to initialize
the codec.
*/
css::uno::Sequence< css::beans::NamedValue > getEncryptionData();
/** Verifies the validity of the password using the passed key and hash.
@precond
The codec must be initialized with the initKey() function before
this function can be used.
@param nKey
Password key value read from the file.
@param nHash
Password hash value read from the file.
@return
True = test was successful.
*/
bool verifyKey( sal_uInt16 nKey, sal_uInt16 nHash ) const;
/** Lets the cipher skip a specific amount of bytes.
This function sets the cipher to the same state as if the specified
amount of data has been decoded with one or more calls of decode().
@precond
The codec must be initialized with the initKey() function before
this function can be used.
@param nBytes
Number of bytes to be skipped (cipher "seeks" forward).
@return
True = skip was successful (no error occurred).
*/
bool skip( sal_Int32 nBytes );
private:
sal_uInt8 mpnKey[ 16 ]; ///< Encryption key.
sal_Int32 mnOffset; ///< Key offset.
sal_uInt16 mnBaseKey; ///< Base key from password.
sal_uInt16 mnHash; ///< Hash value from password.
};
/** Encodes and decodes data from protected MSO 97+ documents.
This is a wrapper class around low level cryptographic functions from RTL.
Implementation is based on the wvDecrypt package by Caolan McNamara:
http://www.csn.ul.ie/~caolan/docs/wvDecrypt.html
*/
class OOX_DLLPUBLIC BinaryCodec_RCF
{
public:
/** Default constructor.
Two-step construction in conjunction with the initKey() and verifyKey()
functions allows to try to initialize with different passwords (e.g.
built-in default password used for Excel workbook protection).
*/
explicit BinaryCodec_RCF();
~BinaryCodec_RCF();
/** Initializes the algorithm with the encryption data.
@param aData
The sequence contains the necessary data to initialize
the codec.
*/
bool initCodec( const css::uno::Sequence< css::beans::NamedValue >& aData );
/** Retrieves the encryption data
@return
The sequence contains the necessary data to initialize
the codec.
*/
css::uno::Sequence< css::beans::NamedValue > getEncryptionData();
/** Initializes the algorithm with the specified password and document ID.
@param pnPassData
Unicode character array containing the password. Must be zero
terminated, which results in a maximum length of 15 characters.
@param pnSalt
Random salt data block read from or written to the file.
*/
void initKey(
const sal_uInt16 pnPassData[ 16 ],
const sal_uInt8 pnSalt[ 16 ] );
/** Verifies the validity of the password using the passed salt data.
@precond
The codec must be initialized with the initKey() function before
this function can be used.
@param pnVerifier
Verifier block read from the file.
@param pnVerifierHash
Verifier hash read from the file.
@return
True = test was successful.
*/
bool verifyKey(
const sal_uInt8 pnVerifier[ 16 ],
const sal_uInt8 pnVerifierHash[ 16 ] );
/** Rekeys the codec using the specified counter.
After reading a specific amount of data the cipher algorithm needs to
be rekeyed using a counter that counts the data blocks.
The block size is for example 512 bytes for MS Word files and 1024
bytes for MS Excel files.
@precond
The codec must be initialized with the initKey() function before
this function can be used.
@param nCounter
Block counter used to rekey the cipher.
*/
bool startBlock( sal_Int32 nCounter );
/** Decodes a block of memory.
@see rtl_cipher_decode()
@precond
The codec must be initialized with the initKey() function before
this function can be used.
@param pnDestData
Destination buffer. Will contain the decrypted data afterwards.
@param pnSrcData
Encrypted data block.
@param nBytes
Size of the passed data blocks. pnDestData and pnSrcData must be of
this size.
@return
True = decoding was successful (no error occurred).
*/
bool decode(
sal_uInt8* pnDestData,
const sal_uInt8* pnSrcData,
sal_Int32 nBytes );
private:
rtlCipher mhCipher;
rtlDigest mhDigest;
sal_uInt8 mpnDigestValue[ RTL_DIGEST_LENGTH_MD5 ];
sal_uInt8 mpnUnique[16];
};
} // namespace core
} // namespace oox
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */