1 /*
    2  * << Haru Free PDF Library >> -- hpdf_encrypt.h
    3  *
    4  * URL: http://libharu.org
    5  *
    6  * Copyright (c) 1999-2006 Takeshi Kanno <takeshi_kanno@est.hi-ho.ne.jp>
    7  * Copyright (c) 2007-2009 Antony Dovgal <tony@daylessday.org>
    8  *
    9  * Permission to use, copy, modify, distribute and sell this software
   10  * and its documentation for any purpose is hereby granted without fee,
   11  * provided that the above copyright notice appear in all copies and
   12  * that both that copyright notice and this permission notice appear
   13  * in supporting documentation.
   14  * It is provided "as is" without express or implied warranty.
   15  *
   16  *------------------------------------------------------------------------------
   17  *
   18  * The code implements MD5 message-digest algorithm is based on the code
   19  * written by Colin Plumb.
   20  * The copyright of it is as follows.
   21  *
   22  * This code implements the MD5 message-digest algorithm.
   23  * The algorithm is due to Ron Rivest.  This code was
   24  * written by Colin Plumb in 1993, no copyright is claimed.
   25  * This code is in the public domain; do with it what you wish.
   26  *
   27  * Equivalent code is available from RSA Data Security, Inc.
   28  * This code has been tested against that, and is equivalent,
   29  * except that you don't need to include two pages of legalese
   30  * with every copy.
   31  *
   32  * To compute the message digest of a chunk of bytes, declare an
   33  * MD5Context structure, pass it to MD5Init, call MD5Update as
   34  * needed on buffers full of bytes, and then call MD5Final, which
   35  * will fill a supplied 16-byte array with the digest.
   36  *
   37  *---------------------------------------------------------------------------*/
   38 
   39 #ifndef HPDF_ENCRYPT_H
   40 #define HPDF_ENCRYPT_H
   41 
   42 #include "hpdf_mmgr.h"
   43 
   44 #ifdef __cplusplus
   45 extern "C" {
   46 #endif
   47 
   48 /*----------------------------------------------------------------------------*/
   49 /*----- encrypt-dict ---------------------------------------------------------*/
   50 
   51 #define HPDF_ID_LEN              16
   52 #define HPDF_PASSWD_LEN          32
   53 #define HPDF_ENCRYPT_KEY_MAX     16
   54 #define HPDF_MD5_KEY_LEN         16
   55 #define HPDF_PERMISSION_PAD      0xFFFFFFC0
   56 #define HPDF_ARC4_BUF_SIZE       256
   57 
   58 
   59 typedef struct HPDF_MD5Context
   60 {
   61     HPDF_UINT32 buf[4];
   62     HPDF_UINT32 bits[2];
   63     HPDF_BYTE in[64];
   64 } HPDF_MD5_CTX;
   65 
   66 
   67 typedef struct _HPDF_ARC4_Ctx_Rec {
   68     HPDF_BYTE    idx1;
   69     HPDF_BYTE    idx2;
   70     HPDF_BYTE    state[HPDF_ARC4_BUF_SIZE];
   71 } HPDF_ARC4_Ctx_Rec;
   72 
   73 
   74 typedef struct _HPDF_Encrypt_Rec  *HPDF_Encrypt;
   75 
   76 typedef struct _HPDF_Encrypt_Rec {
   77     HPDF_EncryptMode   mode;
   78 
   79     /* key_len must be a multiple of 8, and between 40 to 128 */
   80     HPDF_UINT          key_len;
   81 
   82     /* owner-password (not encrypted) */
   83     HPDF_BYTE          owner_passwd[HPDF_PASSWD_LEN];
   84 
   85     /* user-password (not encrypted) */
   86     HPDF_BYTE          user_passwd[HPDF_PASSWD_LEN];
   87 
   88     /* owner-password (encrypted) */
   89     HPDF_BYTE          owner_key[HPDF_PASSWD_LEN];
   90 
   91     /* user-password (encrypted) */
   92     HPDF_BYTE          user_key[HPDF_PASSWD_LEN];
   93 
   94     HPDF_INT           permission;
   95     HPDF_BYTE          encrypt_id[HPDF_ID_LEN];
   96     HPDF_BYTE          encryption_key[HPDF_MD5_KEY_LEN + 5];
   97     HPDF_BYTE          md5_encryption_key[HPDF_MD5_KEY_LEN];
   98     HPDF_ARC4_Ctx_Rec  arc4ctx;
   99 } HPDF_Encrypt_Rec;
  100 
  101 
  102 void
  103 HPDF_MD5Init  (struct HPDF_MD5Context  *ctx);
  104 
  105 
  106 void
  107 HPDF_MD5Update  (struct HPDF_MD5Context *ctx,
  108                  const HPDF_BYTE        *buf,
  109                  HPDF_UINT32            len);
  110 
  111 
  112 void
  113 HPDF_MD5Final  (HPDF_BYTE              digest[16],
  114                 struct HPDF_MD5Context *ctx);
  115 
  116 void
  117 HPDF_PadOrTrancatePasswd  (const char  *pwd,
  118                            HPDF_BYTE        *new_pwd);
  119 
  120 
  121 void
  122 HPDF_Encrypt_Init  (HPDF_Encrypt  attr);
  123 
  124 
  125 void
  126 HPDF_Encrypt_CreateUserKey  (HPDF_Encrypt  attr);
  127 
  128 
  129 void
  130 HPDF_Encrypt_CreateOwnerKey  (HPDF_Encrypt  attr);
  131 
  132 
  133 void
  134 HPDF_Encrypt_CreateEncryptionKey  (HPDF_Encrypt  attr);
  135 
  136 
  137 void
  138 HPDF_Encrypt_InitKey  (HPDF_Encrypt  attr,
  139                        HPDF_UINT32       object_id,
  140                        HPDF_UINT16       gen_no);
  141 
  142 
  143 void
  144 HPDF_Encrypt_Reset  (HPDF_Encrypt  attr);
  145 
  146 
  147 void
  148 HPDF_Encrypt_CryptBuf  (HPDF_Encrypt  attr,
  149                         const HPDF_BYTE   *src,
  150                         HPDF_BYTE         *dst,
  151                         HPDF_UINT         len);
  152 
  153 #ifdef __cplusplus
  154 }
  155 #endif /* __cplusplus */
  156 
  157 #endif /* _HPDF_ENCRYPT_H */
  158 
  159