unipdf/model/sigutil/sigutil.go

104 lines
8.8 KiB
Go
Raw Normal View History

2020-11-11 18:48:37 +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/
2023-07-28 12:14:31 +00:00
package sigutil ;import (_a "bytes";_g "crypto";_d "crypto/x509";_ea "encoding/asn1";_b "encoding/pem";_af "errors";_aed "fmt";_bc "github.com/unidoc/timestamp";_ac "github.com/unidoc/unipdf/v3/common";_ed "golang.org/x/crypto/ocsp";_f "io";_ae "io/ioutil";
_gf "net/http";_e "time";);
2023-05-29 17:26:33 +00:00
2023-07-28 12:14:31 +00:00
// NewCertClient returns a new certificate client.
func NewCertClient ()*CertClient {return &CertClient {HTTPClient :_afe ()}};
2022-12-15 21:59:56 +00:00
2023-07-28 12:14:31 +00:00
// NewTimestampRequest returns a new timestamp request based
// on the specified options.
func NewTimestampRequest (body _f .Reader ,opts *_bc .RequestOptions )(*_bc .Request ,error ){if opts ==nil {opts =&_bc .RequestOptions {};};if opts .Hash ==0{opts .Hash =_g .SHA256 ;};if !opts .Hash .Available (){return nil ,_d .ErrUnsupportedAlgorithm ;
};_gc :=opts .Hash .New ();if _ ,_aec :=_f .Copy (_gc ,body );_aec !=nil {return nil ,_aec ;};return &_bc .Request {HashAlgorithm :opts .Hash ,HashedMessage :_gc .Sum (nil ),Certificates :opts .Certificates ,TSAPolicyOID :opts .TSAPolicyOID ,Nonce :opts .Nonce },nil ;
};
2023-06-30 13:19:48 +00:00
2023-07-28 12:14:31 +00:00
// GetEncodedToken executes the timestamp request and returns the DER encoded
// timestamp token bytes.
func (_ad *TimestampClient )GetEncodedToken (serverURL string ,req *_bc .Request )([]byte ,error ){if serverURL ==""{return nil ,_aed .Errorf ("\u006d\u0075\u0073\u0074\u0020\u0070r\u006f\u0076\u0069\u0064\u0065\u0020\u0074\u0069\u006d\u0065\u0073\u0074\u0061m\u0070\u0020\u0073\u0065\u0072\u0076\u0065r\u0020\u0055\u0052\u004c");
};if req ==nil {return nil ,_aed .Errorf ("\u0074\u0069\u006de\u0073\u0074\u0061\u006dp\u0020\u0072\u0065\u0071\u0075\u0065\u0073t\u0020\u0063\u0061\u006e\u006e\u006f\u0074\u0020\u0062\u0065\u0020\u006e\u0069\u006c");};_cge ,_fd :=req .Marshal ();if _fd !=nil {return nil ,_fd ;
};_cc ,_fd :=_gf .NewRequest ("\u0050\u004f\u0053\u0054",serverURL ,_a .NewBuffer (_cge ));if _fd !=nil {return nil ,_fd ;};_cc .Header .Set ("\u0043\u006f\u006et\u0065\u006e\u0074\u002d\u0054\u0079\u0070\u0065","a\u0070\u0070\u006c\u0069\u0063\u0061t\u0069\u006f\u006e\u002f\u0074\u0069\u006d\u0065\u0073t\u0061\u006d\u0070-\u0071u\u0065\u0072\u0079");
if _ad .BeforeHTTPRequest !=nil {if _ca :=_ad .BeforeHTTPRequest (_cc );_ca !=nil {return nil ,_ca ;};};_cf :=_ad .HTTPClient ;if _cf ==nil {_cf =_afe ();};_be ,_fd :=_cf .Do (_cc );if _fd !=nil {return nil ,_fd ;};defer _be .Body .Close ();_bfa ,_fd :=_ae .ReadAll (_be .Body );
if _fd !=nil {return nil ,_fd ;};if _be .StatusCode !=_gf .StatusOK {return nil ,_aed .Errorf ("\u0075\u006e\u0065x\u0070\u0065\u0063\u0074e\u0064\u0020\u0048\u0054\u0054\u0050\u0020s\u0074\u0061\u0074\u0075\u0073\u0020\u0063\u006f\u0064\u0065\u003a\u0020\u0025\u0064",_be .StatusCode );
};var _ef struct{Version _ea .RawValue ;Content _ea .RawValue ;};if _ ,_fd =_ea .Unmarshal (_bfa ,&_ef );_fd !=nil {return nil ,_fd ;};return _ef .Content .FullBytes ,nil ;};
// NewCRLClient returns a new CRL client.
func NewCRLClient ()*CRLClient {return &CRLClient {HTTPClient :_afe ()}};
// CertClient represents a X.509 certificate client. Its primary purpose
// is to download certificates.
type CertClient struct{
// HTTPClient is the HTTP client used to make certificate requests.
2023-06-30 13:19:48 +00:00
// By default, an HTTP client with a 5 second timeout per request is used.
2023-07-28 12:14:31 +00:00
HTTPClient *_gf .Client ;};
2023-06-30 13:19:48 +00:00
2023-07-28 12:14:31 +00:00
// Get retrieves the certificate at the specified URL.
func (_fe *CertClient )Get (url string )(*_d .Certificate ,error ){if _fe .HTTPClient ==nil {_fe .HTTPClient =_afe ();};_dg ,_ce :=_fe .HTTPClient .Get (url );if _ce !=nil {return nil ,_ce ;};defer _dg .Body .Close ();_fa ,_ce :=_ae .ReadAll (_dg .Body );
if _ce !=nil {return nil ,_ce ;};if _ba ,_ :=_b .Decode (_fa );_ba !=nil {_fa =_ba .Bytes ;};_fea ,_ce :=_d .ParseCertificate (_fa );if _ce !=nil {return nil ,_ce ;};return _fea ,nil ;};
2023-06-30 13:19:48 +00:00
2023-07-28 12:14:31 +00:00
// GetIssuer retrieves the issuer of the provided certificate.
func (_da *CertClient )GetIssuer (cert *_d .Certificate )(*_d .Certificate ,error ){for _ ,_fg :=range cert .IssuingCertificateURL {_acd ,_cg :=_da .Get (_fg );if _cg !=nil {_ac .Log .Debug ("\u0057\u0041\u0052\u004e\u003a\u0020\u0063\u006f\u0075\u006c\u0064\u0020\u006e\u006f\u0074 \u0064\u006f\u0077\u006e\u006c\u006f\u0061\u0064\u0020\u0069\u0073\u0073\u0075e\u0072\u0020\u0066\u006f\u0072\u0020\u0063\u0065\u0072\u0074\u0069\u0066ic\u0061\u0074\u0065\u0020\u0025\u0076\u003a\u0020\u0025\u0076",cert .Subject .CommonName ,_cg );
continue ;};return _acd ,nil ;};return nil ,_aed .Errorf ("\u0069\u0073\u0073\u0075e\u0072\u0020\u0063\u0065\u0072\u0074\u0069\u0066\u0069\u0063a\u0074e\u0020\u006e\u006f\u0074\u0020\u0066\u006fu\u006e\u0064");};
2023-02-07 17:17:49 +00:00
2023-05-29 17:26:33 +00:00
// TimestampClient represents a RFC 3161 timestamp client.
// It is used to obtain signed tokens from timestamp authority servers.
type TimestampClient struct{
2023-02-07 17:17:49 +00:00
2023-05-29 17:26:33 +00:00
// HTTPClient is the HTTP client used to make timestamp requests.
2023-04-06 19:57:40 +00:00
// By default, an HTTP client with a 5 second timeout per request is used.
2023-07-28 12:14:31 +00:00
HTTPClient *_gf .Client ;
2023-03-01 18:45:57 +00:00
2023-05-29 17:26:33 +00:00
// Callbacks.
2023-07-28 12:14:31 +00:00
BeforeHTTPRequest func (_bd *_gf .Request )error ;};
2023-04-06 19:57:40 +00:00
2023-07-28 12:14:31 +00:00
// IsCA returns true if the provided certificate appears to be a CA certificate.
func (_cgc *CertClient )IsCA (cert *_d .Certificate )bool {return cert .IsCA &&_a .Equal (cert .RawIssuer ,cert .RawSubject );};
2023-04-06 19:57:40 +00:00
2023-07-28 12:14:31 +00:00
// MakeRequest makes a OCSP request to the specified server and returns
// the parsed and raw responses. If a server URL is not provided, it is
// extracted from the certificate.
func (_cb *OCSPClient )MakeRequest (serverURL string ,cert ,issuer *_d .Certificate )(*_ed .Response ,[]byte ,error ){if _cb .HTTPClient ==nil {_cb .HTTPClient =_afe ();};if serverURL ==""{if len (cert .OCSPServer )==0{return nil ,nil ,_af .New ("\u0063e\u0072\u0074i\u0066\u0069\u0063a\u0074\u0065\u0020\u0064\u006f\u0065\u0073 \u006e\u006f\u0074\u0020\u0073\u0070e\u0063\u0069\u0066\u0079\u0020\u0061\u006e\u0079\u0020\u004f\u0043S\u0050\u0020\u0073\u0065\u0072\u0076\u0065\u0072\u0073");
};serverURL =cert .OCSPServer [0];};_df ,_gfg :=_ed .CreateRequest (cert ,issuer ,&_ed .RequestOptions {Hash :_cb .Hash });if _gfg !=nil {return nil ,nil ,_gfg ;};_eb ,_gfg :=_cb .HTTPClient .Post (serverURL ,"\u0061p\u0070\u006c\u0069\u0063\u0061\u0074\u0069\u006f\u006e\u002f\u006fc\u0073\u0070\u002d\u0072\u0065\u0071\u0075\u0065\u0073\u0074",_a .NewReader (_df ));
if _gfg !=nil {return nil ,nil ,_gfg ;};defer _eb .Body .Close ();_cd ,_gfg :=_ae .ReadAll (_eb .Body );if _gfg !=nil {return nil ,nil ,_gfg ;};if _fae ,_ :=_b .Decode (_cd );_fae !=nil {_cd =_fae .Bytes ;};_dc ,_gfg :=_ed .ParseResponseForCert (_cd ,cert ,issuer );
if _gfg !=nil {return nil ,nil ,_gfg ;};return _dc ,_cd ,nil ;};
2023-05-29 17:26:33 +00:00
2023-06-30 13:19:48 +00:00
// NewOCSPClient returns a new OCSP client.
2023-07-28 12:14:31 +00:00
func NewOCSPClient ()*OCSPClient {return &OCSPClient {HTTPClient :_afe (),Hash :_g .SHA1 }};
2022-09-10 15:35:04 +00:00
2023-07-28 12:14:31 +00:00
// MakeRequest makes a CRL request to the specified server and returns the
// response. If a server URL is not provided, it is extracted from the certificate.
func (_bb *CRLClient )MakeRequest (serverURL string ,cert *_d .Certificate )([]byte ,error ){if _bb .HTTPClient ==nil {_bb .HTTPClient =_afe ();};if serverURL ==""{if len (cert .CRLDistributionPoints )==0{return nil ,_af .New ("\u0063e\u0072\u0074i\u0066\u0069\u0063\u0061t\u0065\u0020\u0064o\u0065\u0073\u0020\u006e\u006f\u0074\u0020\u0073\u0070ec\u0069\u0066\u0079 \u0061\u006ey\u0020\u0043\u0052\u004c\u0020\u0073e\u0072\u0076e\u0072\u0073");
};serverURL =cert .CRLDistributionPoints [0];};_ceb ,_ab :=_bb .HTTPClient .Get (serverURL );if _ab !=nil {return nil ,_ab ;};defer _ceb .Body .Close ();_bf ,_ab :=_ae .ReadAll (_ceb .Body );if _ab !=nil {return nil ,_ab ;};if _gb ,_ :=_b .Decode (_bf );
_gb !=nil {_bf =_gb .Bytes ;};return _bf ,nil ;};
2022-09-10 15:35:04 +00:00
2023-05-29 17:26:33 +00:00
// OCSPClient represents a OCSP (Online Certificate Status Protocol) client.
// It is used to request revocation data from OCSP servers.
type OCSPClient struct{
2022-12-15 21:59:56 +00:00
2023-05-29 17:26:33 +00:00
// HTTPClient is the HTTP client used to make OCSP requests.
// By default, an HTTP client with a 5 second timeout per request is used.
2023-07-28 12:14:31 +00:00
HTTPClient *_gf .Client ;
2022-12-15 21:59:56 +00:00
2023-05-29 17:26:33 +00:00
// Hash is the hash function used when constructing the OCSP
// requests. If zero, SHA-1 will be used.
2023-07-28 12:14:31 +00:00
Hash _g .Hash ;};
2023-03-01 18:45:57 +00:00
2023-07-28 12:14:31 +00:00
// NewTimestampClient returns a new timestamp client.
func NewTimestampClient ()*TimestampClient {return &TimestampClient {HTTPClient :_afe ()}};func _afe ()*_gf .Client {return &_gf .Client {Timeout :5*_e .Second }};
2023-04-06 19:57:40 +00:00
2023-07-28 12:14:31 +00:00
// CRLClient represents a CRL (Certificate revocation list) client.
// It is used to request revocation data from CRL servers.
type CRLClient struct{
2023-04-06 19:57:40 +00:00
2023-07-28 12:14:31 +00:00
// HTTPClient is the HTTP client used to make CRL requests.
2022-06-06 22:48:24 +00:00
// By default, an HTTP client with a 5 second timeout per request is used.
2023-07-28 12:14:31 +00:00
HTTPClient *_gf .Client ;};