// // 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/ package crypt ;import (_c "crypto/aes";_d "crypto/cipher";_cb "crypto/md5";_gf "crypto/rand";_fc "crypto/rc4";_e "fmt";_fb "github.com/unidoc/unipdf/v3/common";_gb "github.com/unidoc/unipdf/v3/core/security";_f "io";);func init (){_gdd ("\u0041\u0045\u0053V\u0032",_fcd )}; type filterAES struct{};func (filterIdentity )Name ()string {return "\u0049\u0064\u0065\u006e\u0074\u0069\u0074\u0079"}; // DecryptBytes implements Filter interface. func (filterV2 )DecryptBytes (buf []byte ,okey []byte )([]byte ,error ){_dda ,_ee :=_fc .NewCipher (okey );if _ee !=nil {return nil ,_ee ;};_fb .Log .Trace ("\u0052\u00434\u0020\u0044\u0065c\u0072\u0079\u0070\u0074\u003a\u0020\u0025\u0020\u0078",buf ); _dda .XORKeyStream (buf ,buf );_fb .Log .Trace ("\u0074o\u003a\u0020\u0025\u0020\u0078",buf );return buf ,nil ;}; // NewFilterAESV2 creates an AES-based filter with a 128 bit key (AESV2). func NewFilterAESV2 ()Filter {_a ,_ae :=_fcd (FilterDict {});if _ae !=nil {_fb .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",_ae ); return filterAESV2 {};};return _a ;}; // NewIdentity creates an identity filter that bypasses all data without changes. func NewIdentity ()Filter {return filterIdentity {}}; // KeyLength implements Filter interface. func (filterAESV2 )KeyLength ()int {return 128/8}; // NewFilterAESV3 creates an AES-based filter with a 256 bit key (AESV3). func NewFilterAESV3 ()Filter {_fd ,_fg :=_da (FilterDict {});if _fg !=nil {_fb .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",_fg ); return filterAESV3 {};};return _fd ;}; // PDFVersion implements Filter interface. func (_eac filterV2 )PDFVersion ()[2]int {return [2]int {}};var (_bg =make (map[string ]filterFunc ););func init (){_gdd ("\u0041\u0045\u0053V\u0033",_da )}; // Name implements Filter interface. func (filterAESV2 )Name ()string {return "\u0041\u0045\u0053V\u0032"}; // 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"};var _ Filter =filterV2 {};func (filterAES )EncryptBytes (buf []byte ,okey []byte )([]byte ,error ){_bb ,_aa :=_c .NewCipher (okey );if _aa !=nil {return nil ,_aa ;};_fb .Log .Trace ("A\u0045\u0053\u0020\u0045nc\u0072y\u0070\u0074\u0020\u0028\u0025d\u0029\u003a\u0020\u0025\u0020\u0078",len (buf ),buf ); const _cbb =_c .BlockSize ;_de :=_cbb -len (buf )%_cbb ;for _df :=0;_df < _de ;_df ++{buf =append (buf ,byte (_de ));};_fb .Log .Trace ("\u0050a\u0064d\u0065\u0064\u0020\u0074\u006f \u0025\u0064 \u0062\u0079\u0074\u0065\u0073",len (buf ));_cd :=make ([]byte ,_cbb +len (buf )); _dad :=_cd [:_cbb ];if _ ,_ga :=_f .ReadFull (_gf .Reader ,_dad );_ga !=nil {return nil ,_ga ;};_aea :=_d .NewCBCEncrypter (_bb ,_dad );_aea .CryptBlocks (_cd [_cbb :],buf );buf =_cd ;_fb .Log .Trace ("\u0074\u006f\u0020(\u0025\u0064\u0029\u003a\u0020\u0025\u0020\u0078",len (buf ),buf ); return buf ,nil ;}; // KeyLength implements Filter interface. func (filterAESV3 )KeyLength ()int {return 256/8}; // HandlerVersion implements Filter interface. func (filterAESV2 )HandlerVersion ()(V ,R int ){V ,R =4,4;return ;};func _fcd (_b FilterDict )(Filter ,error ){if _b .Length ==128{_fb .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",_b .Length ); _b .Length /=8;};if _b .Length !=0&&_b .Length !=16{return nil ,_e .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",_b .Length ); };return filterAESV2 {},nil ;}; // EncryptBytes implements Filter interface. func (filterV2 )EncryptBytes (buf []byte ,okey []byte )([]byte ,error ){_bfe ,_aac :=_fc .NewCipher (okey );if _aac !=nil {return nil ,_aac ;};_fb .Log .Trace ("\u0052\u00434\u0020\u0045\u006ec\u0072\u0079\u0070\u0074\u003a\u0020\u0025\u0020\u0078",buf ); _bfe .XORKeyStream (buf ,buf );_fb .Log .Trace ("\u0074o\u003a\u0020\u0025\u0020\u0078",buf );return buf ,nil ;};func _da (_eg FilterDict )(Filter ,error ){if _eg .Length ==256{_fb .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",_eg .Length ); _eg .Length /=8;};if _eg .Length !=0&&_eg .Length !=32{return nil ,_e .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",_eg .Length ); };return filterAESV3 {},nil ;};type filterAESV2 struct{filterAES }; // KeyLength implements Filter interface. func (_bf filterV2 )KeyLength ()int {return _bf ._bbd };func init (){_gdd ("\u0056\u0032",_ea )};func _ea (_cag FilterDict )(Filter ,error ){if _cag .Length %8!=0{return nil ,_e .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",_cag .Length ); };if _cag .Length < 5||_cag .Length > 16{if _cag .Length ==40||_cag .Length ==64||_cag .Length ==128{_fb .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",_cag .Length ); _cag .Length /=8;}else {return nil ,_e .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",_cag .Length ); };};return filterV2 {_bbd :_cag .Length },nil ;}; // FilterDict represents information from a CryptFilter dictionary. type FilterDict struct{CFM string ;AuthEvent _gb .AuthEvent ;Length int ;};type filterV2 struct{_bbd int };func (filterIdentity )MakeKey (objNum ,genNum uint32 ,fkey []byte )([]byte ,error ){return fkey ,nil };var _ Filter =filterAESV3 {};var _ Filter =filterAESV2 {}; // NewFilter creates CryptFilter from a corresponding dictionary. func NewFilter (d FilterDict )(Filter ,error ){_cdf ,_cea :=_ddf (d .CFM );if _cea !=nil {return nil ,_cea ;};_adc ,_cea :=_cdf (d );if _cea !=nil {return nil ,_cea ;};return _adc ,nil ;};func (filterIdentity )EncryptBytes (p []byte ,okey []byte )([]byte ,error ){return p ,nil }; func (filterIdentity )KeyLength ()int {return 0};func (filterIdentity )PDFVersion ()[2]int {return [2]int {}}; // MakeKey implements Filter interface. func (filterAESV3 )MakeKey (_ ,_ uint32 ,ekey []byte )([]byte ,error ){return ekey ,nil }; // Name implements Filter interface. func (filterV2 )Name ()string {return "\u0056\u0032"};func _ec (_eba ,_gfe uint32 ,_ge []byte ,_fde bool )([]byte ,error ){_dg :=make ([]byte ,len (_ge )+5);for _fded :=0;_fded < len (_ge );_fded ++{_dg [_fded ]=_ge [_fded ];};for _fee :=0;_fee < 3;_fee ++{_gaa :=byte ((_eba >>uint32 (8*_fee ))&0xff); _dg [_fee +len (_ge )]=_gaa ;};for _ac :=0;_ac < 2;_ac ++{_aeb :=byte ((_gfe >>uint32 (8*_ac ))&0xff);_dg [_ac +len (_ge )+3]=_aeb ;};if _fde {_dg =append (_dg ,0x73);_dg =append (_dg ,0x41);_dg =append (_dg ,0x6C);_dg =append (_dg ,0x54);};_ebe :=_cb .New (); _ebe .Write (_dg );_bbb :=_ebe .Sum (nil );if len (_ge )+5< 16{return _bbb [0:len (_ge )+5],nil ;};return _bbb ,nil ;};type filterFunc func (_ad FilterDict )(Filter ,error ); // MakeKey implements Filter interface. func (filterAESV2 )MakeKey (objNum ,genNum uint32 ,ekey []byte )([]byte ,error ){return _ec (objNum ,genNum ,ekey ,true );}; // PDFVersion implements Filter interface. func (filterAESV3 )PDFVersion ()[2]int {return [2]int {2,0}};func (filterAES )DecryptBytes (buf []byte ,okey []byte )([]byte ,error ){_ed ,_db :=_c .NewCipher (okey );if _db !=nil {return nil ,_db ;};if len (buf )< 16{_fb .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 ,_e .Errorf ("\u0041\u0045\u0053\u003a B\u0075\u0066\u0020\u006c\u0065\u006e\u0020\u003c\u0020\u0031\u0036\u0020\u0028\u0025d\u0029",len (buf ));};_ca :=buf [:16];buf =buf [16:];if len (buf )%16!=0{_fb .Log .Debug ("\u0020\u0069\u0076\u0020\u0028\u0025\u0064\u0029\u003a\u0020\u0025\u0020\u0078",len (_ca ),_ca ); _fb .Log .Debug ("\u0062\u0075\u0066\u0020\u0028\u0025\u0064\u0029\u003a\u0020\u0025\u0020\u0078",len (buf ),buf );return buf ,_e .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 )); };_aef :=_d .NewCBCDecrypter (_ed ,_ca );_fb .Log .Trace ("A\u0045\u0053\u0020\u0044ec\u0072y\u0070\u0074\u0020\u0028\u0025d\u0029\u003a\u0020\u0025\u0020\u0078",len (buf ),buf );_fb .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 ); _aef .CryptBlocks (buf ,buf );_fb .Log .Trace ("\u0074\u006f\u0020(\u0025\u0064\u0029\u003a\u0020\u0025\u0020\u0078",len (buf ),buf );if len (buf )==0{_fb .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 ;};_dfd :=int (buf [len (buf )-1]);if _dfd > len (buf ){_fb .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",_dfd ,len (buf )); return buf ,_e .Errorf ("\u0069n\u0076a\u006c\u0069\u0064\u0020\u0070a\u0064\u0020l\u0065\u006e\u0067\u0074\u0068");};buf =buf [:len (buf )-_dfd ];return buf ,nil ;}; // 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. MakeKey (_fda ,_ce uint32 ,_dc []byte )([]byte ,error ); // EncryptBytes encrypts a buffer using object encryption key, as returned by MakeKey. // Implementation may reuse a buffer and encrypt data in-place. EncryptBytes (_bbdf []byte ,_gfd []byte )([]byte ,error ); // DecryptBytes decrypts a buffer using object encryption key, as returned by MakeKey. // Implementation may reuse a buffer and decrypt data in-place. DecryptBytes (_feg []byte ,_bgg []byte )([]byte ,error );};func _ddf (_gbea string )(filterFunc ,error ){_gea :=_bg [_gbea ];if _gea ==nil {return nil ,_e .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",_gbea ); };return _gea ,nil ;};type filterAESV3 struct{filterAES };func (filterIdentity )DecryptBytes (p []byte ,okey []byte )([]byte ,error ){return p ,nil };func _gdd (_dbd string ,_dbdf filterFunc ){if _ ,_bbf :=_bg [_dbd ];_bbf {panic ("\u0061l\u0072e\u0061\u0064\u0079\u0020\u0072e\u0067\u0069s\u0074\u0065\u0072\u0065\u0064"); };_bg [_dbd ]=_dbdf ;}; // NewFilterV2 creates a RC4-based filter with a specified key length (in bytes). func NewFilterV2 (length int )Filter {_def ,_ebf :=_ea (FilterDict {Length :length });if _ebf !=nil {_fb .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",_ebf ); return filterV2 {_bbd :length };};return _def ;}; // PDFVersion implements Filter interface. func (filterAESV2 )PDFVersion ()[2]int {return [2]int {1,5}};func (filterIdentity )HandlerVersion ()(V ,R int ){return ;}; // HandlerVersion implements Filter interface. func (_edc filterV2 )HandlerVersion ()(V ,R int ){V ,R =2,3;return ;}; // MakeKey implements Filter interface. func (_gg filterV2 )MakeKey (objNum ,genNum uint32 ,ekey []byte )([]byte ,error ){return _ec (objNum ,genNum ,ekey ,false );};type filterIdentity struct{};