2020-08-27 21:45:09 +00:00
|
|
|
//
|
|
|
|
// Copyright 2020 FoxyUtils ehf. All rights reserved.
|
|
|
|
//
|
|
|
|
// This is a commercial product and requires a license to operate.
|
|
|
|
// A trial license can be obtained at https://unidoc.io
|
|
|
|
//
|
|
|
|
// DO NOT EDIT: generated by unitwist Go source code obfuscator.
|
|
|
|
//
|
|
|
|
// Use of this source code is governed by the UniDoc End User License Agreement
|
|
|
|
// terms that can be accessed at https://unidoc.io/eula/
|
|
|
|
|
2021-04-17 13:46:54 +00:00
|
|
|
package crypt ;import (_d "crypto/aes";_dc "crypto/cipher";_g "crypto/md5";_b "crypto/rand";_fd "crypto/rc4";_f "fmt";_e "github.com/unidoc/unipdf/v3/common";_cd "github.com/unidoc/unipdf/v3/core/security";_a "io";);func init (){_bed ("\u0041\u0045\u0053V\u0032",_ad )};
|
|
|
|
func (filterIdentity )PDFVersion ()[2]int {return [2]int {}};
|
2020-12-06 13:03:03 +00:00
|
|
|
|
2021-04-17 13:46:54 +00:00
|
|
|
// PDFVersion implements Filter interface.
|
|
|
|
func (filterAESV2 )PDFVersion ()[2]int {return [2]int {1,5}};func _ad (_ebd FilterDict )(Filter ,error ){if _ebd .Length ==128{_e .Log .Debug ("\u0041\u0045S\u0056\u0032\u0020c\u0072\u0079\u0070\u0074\u0020f\u0069\u006c\u0074\u0065\u0072 l\u0065\u006e\u0067\u0074\u0068\u0020\u0061\u0070\u0070\u0065\u0061\u0072\u0073\u0020\u0074\u006f\u0020\u0062e\u0020i\u006e\u0020\u0062\u0069\u0074\u0073 ra\u0074\u0068\u0065\u0072\u0020\u0074\u0068\u0061\u006e\u0020\u0062\u0079te\u0073 \u002d\u0020\u0061\u0073s\u0075m\u0069n\u0067\u0020b\u0069\u0074s \u0028\u0025\u0064\u0029",_ebd .Length );
|
|
|
|
_ebd .Length /=8;};if _ebd .Length !=0&&_ebd .Length !=16{return nil ,_f .Errorf ("\u0069\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u0041\u0045\u0053\u0056\u0032\u0020\u0063\u0072\u0079\u0070\u0074\u0020\u0066\u0069\u006c\u0074e\u0072\u0020\u006c\u0065\u006eg\u0074\u0068 \u0028\u0025\u0064\u0029",_ebd .Length );
|
|
|
|
};return filterAESV2 {},nil ;};
|
2021-04-06 22:35:37 +00:00
|
|
|
|
|
|
|
// MakeKey implements Filter interface.
|
2021-04-17 13:46:54 +00:00
|
|
|
func (filterAESV2 )MakeKey (objNum ,genNum uint32 ,ekey []byte )([]byte ,error ){return _ebba (objNum ,genNum ,ekey ,true );};func (filterIdentity )MakeKey (objNum ,genNum uint32 ,fkey []byte )([]byte ,error ){return fkey ,nil };
|
2021-02-11 10:35:13 +00:00
|
|
|
|
2021-04-06 22:35:37 +00:00
|
|
|
// KeyLength implements Filter interface.
|
2021-04-17 13:46:54 +00:00
|
|
|
func (filterAESV3 )KeyLength ()int {return 256/8};type filterV2 struct{_df int };
|
|
|
|
|
|
|
|
// NewIdentity creates an identity filter that bypasses all data without changes.
|
|
|
|
func NewIdentity ()Filter {return filterIdentity {}};func _ebba (_bdb ,_dcc uint32 ,_ea []byte ,_aga bool )([]byte ,error ){_bc :=make ([]byte ,len (_ea )+5);for _de :=0;_de < len (_ea );_de ++{_bc [_de ]=_ea [_de ];};for _fed :=0;_fed < 3;_fed ++{_cg :=byte ((_bdb >>uint32 (8*_fed ))&0xff);
|
|
|
|
_bc [_fed +len (_ea )]=_cg ;};for _fc :=0;_fc < 2;_fc ++{_ddb :=byte ((_dcc >>uint32 (8*_fc ))&0xff);_bc [_fc +len (_ea )+3]=_ddb ;};if _aga {_bc =append (_bc ,0x73);_bc =append (_bc ,0x41);_bc =append (_bc ,0x6C);_bc =append (_bc ,0x54);};_acb :=_g .New ();
|
|
|
|
_acb .Write (_bc );_bca :=_acb .Sum (nil );if len (_ea )+5< 16{return _bca [0:len (_ea )+5],nil ;};return _bca ,nil ;};func init (){_bed ("\u0041\u0045\u0053V\u0033",_adc )};type filterAESV2 struct{filterAES };
|
2020-12-06 13:03:03 +00:00
|
|
|
|
2021-04-06 22:35:37 +00:00
|
|
|
// DecryptBytes implements Filter interface.
|
2021-04-17 13:46:54 +00:00
|
|
|
func (filterV2 )DecryptBytes (buf []byte ,okey []byte )([]byte ,error ){_ffb ,_egf :=_fd .NewCipher (okey );if _egf !=nil {return nil ,_egf ;};_e .Log .Trace ("\u0052\u00434\u0020\u0044\u0065c\u0072\u0079\u0070\u0074\u003a\u0020\u0025\u0020\u0078",buf );
|
|
|
|
_ffb .XORKeyStream (buf ,buf );_e .Log .Trace ("\u0074o\u003a\u0020\u0025\u0020\u0078",buf );return buf ,nil ;};func _bed (_ddf string ,_gg filterFunc ){if _ ,_bga :=_be [_ddf ];_bga {panic ("\u0061l\u0072e\u0061\u0064\u0079\u0020\u0072e\u0067\u0069s\u0074\u0065\u0072\u0065\u0064");
|
|
|
|
};_be [_ddf ]=_gg ;};
|
2020-12-06 13:03:03 +00:00
|
|
|
|
2021-04-17 13:46:54 +00:00
|
|
|
// MakeKey implements Filter interface.
|
|
|
|
func (filterAESV3 )MakeKey (_ ,_ uint32 ,ekey []byte )([]byte ,error ){return ekey ,nil };type filterAES struct{};func _adc (_aa FilterDict )(Filter ,error ){if _aa .Length ==256{_e .Log .Debug ("\u0041\u0045S\u0056\u0033\u0020c\u0072\u0079\u0070\u0074\u0020f\u0069\u006c\u0074\u0065\u0072 l\u0065\u006e\u0067\u0074\u0068\u0020\u0061\u0070\u0070\u0065\u0061\u0072\u0073\u0020\u0074\u006f\u0020\u0062e\u0020i\u006e\u0020\u0062\u0069\u0074\u0073 ra\u0074\u0068\u0065\u0072\u0020\u0074\u0068\u0061\u006e\u0020\u0062\u0079te\u0073 \u002d\u0020\u0061\u0073s\u0075m\u0069n\u0067\u0020b\u0069\u0074s \u0028\u0025\u0064\u0029",_aa .Length );
|
|
|
|
_aa .Length /=8;};if _aa .Length !=0&&_aa .Length !=32{return nil ,_f .Errorf ("\u0069\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u0041\u0045\u0053\u0056\u0033\u0020\u0063\u0072\u0079\u0070\u0074\u0020\u0066\u0069\u006c\u0074e\u0072\u0020\u006c\u0065\u006eg\u0074\u0068 \u0028\u0025\u0064\u0029",_aa .Length );
|
|
|
|
};return filterAESV3 {},nil ;};var _ Filter =filterV2 {};
|
2020-12-06 13:03:03 +00:00
|
|
|
|
2021-04-06 22:35:37 +00:00
|
|
|
// HandlerVersion implements Filter interface.
|
2021-04-17 13:46:54 +00:00
|
|
|
func (_bf filterV2 )HandlerVersion ()(V ,R int ){V ,R =2,3;return ;};var _ Filter =filterAESV3 {};func _fdc (_caa FilterDict )(Filter ,error ){if _caa .Length %8!=0{return nil ,_f .Errorf ("\u0063\u0072\u0079p\u0074\u0020\u0066\u0069\u006c\u0074\u0065\u0072\u0020\u006c\u0065\u006e\u0067\u0074\u0068\u0020\u006e\u006f\u0074\u0020\u006d\u0075\u006c\u0074\u0069\u0070\u006c\u0065\u0020o\u0066\u0020\u0038\u0020\u0028\u0025\u0064\u0029",_caa .Length );
|
|
|
|
};if _caa .Length < 5||_caa .Length > 16{if _caa .Length ==40||_caa .Length ==64||_caa .Length ==128{_e .Log .Debug ("\u0053\u0054\u0041\u004e\u0044AR\u0044\u0020V\u0049\u004f\u004c\u0041\u0054\u0049\u004f\u004e\u003a\u0020\u0043\u0072\u0079\u0070\u0074\u0020\u004c\u0065\u006e\u0067\u0074\u0068\u0020\u0061\u0070\u0070\u0065\u0061\u0072s\u0020\u0074\u006f \u0062\u0065\u0020\u0069\u006e\u0020\u0062\u0069\u0074\u0073\u0020\u0072\u0061t\u0068\u0065\u0072\u0020\u0074h\u0061\u006e\u0020\u0062\u0079\u0074\u0065\u0073\u0020-\u0020\u0061s\u0073u\u006d\u0069\u006e\u0067\u0020\u0062\u0069t\u0073\u0020\u0028\u0025\u0064\u0029",_caa .Length );
|
|
|
|
_caa .Length /=8;}else {return nil ,_f .Errorf ("\u0063\u0072\u0079\u0070\u0074\u0020\u0066\u0069\u006c\u0074\u0065\u0072\u0020\u006c\u0065\u006e\u0067\u0074h\u0020\u006e\u006f\u0074\u0020\u0069\u006e \u0072\u0061\u006e\u0067\u0065\u0020\u0034\u0030\u0020\u002d\u00201\u0032\u0038\u0020\u0062\u0069\u0074\u0020\u0028\u0025\u0064\u0029",_caa .Length );
|
|
|
|
};};return filterV2 {_df :_caa .Length },nil ;};
|
2020-12-06 13:03:03 +00:00
|
|
|
|
2020-08-27 21:45:09 +00:00
|
|
|
// Filter is a common interface for crypt filter methods.
|
|
|
|
type Filter interface{
|
|
|
|
|
|
|
|
// Name returns a name of the filter that should be used in CFM field of Encrypt dictionary.
|
|
|
|
Name ()string ;
|
|
|
|
|
|
|
|
// KeyLength returns a length of the encryption key in bytes.
|
|
|
|
KeyLength ()int ;
|
|
|
|
|
|
|
|
// PDFVersion reports the minimal version of PDF document that introduced this filter.
|
|
|
|
PDFVersion ()[2]int ;
|
|
|
|
|
|
|
|
// HandlerVersion reports V and R parameters that should be used for this filter.
|
|
|
|
HandlerVersion ()(V ,R int );
|
|
|
|
|
|
|
|
// MakeKey generates a object encryption key based on file encryption key and object numbers.
|
|
|
|
// Used only for legacy filters - AESV3 doesn't change the key for each object.
|
2021-04-17 13:46:54 +00:00
|
|
|
MakeKey (_db ,_cff uint32 ,_cc []byte )([]byte ,error );
|
2020-08-27 21:45:09 +00:00
|
|
|
|
|
|
|
// EncryptBytes encrypts a buffer using object encryption key, as returned by MakeKey.
|
|
|
|
// Implementation may reuse a buffer and encrypt data in-place.
|
2021-04-17 13:46:54 +00:00
|
|
|
EncryptBytes (_egdg []byte ,_acc []byte )([]byte ,error );
|
2020-08-27 21:45:09 +00:00
|
|
|
|
|
|
|
// DecryptBytes decrypts a buffer using object encryption key, as returned by MakeKey.
|
|
|
|
// Implementation may reuse a buffer and decrypt data in-place.
|
2021-04-17 13:46:54 +00:00
|
|
|
DecryptBytes (_fcb []byte ,_ge []byte )([]byte ,error );};func (filterIdentity )Name ()string {return "\u0049\u0064\u0065\u006e\u0074\u0069\u0074\u0079"};func init (){_bed ("\u0056\u0032",_fdc )};func (filterAES )EncryptBytes (buf []byte ,okey []byte )([]byte ,error ){_ga ,_af :=_d .NewCipher (okey );
|
|
|
|
if _af !=nil {return nil ,_af ;};_e .Log .Trace ("A\u0045\u0053\u0020\u0045nc\u0072y\u0070\u0074\u0020\u0028\u0025d\u0029\u003a\u0020\u0025\u0020\u0078",len (buf ),buf );const _ebb =_d .BlockSize ;_gc :=_ebb -len (buf )%_ebb ;for _bdf :=0;_bdf < _gc ;_bdf ++{buf =append (buf ,byte (_gc ));
|
|
|
|
};_e .Log .Trace ("\u0050a\u0064d\u0065\u0064\u0020\u0074\u006f \u0025\u0064 \u0062\u0079\u0074\u0065\u0073",len (buf ));_ff :=make ([]byte ,_ebb +len (buf ));_fa :=_ff [:_ebb ];if _ ,_dd :=_a .ReadFull (_b .Reader ,_fa );_dd !=nil {return nil ,_dd ;};
|
|
|
|
_bdd :=_dc .NewCBCEncrypter (_ga ,_fa );_bdd .CryptBlocks (_ff [_ebb :],buf );buf =_ff ;_e .Log .Trace ("\u0074\u006f\u0020(\u0025\u0064\u0029\u003a\u0020\u0025\u0020\u0078",len (buf ),buf );return buf ,nil ;};
|
2021-02-22 02:29:48 +00:00
|
|
|
|
2021-04-17 13:46:54 +00:00
|
|
|
// NewFilterAESV3 creates an AES-based filter with a 256 bit key (AESV3).
|
|
|
|
func NewFilterAESV3 ()Filter {_ca ,_bb :=_adc (FilterDict {});if _bb !=nil {_e .Log .Error ("E\u0052\u0052\u004f\u0052\u003a\u0020\u0063\u006f\u0075l\u0064\u0020\u006e\u006f\u0074\u0020\u0063re\u0061\u0074\u0065\u0020A\u0045\u0053\u0020\u0056\u0033\u0020\u0063\u0072\u0079pt\u0020\u0066i\u006c\u0074\u0065\u0072\u003a\u0020\u0025\u0076",_bb );
|
|
|
|
return filterAESV3 {};};return _ca ;};
|
2021-03-13 21:28:23 +00:00
|
|
|
|
2021-04-17 13:46:54 +00:00
|
|
|
// EncryptBytes implements Filter interface.
|
|
|
|
func (filterV2 )EncryptBytes (buf []byte ,okey []byte )([]byte ,error ){_acg ,_ab :=_fd .NewCipher (okey );if _ab !=nil {return nil ,_ab ;};_e .Log .Trace ("\u0052\u00434\u0020\u0045\u006ec\u0072\u0079\u0070\u0074\u003a\u0020\u0025\u0020\u0078",buf );_acg .XORKeyStream (buf ,buf );
|
|
|
|
_e .Log .Trace ("\u0074o\u003a\u0020\u0025\u0020\u0078",buf );return buf ,nil ;};func (filterAES )DecryptBytes (buf []byte ,okey []byte )([]byte ,error ){_gfe ,_dcf :=_d .NewCipher (okey );if _dcf !=nil {return nil ,_dcf ;};if len (buf )< 16{_e .Log .Debug ("\u0045R\u0052\u004f\u0052\u0020\u0041\u0045\u0053\u0020\u0069\u006e\u0076a\u006c\u0069\u0064\u0020\u0062\u0075\u0066\u0020\u0025\u0073",buf );
|
|
|
|
return buf ,_f .Errorf ("\u0041\u0045\u0053\u003a B\u0075\u0066\u0020\u006c\u0065\u006e\u0020\u003c\u0020\u0031\u0036\u0020\u0028\u0025d\u0029",len (buf ));};_gbg :=buf [:16];buf =buf [16:];if len (buf )%16!=0{_e .Log .Debug ("\u0020\u0069\u0076\u0020\u0028\u0025\u0064\u0029\u003a\u0020\u0025\u0020\u0078",len (_gbg ),_gbg );
|
|
|
|
_e .Log .Debug ("\u0062\u0075\u0066\u0020\u0028\u0025\u0064\u0029\u003a\u0020\u0025\u0020\u0078",len (buf ),buf );return buf ,_f .Errorf ("\u0041\u0045\u0053\u0020\u0062\u0075\u0066\u0020\u006c\u0065\u006e\u0067\u0074\u0068\u0020\u006e\u006f\u0074\u0020\u006d\u0075\u006c\u0074\u0069p\u006c\u0065\u0020\u006f\u0066 \u0031\u0036 \u0028\u0025\u0064\u0029",len (buf ));
|
|
|
|
};_ag :=_dc .NewCBCDecrypter (_gfe ,_gbg );_e .Log .Trace ("A\u0045\u0053\u0020\u0044ec\u0072y\u0070\u0074\u0020\u0028\u0025d\u0029\u003a\u0020\u0025\u0020\u0078",len (buf ),buf );_e .Log .Trace ("\u0063\u0068\u006f\u0070\u0020\u0041\u0045\u0053\u0020\u0044\u0065c\u0072\u0079\u0070\u0074\u0020\u0028\u0025\u0064\u0029\u003a \u0025\u0020\u0078",len (buf ),buf );
|
|
|
|
_ag .CryptBlocks (buf ,buf );_e .Log .Trace ("\u0074\u006f\u0020(\u0025\u0064\u0029\u003a\u0020\u0025\u0020\u0078",len (buf ),buf );if len (buf )==0{_e .Log .Trace ("\u0045\u006d\u0070\u0074\u0079\u0020b\u0075\u0066\u002c\u0020\u0072\u0065\u0074\u0075\u0072\u006e\u0069\u006e\u0067 \u0065\u006d\u0070\u0074\u0079\u0020\u0073t\u0072\u0069\u006e\u0067");
|
|
|
|
return buf ,nil ;};_eg :=int (buf [len (buf )-1]);if _eg > len (buf ){_e .Log .Debug ("\u0049\u006c\u006c\u0065g\u0061\u006c\u0020\u0070\u0061\u0064\u0020\u006c\u0065\u006eg\u0074h\u0020\u0028\u0025\u0064\u0020\u003e\u0020%\u0064\u0029",_eg ,len (buf ));
|
|
|
|
return buf ,_f .Errorf ("\u0069n\u0076a\u006c\u0069\u0064\u0020\u0070a\u0064\u0020l\u0065\u006e\u0067\u0074\u0068");};buf =buf [:len (buf )-_eg ];return buf ,nil ;};func (filterIdentity )DecryptBytes (p []byte ,okey []byte )([]byte ,error ){return p ,nil };
|
2021-02-22 02:29:48 +00:00
|
|
|
|
|
|
|
|
2021-04-17 13:46:54 +00:00
|
|
|
// KeyLength implements Filter interface.
|
|
|
|
func (_ace filterV2 )KeyLength ()int {return _ace ._df };
|
2021-02-22 02:29:48 +00:00
|
|
|
|
2021-04-06 22:35:37 +00:00
|
|
|
// HandlerVersion implements Filter interface.
|
|
|
|
func (filterAESV2 )HandlerVersion ()(V ,R int ){V ,R =4,4;return ;};
|
2021-03-23 23:12:52 +00:00
|
|
|
|
2021-04-17 13:46:54 +00:00
|
|
|
// NewFilterV2 creates a RC4-based filter with a specified key length (in bytes).
|
|
|
|
func NewFilterV2 (length int )Filter {_afa ,_egd :=_fdc (FilterDict {Length :length });if _egd !=nil {_e .Log .Error ("E\u0052\u0052\u004f\u0052\u003a\u0020\u0063\u006f\u0075l\u0064\u0020\u006e\u006f\u0074\u0020\u0063re\u0061\u0074\u0065\u0020R\u0043\u0034\u0020\u0056\u0032\u0020\u0063\u0072\u0079pt\u0020\u0066i\u006c\u0074\u0065\u0072\u003a\u0020\u0025\u0076",_egd );
|
|
|
|
return filterV2 {_df :length };};return _afa ;};
|
|
|
|
|
2021-04-06 22:35:37 +00:00
|
|
|
// KeyLength implements Filter interface.
|
2021-04-17 13:46:54 +00:00
|
|
|
func (filterAESV2 )KeyLength ()int {return 128/8};var (_be =make (map[string ]filterFunc ););var _ Filter =filterAESV2 {};
|
|
|
|
|
|
|
|
// Name implements Filter interface.
|
|
|
|
func (filterAESV2 )Name ()string {return "\u0041\u0045\u0053V\u0032"};
|
|
|
|
|
|
|
|
// NewFilter creates CryptFilter from a corresponding dictionary.
|
|
|
|
func NewFilter (d FilterDict )(Filter ,error ){_edc ,_bbd :=_ebc (d .CFM );if _bbd !=nil {return nil ,_bbd ;};_bg ,_bbd :=_edc (d );if _bbd !=nil {return nil ,_bbd ;};return _bg ,nil ;};func (filterIdentity )EncryptBytes (p []byte ,okey []byte )([]byte ,error ){return p ,nil };
|
|
|
|
|
|
|
|
|
|
|
|
// FilterDict represents information from a CryptFilter dictionary.
|
|
|
|
type FilterDict struct{CFM string ;AuthEvent _cd .AuthEvent ;Length int ;};
|
|
|
|
|
|
|
|
// PDFVersion implements Filter interface.
|
|
|
|
func (_edg filterV2 )PDFVersion ()[2]int {return [2]int {}};
|
|
|
|
|
|
|
|
// PDFVersion implements Filter interface.
|
|
|
|
func (filterAESV3 )PDFVersion ()[2]int {return [2]int {2,0}};type filterIdentity struct{};func _ebc (_ggb string )(filterFunc ,error ){_dbf :=_be [_ggb ];if _dbf ==nil {return nil ,_f .Errorf ("\u0075\u006e\u0073\u0075p\u0070\u006f\u0072\u0074\u0065\u0064\u0020\u0063\u0072\u0079p\u0074 \u0066\u0069\u006c\u0074\u0065\u0072\u003a \u0025\u0071",_ggb );
|
|
|
|
};return _dbf ,nil ;};type filterFunc func (_aba FilterDict )(Filter ,error );func (filterIdentity )HandlerVersion ()(V ,R int ){return ;};func (filterIdentity )KeyLength ()int {return 0};
|
|
|
|
|
|
|
|
// Name implements Filter interface.
|
|
|
|
func (filterV2 )Name ()string {return "\u0056\u0032"};type filterAESV3 struct{filterAES };
|
|
|
|
|
|
|
|
// HandlerVersion implements Filter interface.
|
|
|
|
func (filterAESV3 )HandlerVersion ()(V ,R int ){V ,R =5,6;return ;};
|
|
|
|
|
|
|
|
// Name implements Filter interface.
|
|
|
|
func (filterAESV3 )Name ()string {return "\u0041\u0045\u0053V\u0033"};
|
|
|
|
|
|
|
|
// NewFilterAESV2 creates an AES-based filter with a 128 bit key (AESV2).
|
|
|
|
func NewFilterAESV2 ()Filter {_bd ,_eb :=_ad (FilterDict {});if _eb !=nil {_e .Log .Error ("E\u0052\u0052\u004f\u0052\u003a\u0020\u0063\u006f\u0075l\u0064\u0020\u006e\u006f\u0074\u0020\u0063re\u0061\u0074\u0065\u0020A\u0045\u0053\u0020\u0056\u0032\u0020\u0063\u0072\u0079pt\u0020\u0066i\u006c\u0074\u0065\u0072\u003a\u0020\u0025\u0076",_eb );
|
|
|
|
return filterAESV2 {};};return _bd ;};
|
|
|
|
|
|
|
|
// MakeKey implements Filter interface.
|
|
|
|
func (_cf filterV2 )MakeKey (objNum ,genNum uint32 ,ekey []byte )([]byte ,error ){return _ebba (objNum ,genNum ,ekey ,false );};
|