1 /*
   2  * Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package sun.security.jgss;
  27 
  28 import java.security.Provider;
  29 import java.security.AccessController;
  30 import java.security.PrivilegedAction;
  31 import java.security.NoSuchAlgorithmException;
  32 import java.security.InvalidParameterException;
  33 import java.security.ProviderException;
  34 import sun.security.jgss.krb5.Krb5MechFactory;
  35 import sun.security.jgss.spnego.SpNegoMechFactory;
  36 
  37 /**
  38  * Defines the Sun JGSS provider.
  39  * Will merger this with the Sun security provider
  40  * sun.security.provider.Sun when the JGSS src is merged with the JDK
  41  * src.
  42  *
  43  * Mechanisms supported are:
  44  *
  45  * - Kerberos v5 as defined in RFC 1964.
  46  *   Oid is 1.2.840.113554.1.2.2
  47  *
  48  * - SPNEGO as defined in RFC 2478
  49  *   Oid is 1.3.6.1.5.5.2
  50  *
  51  *   [Dummy mechanism is no longer compiled:
  52  * - Dummy mechanism. This is primarily useful to test a multi-mech
  53  *   environment.
  54  *   Oid is 1.3.6.1.4.1.42.2.26.1.2]
  55  *
  56  * @author Mayank Upadhyay
  57  */
  58 
  59 public final class SunProvider extends Provider {
  60 
  61     private static final long serialVersionUID = -238911724858694198L;
  62 
  63     private static final String INFO = "Sun " +
  64         "(Kerberos v5, SPNEGO)";
  65     //  "(Kerberos v5, Dummy GSS-API Mechanism)";
  66 
  67     private static final class ProviderService extends Provider.Service {
  68         ProviderService(Provider p, String type, String algo, String cn) {
  69             super(p, type, algo, cn, null, null);
  70         }
  71 
  72         @Override
  73         public Object newInstance(Object ctrParamObj)
  74             throws NoSuchAlgorithmException {
  75             String type = getType();
  76             if (ctrParamObj != null) {
  77                 throw new InvalidParameterException
  78                     ("constructorParameter not used with " + type +
  79                      " engines");
  80             }
  81             String algo = getAlgorithm();
  82             try {
  83                 if (type.equals("GssApiMechanism")) {
  84                     if (algo.equals("1.2.840.113554.1.2.2")) {
  85                         return new Krb5MechFactory();
  86                     } else if (algo.equals("1.3.6.1.5.5.2")) {
  87                         return new SpNegoMechFactory();
  88                     }
  89                 }
  90             } catch (Exception ex) {
  91                 throw new NoSuchAlgorithmException
  92                     ("Error constructing " + type + " for " +
  93                     algo + " using SunJGSS", ex);
  94             }
  95             throw new ProviderException("No impl for " + algo +
  96                 " " + type);
  97         }
  98     }
  99 
 100     public static final SunProvider INSTANCE = new SunProvider();
 101 
 102     public SunProvider() {
 103         /* We are the Sun JGSS provider */
 104         super("SunJGSS", 1.9d, INFO);
 105 
 106         final Provider p = this;
 107         AccessController.doPrivileged(new PrivilegedAction<Void>() {
 108             public Void run() {
 109                 putService(new ProviderService(p, "GssApiMechanism",
 110                            "1.2.840.113554.1.2.2",
 111                            "sun.security.jgss.krb5.Krb5MechFactory"));
 112                 putService(new ProviderService(p, "GssApiMechanism",
 113                            "1.3.6.1.5.5.2",
 114                            "sun.security.jgss.spnego.SpNegoMechFactory"));
 115                 return null;
 116             }
 117         });
 118     }
 119 }