/*
* Copyright (c) 2008-2012, Hazel Bilisim Ltd. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.hazelcast.aws.security;
import com.hazelcast.aws.impl.DescribeInstances;
import com.hazelcast.aws.utility.AwsURLEncoder;
import java.security.SignatureException;
import java.util.*;
public class EC2RequestSigner {
private static final String HTTP_VERB = "GET\n";
private static final String HTTP_REQUEST_URI = "/\n";
private final String secretKey;
public EC2RequestSigner(String secretKey) {
this.secretKey = secretKey;
}
public void sign(DescribeInstances request, String endpoint) {
String canonicalizedQueryString = getCanonicalizedQueryString(request);
String stringToSign = new StringBuilder().append(HTTP_VERB)
.append(endpoint).append("\n")
.append(HTTP_REQUEST_URI)
.append(canonicalizedQueryString).toString();
String signature = signTheString(stringToSign);
request.putSignature(signature);
}
private String signTheString(String stringToSign) {
String signature = null;
try {
signature = RFC2104HMAC.calculateRFC2104HMAC(stringToSign, secretKey);
} catch (SignatureException e) {
throw new RuntimeException(e);
}
return signature;
}
private String getCanonicalizedQueryString(DescribeInstances request) {
List<String> componentz = getListOfEntries(request.getAttributes());
Collections.sort(componentz);
String canonicalizedQueryString = getCanonicalizedQueryString(componentz);
return canonicalizedQueryString;
}
private void addComponentz(List<String> components, Map<String, String> attributes, String key) {
components.add(AwsURLEncoder.urlEncode(key) + "=" + AwsURLEncoder.urlEncode(attributes.get(key)));
}
private List<String> getListOfEntries(Map<String, String> entries) {
List<String> components = new ArrayList<String>();
for (Iterator<String> iterator = entries.keySet().iterator(); iterator.hasNext(); ) {
String key = iterator.next();
addComponentz(components, entries, key);
}
return components;
}
/**
* @param list
* @return
*/
private String getCanonicalizedQueryString(List<String> list) {
Iterator<String> it = list.iterator();
StringBuilder result = new StringBuilder(it.next());
while (it.hasNext()) {
result.append("&").append(it.next());
}
return result.toString();
}
}