Skip to content
Snippets Groups Projects
Commit d0f5f14d authored by Benoit Lavenier's avatar Benoit Lavenier
Browse files

first commit

parent e2405198
No related branches found
No related tags found
No related merge requests found
Showing
with 954 additions and 11 deletions
......@@ -2,3 +2,8 @@ ucoinj
======
uCoin Java API
To compile :
mvn install
\ No newline at end of file
......@@ -5,7 +5,7 @@
<version>1.1-SNAPSHOT</version> </parent -->
<groupId>io.ucoin</groupId>
<artifactId>ucoin-client</artifactId>
<artifactId>ucoinj</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>UCoin Java Client</name>
......@@ -59,12 +59,12 @@
<inceptionYear>2014</inceptionYear>
<!-- SVN repository -
<!-- SVN repository -->
<scm>
<url>https://forge.ifremer.fr/svn/sih-adagio/trunk/adagio-extractor/</url>
<connection>scm:svn:https://forge.ifremer.fr/svn/sih-adagio/trunk/adagio-extractor/</connection>
<developerConnection>scm:svn:https://forge.ifremer.fr/svn/sih-adagio/trunk/adagio-extractor/</developerConnection>
</scm>-->
<url>https://github.com/blavenie/ucoinj/</url>
<connection>scm:svn:https://github.com/blavenie/ucoinj/</connection>
<developerConnection>scm:svn:https://github.com/blavenie/ucoinj/</developerConnection>
</scm>
<profiles>
......@@ -420,7 +420,7 @@
<repositories>
<repository>
<id>adagio-public-group</id>
<url>http://nexus.e-is.pro/nexus/content/groups/sih-adagio</url>
<url>http://nexus.e-is.pro/nexus/content/groups/ucoinj</url>
<snapshots>
<enabled>true</enabled>
<checksumPolicy>fail</checksumPolicy>
......@@ -445,19 +445,19 @@
<repository>
<id>eis-nexus-deploy</id>
<url>
http://nexus.e-is.pro/nexus/content/repositories/sih-adagio-releases
http://nexus.e-is.pro/nexus/content/repositories/ucoinj-releases
</url>
</repository>
<snapshotRepository>
<id>eis-nexus-deploy</id>
<url>
http://nexus.e-is.pro/nexus/content/repositories/sih-adagio-snapshots
http://nexus.e-is.pro/nexus/content/repositories/ucoinj-snapshots
</url>
</snapshotRepository>
</distributionManagement>
<modules>
<module>core</module>
<module>ui</module>
<module>ucoinj-core</module>
<!-- <module>ucoinj-web</module> -->
</modules>
</project>
run.bat 0 → 100644
@echo off
SET MAVEN_OPTS=-Xms128m -Xmx256m -XX:PermSize=64M -XX:MaxPermSize=128M
SET JAVA_HOME=C:\Program Files\Java\jdk1.7.0_45
REM CALL mvn install -f batch/pom.xml -Dmaven.test.skip=true -Plocalhost-gepeto -Ppgsql -e -Denv=pgsql
CALL mvn jetty:stop -f ui/pom.xml
CALL mvn install --non-recursive
CALL mvn install -f core/pom.xml -DskipTests
SET MAVEN_OPTS=-Xms128m -Xmx256m -XX:PermSize=64M -XX:MaxPermSize=128M -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=4000,server=y,suspend=n
CALL mvn jetty:run -f ui/pom.xml -DskipTests -e
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>io.ucoin</groupId>
<artifactId>ucoinj</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>io.ucoin</groupId>
<artifactId>ucoinj-core</artifactId>
<packaging>jar</packaging>
<name>UCoin Java Client :: Core API</name>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</dependency>
<!-- NaCL lib -->
<dependency>
<groupId>org.abstractj.kalium</groupId>
<artifactId>kalium</artifactId>
<version>0.3.0</version>
</dependency>
<!-- scrypt lib -->
<dependency>
<groupId>com.lambdaworks</groupId>
<artifactId>scrypt</artifactId>
<version>1.4.0</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
<!-- Unit test -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
package io.ucoin.client.core;
import io.ucoin.client.core.service.BlockchainService;
import io.ucoin.client.core.service.WotService;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class UCoinClientCore {
private static final Log log = LogFactory.getLog(UCoinClientCore.class);
}
package io.ucoin.client.core.config;
public class NodeConfig {
private String host;
public NodeConfig() {
}
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
}
package io.ucoin.client.core.model;
import java.io.Serializable;
import java.util.List;
/**
* A block from the blockchain.
*
* @author Benoit Lavenier <benoit.lavenier@e-is.pro>
* @since 1.0
*/
public class BlockchainBlock implements Serializable {
private static final long serialVersionUID = -5598140972293452669L;
private String version;
private Integer nonce;
private Integer date;
private Integer confirmedDate;
private Integer membersCount;
private String currency;
private String issuer;
private String signature;
private String hash;
private String parameters;
private String previousHash;
private String previousIssuer;
private Integer dividend;
//private int memberChanges;
private List<Identity> identities;
private List<Member> joiners;
// private int actives": [],
// private int leavers": [],
// private int excluded": [],
// private int certifications": [],
// private int transactions": [],
// private int raw": "Version: 1\nType: Block\nCurrency: zeta_brouzouf\nNonce: 8233\nNumber: 1\nDate: 1416589860\nConfirmedDate: 1416589860\nIssuer: HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk\nPreviousHash: 00006CD96A01378465318E48310118AC6B2F3625\nPreviousIssuer: HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk\nMembersCount: 4\nIdentities:\nJoiners:\nActives:\nLeavers:\nExcluded:\nCertifications:\nTransactions:\n"
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
public Integer getNonce() {
return nonce;
}
public void setNonce(Integer nonce) {
this.nonce = nonce;
}
public Integer getDate() {
return date;
}
public void setDate(Integer date) {
this.date = date;
}
public Integer getConfirmedDate() {
return confirmedDate;
}
public void setConfirmedDate(Integer confirmedDate) {
this.confirmedDate = confirmedDate;
}
public Integer getMembersCount() {
return membersCount;
}
public void setMembersCount(Integer membersCount) {
this.membersCount = membersCount;
}
public String getCurrency() {
return currency;
}
public void setCurrency(String currency) {
this.currency = currency;
}
public String getIssuer() {
return issuer;
}
public void setIssuer(String issuer) {
this.issuer = issuer;
}
public String getSignature() {
return signature;
}
public void setSignature(String signature) {
this.signature = signature;
}
public String getHash() {
return hash;
}
public void setHash(String hash) {
this.hash = hash;
}
public String getParameters() {
return parameters;
}
public void setParameters(String parameters) {
this.parameters = parameters;
}
public String getPreviousHash() {
return previousHash;
}
public void setPreviousHash(String previousHash) {
this.previousHash = previousHash;
}
public String getPreviousIssuer() {
return previousIssuer;
}
public void setPreviousIssuer(String previousIssuer) {
this.previousIssuer = previousIssuer;
}
public Integer getDividend() {
return dividend;
}
public void setDividend(Integer dividend) {
this.dividend = dividend;
}
public List<Identity> getIdentities() {
return identities;
}
public void setIdentities(List<Identity> identities) {
this.identities = identities;
}
public List<Member> getJoiners() {
return joiners;
}
public void setJoiners(List<Member> joiners) {
this.joiners = joiners;
}
}
package io.ucoin.client.core.model;
/**
* Blockwhain parameters.
*
* @author Benoit Lavenier <benoit.lavenier@e-is.pro>
* @since 1.0
*/
public class BlockchainParameter {
private String currency;
/**
* The %growth of the UD every [dt] period
*/
private Double c;
/**
* Time period between two UD
*/
private Integer dt;
/**
* UD(0), i.e. initial Universal Dividend
*/
private Integer ud0;
/**
* Minimum delay between 2 identical certifications (same pubkeys)
*/
private Integer sigDelay;
/* TODO :
"sigValidity": 2629800,
"sigQty": 3,
"stepMax": 3,
"powZeroMin": 4,
"powPeriod": 0.05,
"incDateMin": 3,
"dtDateMin": 10800
*/
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("currency: ").append(currency).append("\n")
.append("c: ").append(c).append("\n")
.append("dt: ").append(dt).append("\n")
.append("ud0: ").append(ud0).append("\n")
.append("sigDelay: ").append(sigDelay);
return sb.toString();
}
public String getCurrency() {
return currency;
}
public void setCurrency(String currency) {
this.currency = currency;
}
public Double getC() {
return c;
}
public void setC(Double c) {
this.c = c;
}
public Integer getDt() {
return dt;
}
public void setDt(Integer dt) {
this.dt = dt;
}
public Integer getUd0() {
return ud0;
}
public void setUd0(Integer ud0) {
this.ud0 = ud0;
}
public Integer getSigDelay() {
return sigDelay;
}
public void setSigDelay(Integer sigDelay) {
this.sigDelay = sigDelay;
}
}
package io.ucoin.client.core.model;
public class Identity {
private String pubkey;
private String signature;
private int timestamp;
private String uid;
public String getPubkey() {
return pubkey;
}
public void setPubkey(String pubkey) {
this.pubkey = pubkey;
}
public String getSignature() {
return signature;
}
public void setSignature(String signature) {
this.signature = signature;
}
public int getTimestamp() {
return timestamp;
}
public void setTimestamp(int timestamp) {
this.timestamp = timestamp;
}
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
}
package io.ucoin.client.core.model;
public class Member extends Identity{
private String number;
private String hash;
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getHash() {
return hash;
}
public void setHash(String hash) {
this.hash = hash;
}
}
package io.ucoin.client.core.model;
import java.io.Serializable;
import java.util.List;
public class WotLookupResult implements Serializable{
private static final long serialVersionUID = -39452685440482106L;
private String pubkey;
private List<WotLookupUId> uids;
public String getPubkey() {
return pubkey;
}
public void setPubkey(String pubkey) {
this.pubkey = pubkey;
}
public List<WotLookupUId> getUids() {
return uids;
}
public void setUids(List<WotLookupUId> uids) {
this.uids = uids;
}
}
package io.ucoin.client.core.model;
import java.util.List;
public class WotLookupResults {
private boolean partial;
private List<WotLookupResult> results;
public boolean isPartial() {
return partial;
}
public void setPartial(boolean partial) {
this.partial = partial;
}
public List<WotLookupResult> getResults() {
return results;
}
public void setResults(List<WotLookupResult> results) {
this.results = results;
}
}
package io.ucoin.client.core.model;
import java.util.Map;
public class WotLookupSignature {
private String pubkey;
private Map<String, String> meta;
private String signature;
public String getPubkey() {
return pubkey;
}
public void setPubkey(String pubkey) {
this.pubkey = pubkey;
}
public Map<String, String> getMeta() {
return meta;
}
public void setMeta(Map<String, String> meta) {
this.meta = meta;
}
public String getSignature() {
return signature;
}
public void setSignature(String signature) {
this.signature = signature;
}
}
package io.ucoin.client.core.model;
import java.util.List;
import java.util.Map;
public class WotLookupUId {
private String uid;
private Map<String, String> meta;
private String self;
private List<WotLookupSignature> others;
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
public Map<String, String> getMeta() {
return meta;
}
public void setMeta(Map<String, String> meta) {
this.meta = meta;
}
public String getSelf() {
return self;
}
public void setSelf(String self) {
this.self = self;
}
public List<WotLookupSignature> getOthers() {
return others;
}
public void setOthers(List<WotLookupSignature> others) {
this.others = others;
}
}
package io.ucoin.client.core.service;
import io.ucoin.client.core.technical.UCoinTechnicalExecption;
import io.ucoin.client.core.technical.gson.GsonUtils;
import java.io.Closeable;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.ConnectException;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.http.HttpStatus;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import com.google.common.base.Charsets;
import com.google.common.base.Joiner;
import com.google.common.base.Preconditions;
import com.google.gson.Gson;
public abstract class AbstractService implements Closeable {
private static final Log log = LogFactory.getLog(AbstractService.class);
protected URI baseUri;
protected Integer baseTimeOut;
protected final Gson gson;
protected final CloseableHttpClient httpClient;
public AbstractService(String nodeURL) {
super();
this.gson = GsonUtils.newBuilder().create();
this.baseTimeOut = 1500;
this.httpClient = initHttpClient();
this.baseUri = initNodeURI(nodeURL);
}
@Override
public void close() throws IOException {
httpClient.close();
}
/* -- Internal methods -- */
protected CloseableHttpClient initHttpClient() {
CloseableHttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(getRequestConfig())
//.setDefaultCredentialsProvider(getCredentialsProvider())
.build();
return httpClient;
}
protected URI initNodeURI(String nodeUrl) {
try {
URL baseUrl = new URL(nodeUrl);
return baseUrl.toURI();
} catch (URISyntaxException ex) {
throw new UCoinTechnicalExecption(ex);
} catch (MalformedURLException e) {
throw new UCoinTechnicalExecption(e);
}
}
protected URI getAppendedPath(String... path) throws URISyntaxException {
String pathToAppend = Joiner.on('/').skipNulls().join(path);
URIBuilder builder = new URIBuilder(baseUri);
builder.setPath(baseUri.getPath() + pathToAppend);
return builder.build();
}
protected RequestConfig getRequestConfig() {
// build request config for timeout
return RequestConfig.custom().setSocketTimeout(baseTimeOut).setConnectTimeout(baseTimeOut).build();
}
@SuppressWarnings("unchecked")
protected <T> T executeRequest(HttpUriRequest request, Class<? extends T> resultClass) throws IOException {
Preconditions.checkNotNull(httpClient);
T result = null;
if (log.isDebugEnabled()) {
log.debug("Executing request : " + request.getRequestLine());
}
try {
try (CloseableHttpResponse response = httpClient.execute(request)) {
if (log.isDebugEnabled()) {
log.debug("Received response : " + response.getStatusLine());
}
switch (response.getStatusLine().getStatusCode()) {
case HttpStatus.SC_OK: {
result = (T)parseResponse(response, resultClass);
EntityUtils.consume(response.getEntity());
break;
}
case HttpStatus.SC_UNAUTHORIZED:
case HttpStatus.SC_FORBIDDEN:
throw new UCoinTechnicalExecption("ucoin.client.authentication");
default:
throw new UCoinTechnicalExecption("ucoin.client.status" + response.getStatusLine().toString());
}
}
} catch (ConnectException e) {
throw new UCoinTechnicalExecption("ucoin.client.core.connect", e);
}
return result;
}
protected Object parseResponse(CloseableHttpResponse response, Class<?> ResultClass) throws IOException {
Object result;
try (InputStream content = response.getEntity().getContent()) {
Reader reader = new InputStreamReader(content, Charsets.UTF_8);
result = gson.fromJson(reader, ResultClass);
}
if (result == null) {
throw new UCoinTechnicalExecption("ucoin.client.core.emptyResponse");
}
if (log.isDebugEnabled()) {
log.debug("response: " + ToStringBuilder.reflectionToString(result, ToStringStyle.SHORT_PREFIX_STYLE));
}
return result;
}
}
package io.ucoin.client.core.service;
import io.ucoin.client.core.model.BlockchainBlock;
import io.ucoin.client.core.model.BlockchainParameter;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
public class BlockchainService extends AbstractService{
private static final Log log = LogFactory.getLog(BlockchainService.class);
public BlockchainService(String nodeURL) {
super(nodeURL);
}
/**
* get the blockchain parameters (currency parameters)
* @return
* @throws Exception
*/
public BlockchainParameter getParameters() throws Exception {
// get blockchain parameter
HttpGet httpGet = new HttpGet(getAppendedPath(ProtocolUrls.BLOCKCHAIN_PARAMETERS));
BlockchainParameter result = executeRequest(httpGet, BlockchainParameter.class);
return result;
}
/**
* Retrieve a block, by id (from 0 to current)
* @param number
* @return
* @throws Exception
*/
public BlockchainBlock getBlock(int number) throws Exception {
// get blockchain parameter
String path = String.format(ProtocolUrls.BLOCKCHAIN_BLOCK, number);
HttpGet httpGet = new HttpGet(getAppendedPath(path));
BlockchainBlock result = executeRequest(httpGet, BlockchainBlock.class);
return result;
}
/**
* Request to integrate the wot
* @throws Exception
*/
public void requestMembership() throws Exception {
HttpPost httpPost = new HttpPost(getAppendedPath(ProtocolUrls.BLOCKCHAIN_MEMBERSHIP));
// StringEntity entity = new StringEntity(gson.toJson(form), ContentType.APPLICATION_JSON);
// httpPost.setEntity(entity);
executeRequest(httpPost, null);
}
/* -- Internal methods -- */
}
package io.ucoin.client.core.service;
public interface ProtocolUrls {
/* Block chain */
public static final String BLOCKCHAIN_BASE = "/blockchain";
public static final String BLOCKCHAIN_PARAMETERS = BLOCKCHAIN_BASE + "/parameters";
public static final String BLOCKCHAIN_BLOCK = BLOCKCHAIN_BASE + "/block/%s";
public static final String BLOCKCHAIN_MEMBERSHIP = BLOCKCHAIN_BASE + "/membership";
/* Web Of Trust */
public static final String WOT_BASE = "/wot";
public static final String WOT_LOOKUP = WOT_BASE + "/lookup/%s";
}
package io.ucoin.client.core.service;
import io.ucoin.client.core.model.WotLookupResult;
import io.ucoin.client.core.model.WotLookupResults;
import io.ucoin.client.core.model.WotLookupUId;
import io.ucoin.client.core.technical.UCoinTechnicalExecption;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.http.client.methods.HttpGet;
public class WotService extends AbstractService {
private static final Log log = LogFactory.getLog(WotService.class);
public WotService(String nodeURL) {
super(nodeURL);
}
public WotLookupResults find(String uidPattern) throws Exception {
if (log.isDebugEnabled()) {
log.debug(String.format("Try to find user info by uid: %s", uidPattern));
}
// get parameter
String path = String.format(ProtocolUrls.WOT_LOOKUP, uidPattern);
HttpGet lookupHttpGet = new HttpGet(getAppendedPath(path));
WotLookupResults lookupResult = executeRequest(lookupHttpGet, WotLookupResults.class);
return lookupResult;
}
public WotLookupUId findByUid(String uid) throws Exception {
if (log.isDebugEnabled()) {
log.debug(String.format("Try to find user info by uid: %s", uid));
}
// get parameter
String path = String.format(ProtocolUrls.WOT_LOOKUP, uid);
HttpGet lookupHttpGet = new HttpGet(getAppendedPath(path));
WotLookupResults lookupResults = executeRequest(lookupHttpGet, WotLookupResults.class);
WotLookupUId uniqueResult = getUid(lookupResults, uid);
if (uniqueResult == null) {
throw new UCoinTechnicalExecption("User not found, with uid=" + uid);
}
return uniqueResult;
}
/* -- Internal methods -- */
protected WotLookupUId getUid(WotLookupResults lookupResults, String filterUid) {
if (CollectionUtils.isEmpty(lookupResults.getResults())) {
return null;
}
for (WotLookupResult result : lookupResults.getResults()) {
if (CollectionUtils.isNotEmpty(result.getUids())) {
for (WotLookupUId uid : result.getUids()) {
if (filterUid.equals(uid.getUid())) {
return uid;
}
}
}
}
return null;
}
}
package io.ucoin.client.core.technical;
/**
* A uCoin technical exception
* @author Benoit Lavenier <benoit.lavenier@e-is.pro>
* @since
*
*/
public class UCoinTechnicalExecption extends RuntimeException{
private static final long serialVersionUID = -6715624222174163366L;
public UCoinTechnicalExecption() {
super();
}
public UCoinTechnicalExecption(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
public UCoinTechnicalExecption(String message, Throwable cause) {
super(message, cause);
}
public UCoinTechnicalExecption(String message) {
super(message);
}
public UCoinTechnicalExecption(Throwable cause) {
super(cause);
}
}
package io.ucoin.client.core.technical.crypto;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;
import org.apache.commons.codec.binary.Base64;
public class CryptoUtils {
public static byte[] generateKeys(String salt, String password) throws NoSuchAlgorithmException, NoSuchProviderException {
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("EC");
//keyGen.initialize(512);
byte[] publicKey = keyGen.genKeyPair().getPublic().getEncoded();
return encodeBase64(publicKey);
/*.getEncoded();
StringBuilder result = new StringBuilder();
for (int i = 0; i < publicKey.length; ++i) {
result.append(Integer.toHexString(0x0100 + (publicKey[i] & 0x00FF)).substring(1));
}
return encodeBase64(result.toString());*/
}
/**
* Use Ed55219 pattern
* @param data
* @param password
* @param salt
* @param noIterations
* @return
*/
public static byte[] encrypt(byte[] data, char[] password,
byte[] salt, int noIterations) {
try {
String method = "PBEWithMD5AndTripleDES";
SecretKeyFactory kf = SecretKeyFactory.getInstance(method);
PBEKeySpec keySpec = new PBEKeySpec(password);
SecretKey key = kf.generateSecret(keySpec);
Cipher ciph = Cipher.getInstance(method);
PBEParameterSpec params = new PBEParameterSpec(salt, noIterations);
return ciph.doFinal(data);
} catch (Exception e) {
throw new RuntimeException("Spurious encryption error");
}
}
public static byte[] encodeBase64(byte[] data) {
byte[] encodedBytes = Base64.encodeBase64(data);
return encodedBytes;
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment