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 };