1 /*
2 * Copyright (C) 2015, Google Inc.
3 * and other copyright owners as documented in the project's IP log.
4 *
5 * This program and the accompanying materials are made available
6 * under the terms of the Eclipse Distribution License v1.0 which
7 * accompanies this distribution, is reproduced below, and is
8 * available at http://www.eclipse.org/org/documents/edl-v10.php
9 *
10 * All rights reserved.
11 *
12 * Redistribution and use in source and binary forms, with or
13 * without modification, are permitted provided that the following
14 * conditions are met:
15 *
16 * - Redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer.
18 *
19 * - Redistributions in binary form must reproduce the above
20 * copyright notice, this list of conditions and the following
21 * disclaimer in the documentation and/or other materials provided
22 * with the distribution.
23 *
24 * - Neither the name of the Eclipse Foundation, Inc. nor the
25 * names of its contributors may be used to endorse or promote
26 * products derived from this software without specific prior
27 * written permission.
28 *
29 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
30 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
31 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
32 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
33 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
34 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
35 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
36 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
37 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
38 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
40 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
41 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
42 */
43
44 package org.eclipse.jgit.transport;
45
46 import org.eclipse.jgit.lib.Config;
47 import org.eclipse.jgit.lib.Config.SectionParser;
48
49 /**
50 * Configuration for server-side signed push verification.
51 *
52 * @since 4.1
53 */
54 public class SignedPushConfig {
55 /** Key for {@link Config#get(SectionParser)}. */
56 public static final SectionParser<SignedPushConfig> KEY =
57 SignedPushConfig::new;
58
59 private String certNonceSeed;
60 private int certNonceSlopLimit;
61 private NonceGenerator nonceGenerator;
62
63 /**
64 * Create a new config with default values disabling push verification.
65 */
66 public SignedPushConfig() {
67 }
68
69 SignedPushConfig(Config cfg) {
70 setCertNonceSeed(cfg.getString("receive", null, "certnonceseed")); //$NON-NLS-1$ //$NON-NLS-2$
71 certNonceSlopLimit = cfg.getInt("receive", "certnonceslop", 0); //$NON-NLS-1$ //$NON-NLS-2$
72 }
73
74 /**
75 * Set the seed used by the nonce verifier.
76 * <p>
77 * Setting this to a non-null value enables push certificate verification
78 * using the default
79 * {@link org.eclipse.jgit.transport.HMACSHA1NonceGenerator} implementation,
80 * if a different implementation was not set using
81 * {@link #setNonceGenerator(NonceGenerator)}.
82 *
83 * @param seed
84 * new seed value.
85 */
86 public void setCertNonceSeed(String seed) {
87 certNonceSeed = seed;
88 }
89
90 /**
91 * Get the configured seed.
92 *
93 * @return the configured seed.
94 */
95 public String getCertNonceSeed() {
96 return certNonceSeed;
97 }
98
99 /**
100 * Set the nonce slop limit.
101 * <p>
102 * Old but valid nonces within this limit will be accepted.
103 *
104 * @param limit
105 * new limit in seconds.
106 */
107 public void setCertNonceSlopLimit(int limit) {
108 certNonceSlopLimit = limit;
109 }
110
111 /**
112 * Get the configured nonce slop limit.
113 *
114 * @return the configured nonce slop limit.
115 */
116 public int getCertNonceSlopLimit() {
117 return certNonceSlopLimit;
118 }
119
120 /**
121 * Set the {@link org.eclipse.jgit.transport.NonceGenerator} used for signed
122 * pushes.
123 * <p>
124 * Setting this to a non-null value enables push certificate verification.
125 * If this method is called, this implementation will be used instead of the
126 * default {@link org.eclipse.jgit.transport.HMACSHA1NonceGenerator} even if
127 * {@link #setCertNonceSeed(String)} was called.
128 *
129 * @param generator
130 * new nonce generator.
131 */
132 public void setNonceGenerator(NonceGenerator generator) {
133 nonceGenerator = generator;
134 }
135
136 /**
137 * Get the {@link org.eclipse.jgit.transport.NonceGenerator} used for signed
138 * pushes.
139 * <p>
140 * If {@link #setNonceGenerator(NonceGenerator)} was used to set a non-null
141 * implementation, that will be returned. If no custom implementation was
142 * set but {@link #setCertNonceSeed(String)} was called, returns a
143 * newly-created {@link org.eclipse.jgit.transport.HMACSHA1NonceGenerator}.
144 *
145 * @return the configured nonce generator.
146 */
147 public NonceGenerator getNonceGenerator() {
148 if (nonceGenerator != null) {
149 return nonceGenerator;
150 } else if (certNonceSeed != null) {
151 return new HMACSHA1NonceGenerator(certNonceSeed);
152 }
153 return null;
154 }
155 }