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
00123
00124
00125
00126 class gsiOptions {
00127 public:
00128 short debug;
00129 short mode;
00130 char *clist;
00131 char *certdir;
00132 char *crldir;
00133 char *crlext;
00134 char *cert;
00135
00136 char *key;
00137
00138 char *cipher;
00139 char *md;
00140 int crl;
00141 int ca;
00142 char *proxy;
00143 char *valid;
00144 int deplen;
00145 int bits;
00146 char *gridmap;
00147 int gmapto;
00148 char *gmapfun;
00149 char *gmapfunparms;
00150 int ogmap;
00151 int dlgpxy;
00152
00153 int sigpxy;
00154 char *srvnames;
00155 char *exppxy;
00156
00157 gsiOptions() { debug = -1; mode = 's'; clist = 0;
00158 certdir = 0; crldir = 0; crlext = 0; cert = 0; key = 0;
00159 cipher = 0; md = 0; ca = 1 ; crl = 1;
00160 proxy = 0; valid = 0; deplen = 0; bits = 512;
00161 gridmap = 0; gmapto = -1; gmapfun = 0; gmapfunparms = 0; ogmap = 1;
00162 dlgpxy = 0; sigpxy = 1; srvnames = 0; exppxy = 0;}
00163 virtual ~gsiOptions() { }
00164 };
00165
00166 class XrdSecProtocolgsi;
00167 class gsiHSVars {
00168 public:
00169 int Iter;
00170 int TimeStamp;
00171 String CryptoMod;
00172 int RemVers;
00173 XrdCryptoCipher *Rcip;
00174 XrdSutBucket *Cbck;
00175 String ID;
00176 XrdSutPFEntry *Cref;
00177 XrdSutPFEntry *Pent;
00178 X509Chain *Chain;
00179 XrdCryptoX509Crl *Crl;
00180 X509Chain *PxyChain;
00181 bool RtagOK;
00182 bool Tty;
00183 int LastStep;
00184 int Options;
00185 XrdSutBuffer *Parms;
00186
00187 gsiHSVars() { Iter = 0; TimeStamp = -1; CryptoMod = "";
00188 RemVers = -1; Rcip = 0;
00189 Cbck = 0;
00190 ID = ""; Cref = 0; Pent = 0; Chain = 0; Crl = 0; PxyChain = 0;
00191 RtagOK = 0; Tty = 0; LastStep = 0; Options = 0; Parms = 0;}
00192
00193 ~gsiHSVars() { SafeDelete(Cref);
00194 if (Options & kOptsDelChn) {
00195
00196 if (Chain) Chain->Cleanup(1);
00197 SafeDelete(Chain);
00198 }
00199
00200
00201 PxyChain = 0;
00202 SafeDelete(Parms); }
00203 void Dump(XrdSecProtocolgsi *p = 0);
00204 };
00205
00206
00207 typedef struct {
00208 X509Chain *chain;
00209 XrdCryptoRSA *ksig;
00210 XrdSutBucket *cbck;
00211 } ProxyOut_t;
00212
00213
00214 typedef struct {
00215 const char *cert;
00216 const char *key;
00217 const char *certdir;
00218 const char *out;
00219 const char *valid;
00220 int deplen;
00221 int bits;
00222 } ProxyIn_t;
00223
00224
00225
00226
00227
00228 class XrdSecProtocolgsi : public XrdSecProtocol
00229 {
00230 public:
00231 int Authenticate (XrdSecCredentials *cred,
00232 XrdSecParameters **parms,
00233 XrdOucErrInfo *einfo=0);
00234
00235 XrdSecCredentials *getCredentials(XrdSecParameters *parm=0,
00236 XrdOucErrInfo *einfo=0);
00237
00238 XrdSecProtocolgsi(int opts, const char *hname,
00239 const struct sockaddr *ipadd, const char *parms = 0);
00240 virtual ~XrdSecProtocolgsi() {}
00241
00242
00243 static char *Init(gsiOptions o, XrdOucErrInfo *erp);
00244
00245 void Delete();
00246
00247
00248 int Encrypt(const char *inbuf, int inlen,
00249 XrdSecBuffer **outbuf);
00250 int Decrypt(const char *inbuf, int inlen,
00251 XrdSecBuffer **outbuf);
00252
00253 int Sign(const char *inbuf, int inlen,
00254 XrdSecBuffer **outbuf);
00255 int Verify(const char *inbuf, int inlen,
00256 const char *sigbuf, int siglen);
00257
00258
00259 int getKey(char *kbuf=0, int klen=0);
00260
00261 int setKey(char *kbuf, int klen);
00262
00263 private:
00264
00265
00266 static XrdSysMutex gsiContext;
00267 static String CAdir;
00268 static String CRLdir;
00269 static String DefCRLext;
00270 static String SrvCert;
00271 static String SrvKey;
00272 static String UsrProxy;
00273 static String UsrCert;
00274 static String UsrKey;
00275 static String PxyValid;
00276 static int DepLength;
00277 static int DefBits;
00278 static int CACheck;
00279 static int CRLCheck;
00280 static String DefCrypto;
00281 static String DefCipher;
00282 static String DefMD;
00283 static String DefError;
00284 static String GMAPFile;
00285 static int GMAPOpt;
00286 static int GMAPCacheTimeOut;
00287 static XrdSysPlugin *GMAPPlugin;
00288 static XrdSecgsiGMAP_t GMAPFun;
00289 static int PxyReqOpts;
00290 static String SrvAllowedNames;
00291
00292
00293 static int ncrypt;
00294 static XrdCryptoFactory *cryptF[XrdCryptoMax];
00295 static int cryptID[XrdCryptoMax];
00296 static String cryptName[XrdCryptoMax];
00297 static XrdCryptoCipher *refcip[XrdCryptoMax];
00298
00299
00300 static XrdSutCache cacheCA;
00301 static XrdSutCache cacheCert;
00302 static XrdSutCache cachePxy;
00303 static XrdSutCache cacheGMAP;
00304 static XrdSutCache cacheGMAPFun;
00305
00306
00307 static int Debug;
00308 static bool Server;
00309 static int TimeSkew;
00310
00311
00312 static XrdSysLogger Logger;
00313 static XrdSysError eDest;
00314 static XrdOucTrace *GSITrace;
00315
00316
00317 int options;
00318 struct sockaddr hostaddr;
00319 XrdCryptoFactory *sessionCF;
00320 XrdCryptoCipher *sessionKey;
00321 XrdSutBucket *bucketKey;
00322 XrdCryptoMsgDigest *sessionMD;
00323 XrdCryptoRSA *sessionKsig;
00324 XrdCryptoRSA *sessionKver;
00325 X509Chain *proxyChain;
00326 bool srvMode;
00327
00328
00329 gsiHSVars *hs;
00330
00331
00332 int ParseClientInput(XrdSutBuffer *br, XrdSutBuffer **bm,
00333 String &emsg);
00334 int ClientDoInit(XrdSutBuffer *br, XrdSutBuffer **bm,
00335 String &cmsg);
00336 int ClientDoCert(XrdSutBuffer *br, XrdSutBuffer **bm,
00337 String &cmsg);
00338 int ClientDoPxyreq(XrdSutBuffer *br, XrdSutBuffer **bm,
00339 String &cmsg);
00340
00341
00342 int ParseServerInput(XrdSutBuffer *br, XrdSutBuffer **bm,
00343 String &cmsg);
00344 int ServerDoCertreq(XrdSutBuffer *br, XrdSutBuffer **bm,
00345 String &cmsg);
00346 int ServerDoCert(XrdSutBuffer *br, XrdSutBuffer **bm,
00347 String &cmsg);
00348 int ServerDoSigpxy(XrdSutBuffer *br, XrdSutBuffer **bm,
00349 String &cmsg);
00350
00351
00352 int ParseCrypto(String cryptlist);
00353 int ParseCAlist(String calist);
00354
00355
00356 static int LoadCADir(int timestamp);
00357 int GetCA(const char *cahash);
00358 static String GetCApath(const char *cahash);
00359 static bool VerifyCA(int opt, X509Chain *cca, XrdCryptoFactory *cf);
00360 bool ServerCertNameOK(const char *subject, String &e);
00361
00362
00363 static XrdCryptoX509Crl *LoadCRL(XrdCryptoX509 *xca,
00364 XrdCryptoFactory *CF);
00365
00366
00367 static int QueryProxy(bool checkcache, XrdSutCache *cache, const char *tag,
00368 XrdCryptoFactory *cf, int timestamp,
00369 ProxyIn_t *pi, ProxyOut_t *po);
00370 static int InitProxy(ProxyIn_t *pi,
00371 X509Chain *ch = 0, XrdCryptoRSA **key = 0);
00372
00373
00374 static void ErrF(XrdOucErrInfo *einfo, kXR_int32 ecode,
00375 const char *msg1, const char *msg2 = 0,
00376 const char *msg3 = 0);
00377 XrdSecCredentials *ErrC(XrdOucErrInfo *einfo, XrdSutBuffer *b1,
00378 XrdSutBuffer *b2,XrdSutBuffer *b3,
00379 kXR_int32 ecode, const char *msg1 = 0,
00380 const char *msg2 = 0, const char *msg3 = 0);
00381 int ErrS(String ID, XrdOucErrInfo *einfo, XrdSutBuffer *b1,
00382 XrdSutBuffer *b2, XrdSutBuffer *b3,
00383 kXR_int32 ecode, const char *msg1 = 0,
00384 const char *msg2 = 0, const char *msg3 = 0);
00385
00386
00387 bool CheckTimeStamp(XrdSutBuffer *b, int skew, String &emsg);
00388
00389
00390 bool CheckRtag(XrdSutBuffer *bm, String &emsg);
00391
00392
00393 int AddSerialized(char opt, kXR_int32 step, String ID,
00394 XrdSutBuffer *bls, XrdSutBuffer *buf,
00395 kXR_int32 type, XrdCryptoCipher *cip);
00396
00397 static int LoadGMAP(int now);
00398 static XrdSecgsiGMAP_t
00399 LoadGMAPFun(const char *plugin, const char *parms);
00400 static void QueryGMAP(const char *dn, int now, String &name);
00401 };