00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 #include <XrdOuc/XrdOucErrInfo.hh>
00010 #include <XrdSys/XrdSysPthread.hh>
00011 #include <XrdOuc/XrdOucString.hh>
00012 #include <XrdOuc/XrdOucTokenizer.hh>
00013 
00014 #include <XrdSec/XrdSecInterface.hh>
00015 #include <XrdSecgsi/XrdSecgsiTrace.hh>
00016 
00017 #include <XrdSut/XrdSutPFEntry.hh>
00018 #include <XrdSut/XrdSutPFile.hh>
00019 #include <XrdSut/XrdSutBuffer.hh>
00020 #include <XrdSut/XrdSutRndm.hh>
00021 
00022 #include <XrdCrypto/XrdCryptoAux.hh>
00023 #include <XrdCrypto/XrdCryptoCipher.hh>
00024 #include <XrdCrypto/XrdCryptoFactory.hh>
00025 #include <XrdCrypto/XrdCryptoX509Crl.hh>
00026 
00027 #include <XrdCrypto/XrdCryptosslgsiX509Chain.hh>
00028 
00029 
00030 
00031 
00032 
00033 typedef XrdOucString String;
00034 typedef XrdCryptosslgsiX509Chain X509Chain;
00035   
00036 #define XrdSecPROTOIDENT    "gsi"
00037 #define XrdSecPROTOIDLEN    sizeof(XrdSecPROTOIDENT)
00038 #define XrdSecgsiVERSION    10200
00039 #define XrdSecNOIPCHK       0x0001
00040 #define XrdSecDEBUG         0x1000
00041 #define XrdCryptoMax        10
00042 
00043 #define kMAXBUFLEN          1024
00044 
00045 
00046 
00047 enum kgsiStatus {
00048    kgST_error    = -1,      
00049    kgST_ok       =  0,      
00050    kgST_more     =  1       
00051 };
00052 
00053 
00054 enum kgsiClientSteps {
00055    kXGC_none = 0,
00056    kXGC_certreq     = 1000, 
00057    kXGC_cert,               
00058    kXGC_sigpxy,             
00059    kXGC_reserved            
00060 };
00061 
00062 
00063 enum kgsiServerSteps {
00064    kXGS_none = 0,
00065    kXGS_init       = 2000,   
00066    kXGS_cert,                
00067    kXGS_pxyreq,              
00068    kXGS_reserved             
00069 };
00070 
00071 
00072 enum kgsiHandshakeOpts {
00073    kOptsDlgPxy     = 1,      
00074    kOptsFwdPxy     = 2,      
00075    kOptsSigReq     = 4,      
00076    kOptsSrvReq     = 8,      
00077    kOptsPxFile     = 16,     
00078    kOptsDelChn     = 32      
00079 };
00080 
00081 
00082 enum kgsiErrors {
00083    kGSErrParseBuffer = 10000,       
00084    kGSErrDecodeBuffer,              
00085    kGSErrLoadCrypto,                
00086    kGSErrBadProtocol,               
00087    kGSErrCreateBucket,              
00088    kGSErrDuplicateBucket,           
00089    kGSErrCreateBuffer,              
00090    kGSErrSerialBuffer,              
00091    kGSErrGenCipher,                 
00092    kGSErrExportPuK,                 
00093    kGSErrEncRndmTag,                
00094    kGSErrBadRndmTag,                
00095    kGSErrNoRndmTag,                 
00096    kGSErrNoCipher,                  
00097    kGSErrNoCreds,                   
00098    kGSErrBadOpt,                    
00099    kGSErrMarshal,                   
00100    kGSErrUnmarshal,                 
00101    kGSErrSaveCreds,                 
00102    kGSErrNoBuffer,                  
00103    kGSErrRefCipher,                 
00104    kGSErrNoPublic,                  
00105    kGSErrAddBucket,                 
00106    kGSErrFinCipher,                 
00107    kGSErrInit,                      
00108    kGSErrBadCreds,                  
00109    kGSErrError                      
00110 };
00111 
00112 #define REL1(x)     { if (x) delete x; }
00113 #define REL2(x,y)   { if (x) delete x; if (y) delete y; }
00114 #define REL3(x,y,z) { if (x) delete x; if (y) delete y; if (z) delete z; }
00115 
00116 #define SafeDelete(x) { if (x) delete x ; x = 0; }
00117 #define SafeDelArray(x) { if (x) delete [] x ; x = 0; }
00118 #define SafeFree(x) { if (x) free(x) ; x = 0; }
00119 
00120 
00121 typedef char *(*XrdSecgsiGMAP_t)(const char *, int);
00122 typedef char *(*XrdSecgsiAuthz_t)(const char *, int);
00123 
00124 
00125 
00126 
00127 class gsiOptions {
00128 public:
00129    short  debug;  
00130    short  mode;   
00131    char  *clist;  
00132    char  *certdir;
00133    char  *crldir; 
00134    char  *crlext; 
00135    char  *cert;   
00136                   
00137    char  *key;    
00138                   
00139    char  *cipher; 
00140    char  *md;     
00141    int    crl;    
00142    int    ca;     
00143    char  *proxy;  
00144    char  *valid;  
00145    int    deplen; 
00146    int    bits;   
00147    char  *gridmap;
00148    int    gmapto; 
00149    char  *gmapfun;
00150    char  *gmapfunparms;
00151    char  *authzfun;
00152    char  *authzfunparms;
00153    int    ogmap;  
00154    int    dlgpxy; 
00155                   
00156    int    sigpxy; 
00157    char  *srvnames;
00158    char  *exppxy; 
00159    int    authzpxy; 
00160                     
00161 
00162    gsiOptions() { debug = -1; mode = 's'; clist = 0; 
00163                   certdir = 0; crldir = 0; crlext = 0; cert = 0; key = 0;
00164                   cipher = 0; md = 0; ca = 1 ; crl = 1;
00165                   proxy = 0; valid = 0; deplen = 0; bits = 512;
00166                   gridmap = 0; gmapto = -1; gmapfun = 0; gmapfunparms = 0; authzfun = 0; authzfunparms = 0; ogmap = 1;
00167                   dlgpxy = 0; sigpxy = 1; srvnames = 0; exppxy = 0; authzpxy = 0;}
00168    virtual ~gsiOptions() { } 
00169 };
00170 
00171 class XrdSecProtocolgsi;
00172 class gsiHSVars {
00173 public:
00174    int               Iter;          
00175    int               TimeStamp;     
00176    String            CryptoMod;     
00177    int               RemVers;       
00178    XrdCryptoCipher  *Rcip;          
00179    XrdSutBucket     *Cbck;          
00180    String            ID;            
00181    XrdSutPFEntry    *Cref;          
00182    XrdSutPFEntry    *Pent;          
00183    X509Chain        *Chain;         
00184    XrdCryptoX509Crl *Crl;           
00185    X509Chain        *PxyChain;      
00186    bool              RtagOK;        
00187    bool              Tty;           
00188    int               LastStep;      
00189    int               Options;       
00190    XrdSutBuffer     *Parms;         
00191 
00192    gsiHSVars() { Iter = 0; TimeStamp = -1; CryptoMod = "";
00193                  RemVers = -1; Rcip = 0;
00194                  Cbck = 0;
00195                  ID = ""; Cref = 0; Pent = 0; Chain = 0; Crl = 0; PxyChain = 0;
00196                  RtagOK = 0; Tty = 0; LastStep = 0; Options = 0; Parms = 0;}
00197 
00198    ~gsiHSVars() { SafeDelete(Cref);
00199                   if (Options & kOptsDelChn) {
00200                      
00201                      if (Chain) Chain->Cleanup(1);
00202                      SafeDelete(Chain);
00203                   }
00204                   
00205                   
00206                   PxyChain = 0;
00207                   SafeDelete(Parms); }
00208    void Dump(XrdSecProtocolgsi *p = 0);
00209 };
00210 
00211 
00212 typedef struct {
00213    X509Chain        *chain;
00214    XrdCryptoRSA     *ksig;
00215    XrdSutBucket     *cbck;
00216 } ProxyOut_t;
00217 
00218 
00219 typedef struct {
00220    const char *cert;
00221    const char *key;
00222    const char *certdir;
00223    const char *out;
00224    const char *valid;
00225    int         deplen;
00226    int         bits;
00227 } ProxyIn_t;
00228 
00229 
00230 
00231 
00232 
00233 class XrdSecProtocolgsi : public XrdSecProtocol
00234 {
00235 public:
00236         int                Authenticate  (XrdSecCredentials *cred,
00237                                           XrdSecParameters **parms,
00238                                           XrdOucErrInfo     *einfo=0);
00239 
00240         XrdSecCredentials *getCredentials(XrdSecParameters  *parm=0,
00241                                           XrdOucErrInfo     *einfo=0);
00242 
00243         XrdSecProtocolgsi(int opts, const char *hname,
00244                           const struct sockaddr *ipadd, const char *parms = 0);
00245         virtual ~XrdSecProtocolgsi() {} 
00246 
00247         
00248         static char      *Init(gsiOptions o, XrdOucErrInfo *erp);
00249 
00250         void              Delete();
00251 
00252         
00253         int               Encrypt(const char *inbuf, int inlen,
00254                                   XrdSecBuffer **outbuf);
00255         int               Decrypt(const char *inbuf, int inlen,
00256                                   XrdSecBuffer **outbuf);
00257         
00258         int               Sign(const char *inbuf, int inlen,
00259                                XrdSecBuffer **outbuf);
00260         int               Verify(const char *inbuf, int inlen,
00261                                  const char *sigbuf, int siglen);
00262 
00263         
00264         int               getKey(char *kbuf=0, int klen=0);
00265         
00266         int               setKey(char *kbuf, int klen);
00267 
00268 private:
00269 
00270    
00271    static XrdSysMutex      gsiContext;
00272    static String           CAdir;
00273    static String           CRLdir;
00274    static String           DefCRLext;
00275    static String           SrvCert;
00276    static String           SrvKey;
00277    static String           UsrProxy;
00278    static String           UsrCert;
00279    static String           UsrKey;
00280    static String           PxyValid;
00281    static int              DepLength;
00282    static int              DefBits;
00283    static int              CACheck;
00284    static int              CRLCheck;
00285    static String           DefCrypto;
00286    static String           DefCipher;
00287    static String           DefMD;
00288    static String           DefError;
00289    static String           GMAPFile;
00290    static int              GMAPOpt;
00291    static int              GMAPCacheTimeOut;
00292    static XrdSysPlugin    *GMAPPlugin;
00293    static XrdSecgsiGMAP_t  GMAPFun;
00294    static XrdSysPlugin    *AuthzPlugin;
00295    static XrdSecgsiAuthz_t AuthzFun; 
00296    static int              PxyReqOpts;
00297    static int              AuthzPxy;
00298    static String           SrvAllowedNames;
00299    
00300    
00301    static int              ncrypt;                  
00302    static XrdCryptoFactory *cryptF[XrdCryptoMax];   
00303    static int              cryptID[XrdCryptoMax];   
00304    static String           cryptName[XrdCryptoMax]; 
00305    static XrdCryptoCipher *refcip[XrdCryptoMax];    
00306    
00307    
00308    static XrdSutCache      cacheCA;   
00309    static XrdSutCache      cacheCert; 
00310    static XrdSutCache      cachePxy;  
00311    static XrdSutCache      cacheGMAP; 
00312    static XrdSutCache      cacheGMAPFun; 
00313    
00314    
00315    static int              Debug;          
00316    static bool             Server;         
00317    static int              TimeSkew;       
00318    
00319    
00320    static XrdSysLogger     Logger;
00321    static XrdSysError      eDest;
00322    static XrdOucTrace     *GSITrace;
00323 
00324    
00325    int              options;
00326    struct sockaddr  hostaddr;      
00327    XrdCryptoFactory *sessionCF;    
00328    XrdCryptoCipher *sessionKey;    
00329    XrdSutBucket    *bucketKey;     
00330    XrdCryptoMsgDigest *sessionMD;  
00331    XrdCryptoRSA    *sessionKsig;   
00332    XrdCryptoRSA    *sessionKver;   
00333    X509Chain       *proxyChain;    
00334    bool             srvMode;       
00335 
00336    
00337    gsiHSVars     *hs;
00338 
00339    
00340    int            ParseClientInput(XrdSutBuffer *br, XrdSutBuffer **bm,
00341                                    String &emsg);
00342    int            ClientDoInit(XrdSutBuffer *br, XrdSutBuffer **bm,
00343                                String &cmsg);
00344    int            ClientDoCert(XrdSutBuffer *br,  XrdSutBuffer **bm,
00345                                String &cmsg);
00346    int            ClientDoPxyreq(XrdSutBuffer *br,  XrdSutBuffer **bm,
00347                                  String &cmsg);
00348 
00349    
00350    int            ParseServerInput(XrdSutBuffer *br, XrdSutBuffer **bm,
00351                                    String &cmsg);
00352    int            ServerDoCertreq(XrdSutBuffer *br, XrdSutBuffer **bm,
00353                                   String &cmsg);
00354    int            ServerDoCert(XrdSutBuffer *br,  XrdSutBuffer **bm,
00355                                String &cmsg);
00356    int            ServerDoSigpxy(XrdSutBuffer *br,  XrdSutBuffer **bm,
00357                                  String &cmsg);
00358 
00359    
00360    int            ParseCrypto(String cryptlist);
00361    int            ParseCAlist(String calist);
00362 
00363    
00364    static int     LoadCADir(int timestamp);
00365    int            GetCA(const char *cahash);
00366    static String  GetCApath(const char *cahash);
00367    static bool    VerifyCA(int opt, X509Chain *cca, XrdCryptoFactory *cf);
00368    bool           ServerCertNameOK(const char *subject, String &e);
00369 
00370    
00371    static XrdCryptoX509Crl *LoadCRL(XrdCryptoX509 *xca,
00372                                     XrdCryptoFactory *CF);
00373 
00374    
00375    static int     QueryProxy(bool checkcache, XrdSutCache *cache, const char *tag,
00376                              XrdCryptoFactory *cf, int timestamp,
00377                              ProxyIn_t *pi, ProxyOut_t *po);
00378    static int     InitProxy(ProxyIn_t *pi,
00379                             X509Chain *ch = 0, XrdCryptoRSA **key = 0);
00380 
00381    
00382    static void    ErrF(XrdOucErrInfo *einfo, kXR_int32 ecode,
00383                        const char *msg1, const char *msg2 = 0,
00384                        const char *msg3 = 0);
00385    XrdSecCredentials *ErrC(XrdOucErrInfo *einfo, XrdSutBuffer *b1,
00386                            XrdSutBuffer *b2,XrdSutBuffer *b3,
00387                            kXR_int32 ecode, const char *msg1 = 0,
00388                            const char *msg2 = 0, const char *msg3 = 0);
00389    int            ErrS(String ID, XrdOucErrInfo *einfo, XrdSutBuffer *b1,
00390                        XrdSutBuffer *b2, XrdSutBuffer *b3,
00391                        kXR_int32 ecode, const char *msg1 = 0,
00392                        const char *msg2 = 0, const char *msg3 = 0);
00393 
00394    
00395    bool           CheckTimeStamp(XrdSutBuffer *b, int skew, String &emsg);
00396 
00397    
00398    bool           CheckRtag(XrdSutBuffer *bm, String &emsg);
00399 
00400    
00401    int            AddSerialized(char opt, kXR_int32 step, String ID, 
00402                                 XrdSutBuffer *bls, XrdSutBuffer *buf,
00403                                 kXR_int32 type, XrdCryptoCipher *cip);
00404    
00405    static int     LoadGMAP(int now); 
00406    static XrdSecgsiGMAP_t            
00407                   LoadGMAPFun(const char *plugin, const char *parms);
00408    static XrdSecgsiAuthz_t            
00409                   LoadAuthzFun(const char *plugin, const char *parms);
00410    static void    QueryGMAP(XrdCryptoX509Chain* chain, int now, String &name); 
00411 };