add java api

dev
MITSUNARI Shigeo 9 years ago
parent a3199e913f
commit 9b32ca0a1f
  1. 45
      java/Makefile
  2. 141
      java/MclTest.java
  3. 66
      java/com/herumi/mcl/CipherText.java
  4. 38
      java/com/herumi/mcl/Mcl.java
  5. 51
      java/com/herumi/mcl/MclJNI.java
  6. 86
      java/com/herumi/mcl/PrivateKey.java
  7. 82
      java/com/herumi/mcl/PublicKey.java
  8. 26
      java/com/herumi/mcl/SWIGTYPE_p_bool.java
  9. 147
      java/mcl_if.hpp
  10. 27
      java/mcl_if.i
  11. 7
      test/elgamal_test.cpp

@ -0,0 +1,45 @@
include ../common.mk
ifeq ($(UNAME_S),Darwin)
JAVA_INC=-I/System/Library/Frameworks/JavaVM.framework/Versions/Current/Headers/
LIB_SUF=dylib
else
JAVA_INC=-I/usr/lib/jvm/default-java/include
#JAVA_INC=-I/usr/lib/jvm/java-7-openjdk-amd64/include
LIB_SUF=so
CFLAGS+=-z noexecstack
LIB+=-lrt
endif
CFLAGS+= -shared -fPIC $(JAVA_INC)
PACKAGE_NAME=com.herumi.mcl
PACKAGE_DIR=$(subst .,/,$(PACKAGE_NAME))
TARGET=../bin/mcl_if_wrap.$(LIB_SUF)
JAVA_EXE=cd ../bin && LD_LIBRARY_PATH=./:$(LD_LIBRARY_PATH) java -classpath ../java
all: $(TARGET)
mcl_if_wrap.cxx: mcl_if.i mcl_if.hpp
swig -java -package $(PACKAGE_NAME) -outdir $(PACKAGE_DIR) -c++ -Wall mcl_if.i
$(TARGET): mcl_if_wrap.cxx
$(PRE)$(CXX) $< -o $@ $(CFLAGS) $(LDFLAGS) ../src/fp.cpp ../src/x64.s
%.class: %.java
javac $<
MclTest.class: MclTest.java $(TARGET)
jar:
jar cvf mcl.jar com
test: MclTest.class $(TARGET)
$(JAVA_EXE) MclTest
$(JAVA_EXE) MclTest -e NIST_P192
$(JAVA_EXE) MclTest -e NIST_P256 -h sha256
$(JAVA_EXE) MclTest -e NIST_P384 -h sha384
$(JAVA_EXE) MclTest -e NIST_P521 -h sha512
clean:
rm -rf *.class $(TARGET) $(PACKAGE_DIR)/*.class

@ -0,0 +1,141 @@
import java.io.*;
import com.herumi.mcl.*;
/*
MclTest [ecParam]
ecParam = secp192k1, NIST_P224, ...
hashParam = hash224, hash384, ...
*/
public class MclTest {
static {
System.loadLibrary("mcl_if_wrap");
}
public static void assertEquals(String msg, int x, int y) {
if (x == y) {
System.out.println("OK : " + msg);
} else {
System.out.println("NG : " + msg + ", x = " + x + ", y = " + y);
}
}
public static void assertBool(String msg, boolean b) {
if (b) {
System.out.println("OK : " + msg);
} else {
System.out.println("NG : " + msg);
}
}
public static void main(String argv[]) {
try {
String ecStr = "secp192k1";
String hashStr = "sha224";
for (int i = 0; i < argv.length; i++) {
if (argv[i].equals("-e") && i < argv.length - 1) {
ecStr = argv[i + 1];
i++;
} else
if (argv[i].equals("-h") && i < argv.length - 1) {
hashStr = argv[i + 1];
i++;
}
}
String param = ecStr + " " + hashStr;
System.out.println("param=" + param);
Mcl.SystemInit(param);
String prvStr = "";
String pubStr = "";
{
PrivateKey prv = new PrivateKey();
prv.init();
prvStr = prv.toStr();
PublicKey pub = prv.getPublicKey();
pubStr = pub.toStr();
}
int m = 1234;
CipherText c = new CipherText();
PublicKey pub = new PublicKey();
pub.fromStr(pubStr);
pub.enc(c, m);
PrivateKey prv = new PrivateKey();
prv.fromStr(prvStr);
prv.setCache(0, 60000);
int dec = prv.dec(c);
// verify dec(enc(m)) == m
assertEquals("dec(enc(m)) == m", m, dec);
// verify toStr, fromStr
{
String cStr = c.toStr();
CipherText c2 = new CipherText();
c2.fromStr(cStr);
int dec2 = prv.dec(c2);
assertEquals("fromStr(toStr(CipherText) == CipherText", dec, dec2);
}
// verify dec(enc(str)) == str
pub.enc(c, "1234");
dec = prv.dec(c);
assertEquals("dec(enc(str)) == str", m, dec);
// verify dec(mul(enc(m), 3)) == m * 3
c.mul(3);
m *= 3;
dec = prv.dec(c);
assertEquals("mul(int)", m, dec);
// verify dec(mul(enc(m), "10")) == m * 10
c.mul("10");
m *= 10;
dec = prv.dec(c);
assertEquals("mul(str)", m, dec);
// convert str
{
String s = c.toStr();
CipherText c2 = new CipherText();
c2.fromStr(s);
dec = prv.dec(c);
assertEquals("fromStr", m, dec);
}
// rerandomize
pub.rerandomize(c);
dec = prv.dec(c);
assertEquals("rerandomize", m, dec);
int m2 = 12345;
// verify dec(add(enc(m), m2)) == m + m2
pub.add(c, m2);
m += m2;
dec = prv.dec(c);
assertEquals("pub.add(int)", m, dec);
pub.add(c, "993");
m += 993;
dec = prv.dec(c);
assertEquals("pub.add(str)", m, dec);
// string test
String m3 = "-2000000";
String m4 = "2001234";
CipherText c2 = new CipherText();
SWIGTYPE_p_bool b = Mcl.new_p_bool();
pub.enc(c, m3);
dec = prv.dec(c, b);
assertBool("expect dec fail", !Mcl.p_bool_value(b));
pub.enc(c2, m4);
dec = prv.dec(c2, b);
assertBool("expect dec fail", !Mcl.p_bool_value(b));
c.add(c2); // m3 + m4
dec = prv.dec(c, b);
assertEquals("int add", 1234, dec);
assertBool("expect dec success", Mcl.p_bool_value(b));
Mcl.delete_p_bool(b);
} catch (RuntimeException e) {
System.out.println("unknown exception :" + e);
}
}
}

@ -0,0 +1,66 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
* Version 2.0.11
*
* Do not make changes to this file unless you know what you are doing--modify
* the SWIG interface file instead.
* ----------------------------------------------------------------------------- */
package com.herumi.mcl;
public class CipherText {
private long swigCPtr;
protected boolean swigCMemOwn;
protected CipherText(long cPtr, boolean cMemoryOwn) {
swigCMemOwn = cMemoryOwn;
swigCPtr = cPtr;
}
protected static long getCPtr(CipherText obj) {
return (obj == null) ? 0 : obj.swigCPtr;
}
protected void finalize() {
delete();
}
public synchronized void delete() {
if (swigCPtr != 0) {
if (swigCMemOwn) {
swigCMemOwn = false;
MclJNI.delete_CipherText(swigCPtr);
}
swigCPtr = 0;
}
}
public String toStr() {
return MclJNI.CipherText_toStr(swigCPtr, this);
}
public String toString() {
return MclJNI.CipherText_toString(swigCPtr, this);
}
public void fromStr(String str) {
MclJNI.CipherText_fromStr(swigCPtr, this, str);
}
public void add(CipherText c) {
MclJNI.CipherText_add(swigCPtr, this, CipherText.getCPtr(c), c);
}
public void mul(int m) {
MclJNI.CipherText_mul__SWIG_0(swigCPtr, this, m);
}
public void mul(String str) {
MclJNI.CipherText_mul__SWIG_1(swigCPtr, this, str);
}
public CipherText() {
this(MclJNI.new_CipherText(), true);
}
}

@ -0,0 +1,38 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
* Version 2.0.11
*
* Do not make changes to this file unless you know what you are doing--modify
* the SWIG interface file instead.
* ----------------------------------------------------------------------------- */
package com.herumi.mcl;
public class Mcl {
public static SWIGTYPE_p_bool new_p_bool() {
long cPtr = MclJNI.new_p_bool();
return (cPtr == 0) ? null : new SWIGTYPE_p_bool(cPtr, false);
}
public static SWIGTYPE_p_bool copy_p_bool(boolean value) {
long cPtr = MclJNI.copy_p_bool(value);
return (cPtr == 0) ? null : new SWIGTYPE_p_bool(cPtr, false);
}
public static void delete_p_bool(SWIGTYPE_p_bool obj) {
MclJNI.delete_p_bool(SWIGTYPE_p_bool.getCPtr(obj));
}
public static void p_bool_assign(SWIGTYPE_p_bool obj, boolean value) {
MclJNI.p_bool_assign(SWIGTYPE_p_bool.getCPtr(obj), value);
}
public static boolean p_bool_value(SWIGTYPE_p_bool obj) {
return MclJNI.p_bool_value(SWIGTYPE_p_bool.getCPtr(obj));
}
public static void SystemInit(String param) {
MclJNI.SystemInit(param);
}
}

@ -0,0 +1,51 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
* Version 2.0.11
*
* Do not make changes to this file unless you know what you are doing--modify
* the SWIG interface file instead.
* ----------------------------------------------------------------------------- */
package com.herumi.mcl;
public class MclJNI {
public final static native long new_p_bool();
public final static native long copy_p_bool(boolean jarg1);
public final static native void delete_p_bool(long jarg1);
public final static native void p_bool_assign(long jarg1, boolean jarg2);
public final static native boolean p_bool_value(long jarg1);
public final static native void SystemInit(String jarg1);
public final static native String CipherText_toStr(long jarg1, CipherText jarg1_);
public final static native String CipherText_toString(long jarg1, CipherText jarg1_);
public final static native void CipherText_fromStr(long jarg1, CipherText jarg1_, String jarg2);
public final static native void CipherText_add(long jarg1, CipherText jarg1_, long jarg2, CipherText jarg2_);
public final static native void CipherText_mul__SWIG_0(long jarg1, CipherText jarg1_, int jarg2);
public final static native void CipherText_mul__SWIG_1(long jarg1, CipherText jarg1_, String jarg2);
public final static native long new_CipherText();
public final static native void delete_CipherText(long jarg1);
public final static native String PublicKey_toStr(long jarg1, PublicKey jarg1_);
public final static native String PublicKey_toString(long jarg1, PublicKey jarg1_);
public final static native void PublicKey_fromStr(long jarg1, PublicKey jarg1_, String jarg2);
public final static native void PublicKey_save(long jarg1, PublicKey jarg1_, String jarg2);
public final static native void PublicKey_load(long jarg1, PublicKey jarg1_, String jarg2);
public final static native void PublicKey_enc__SWIG_0(long jarg1, PublicKey jarg1_, long jarg2, CipherText jarg2_, int jarg3);
public final static native void PublicKey_enc__SWIG_1(long jarg1, PublicKey jarg1_, long jarg2, CipherText jarg2_, String jarg3);
public final static native void PublicKey_rerandomize(long jarg1, PublicKey jarg1_, long jarg2, CipherText jarg2_);
public final static native void PublicKey_add__SWIG_0(long jarg1, PublicKey jarg1_, long jarg2, CipherText jarg2_, int jarg3);
public final static native void PublicKey_add__SWIG_1(long jarg1, PublicKey jarg1_, long jarg2, CipherText jarg2_, String jarg3);
public final static native long new_PublicKey();
public final static native void delete_PublicKey(long jarg1);
public final static native String PrivateKey_toStr(long jarg1, PrivateKey jarg1_);
public final static native String PrivateKey_toString(long jarg1, PrivateKey jarg1_);
public final static native void PrivateKey_fromStr(long jarg1, PrivateKey jarg1_, String jarg2);
public final static native void PrivateKey_save(long jarg1, PrivateKey jarg1_, String jarg2);
public final static native void PrivateKey_load(long jarg1, PrivateKey jarg1_, String jarg2);
public final static native void PrivateKey_init(long jarg1, PrivateKey jarg1_);
public final static native long PrivateKey_getPublicKey(long jarg1, PrivateKey jarg1_);
public final static native int PrivateKey_dec__SWIG_0(long jarg1, PrivateKey jarg1_, long jarg2, CipherText jarg2_, long jarg3);
public final static native int PrivateKey_dec__SWIG_1(long jarg1, PrivateKey jarg1_, long jarg2, CipherText jarg2_);
public final static native void PrivateKey_setCache(long jarg1, PrivateKey jarg1_, int jarg2, int jarg3);
public final static native void PrivateKey_clearCache(long jarg1, PrivateKey jarg1_);
public final static native long new_PrivateKey();
public final static native void delete_PrivateKey(long jarg1);
}

@ -0,0 +1,86 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
* Version 2.0.11
*
* Do not make changes to this file unless you know what you are doing--modify
* the SWIG interface file instead.
* ----------------------------------------------------------------------------- */
package com.herumi.mcl;
public class PrivateKey {
private long swigCPtr;
protected boolean swigCMemOwn;
protected PrivateKey(long cPtr, boolean cMemoryOwn) {
swigCMemOwn = cMemoryOwn;
swigCPtr = cPtr;
}
protected static long getCPtr(PrivateKey obj) {
return (obj == null) ? 0 : obj.swigCPtr;
}
protected void finalize() {
delete();
}
public synchronized void delete() {
if (swigCPtr != 0) {
if (swigCMemOwn) {
swigCMemOwn = false;
MclJNI.delete_PrivateKey(swigCPtr);
}
swigCPtr = 0;
}
}
public String toStr() {
return MclJNI.PrivateKey_toStr(swigCPtr, this);
}
public String toString() {
return MclJNI.PrivateKey_toString(swigCPtr, this);
}
public void fromStr(String str) {
MclJNI.PrivateKey_fromStr(swigCPtr, this, str);
}
public void save(String fileName) {
MclJNI.PrivateKey_save(swigCPtr, this, fileName);
}
public void load(String fileName) {
MclJNI.PrivateKey_load(swigCPtr, this, fileName);
}
public void init() {
MclJNI.PrivateKey_init(swigCPtr, this);
}
public PublicKey getPublicKey() {
return new PublicKey(MclJNI.PrivateKey_getPublicKey(swigCPtr, this), true);
}
public int dec(CipherText c, SWIGTYPE_p_bool b) {
return MclJNI.PrivateKey_dec__SWIG_0(swigCPtr, this, CipherText.getCPtr(c), c, SWIGTYPE_p_bool.getCPtr(b));
}
public int dec(CipherText c) {
return MclJNI.PrivateKey_dec__SWIG_1(swigCPtr, this, CipherText.getCPtr(c), c);
}
public void setCache(int rangeMin, int rangeMax) {
MclJNI.PrivateKey_setCache(swigCPtr, this, rangeMin, rangeMax);
}
public void clearCache() {
MclJNI.PrivateKey_clearCache(swigCPtr, this);
}
public PrivateKey() {
this(MclJNI.new_PrivateKey(), true);
}
}

@ -0,0 +1,82 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
* Version 2.0.11
*
* Do not make changes to this file unless you know what you are doing--modify
* the SWIG interface file instead.
* ----------------------------------------------------------------------------- */
package com.herumi.mcl;
public class PublicKey {
private long swigCPtr;
protected boolean swigCMemOwn;
protected PublicKey(long cPtr, boolean cMemoryOwn) {
swigCMemOwn = cMemoryOwn;
swigCPtr = cPtr;
}
protected static long getCPtr(PublicKey obj) {
return (obj == null) ? 0 : obj.swigCPtr;
}
protected void finalize() {
delete();
}
public synchronized void delete() {
if (swigCPtr != 0) {
if (swigCMemOwn) {
swigCMemOwn = false;
MclJNI.delete_PublicKey(swigCPtr);
}
swigCPtr = 0;
}
}
public String toStr() {
return MclJNI.PublicKey_toStr(swigCPtr, this);
}
public String toString() {
return MclJNI.PublicKey_toString(swigCPtr, this);
}
public void fromStr(String str) {
MclJNI.PublicKey_fromStr(swigCPtr, this, str);
}
public void save(String fileName) {
MclJNI.PublicKey_save(swigCPtr, this, fileName);
}
public void load(String fileName) {
MclJNI.PublicKey_load(swigCPtr, this, fileName);
}
public void enc(CipherText c, int m) {
MclJNI.PublicKey_enc__SWIG_0(swigCPtr, this, CipherText.getCPtr(c), c, m);
}
public void enc(CipherText c, String str) {
MclJNI.PublicKey_enc__SWIG_1(swigCPtr, this, CipherText.getCPtr(c), c, str);
}
public void rerandomize(CipherText c) {
MclJNI.PublicKey_rerandomize(swigCPtr, this, CipherText.getCPtr(c), c);
}
public void add(CipherText c, int m) {
MclJNI.PublicKey_add__SWIG_0(swigCPtr, this, CipherText.getCPtr(c), c, m);
}
public void add(CipherText c, String str) {
MclJNI.PublicKey_add__SWIG_1(swigCPtr, this, CipherText.getCPtr(c), c, str);
}
public PublicKey() {
this(MclJNI.new_PublicKey(), true);
}
}

@ -0,0 +1,26 @@
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
* Version 2.0.11
*
* Do not make changes to this file unless you know what you are doing--modify
* the SWIG interface file instead.
* ----------------------------------------------------------------------------- */
package com.herumi.mcl;
public class SWIGTYPE_p_bool {
private long swigCPtr;
protected SWIGTYPE_p_bool(long cPtr, boolean futureUse) {
swigCPtr = cPtr;
}
protected SWIGTYPE_p_bool() {
swigCPtr = 0;
}
protected static long getCPtr(SWIGTYPE_p_bool obj) {
return (obj == null) ? 0 : obj.swigCPtr;
}
}

@ -0,0 +1,147 @@
#pragma once
//#define MCL_MAX_OP_BIT_SIZE 521
#include <iostream>
#include <fstream>
#include <cybozu/random_generator.hpp>
#include <cybozu/crypto.hpp>
#include <mcl/fp.hpp>
#include <mcl/ecparam.hpp>
#include <mcl/elgamal.hpp>
typedef mcl::FpT<mcl::FpTag> Fp;
typedef mcl::FpT<mcl::ZnTag> Zn;
typedef mcl::EcT<Fp> Ec;
typedef mcl::ElgamalT<Ec, Zn> Elgamal;
/*
init system
@param param [in] string such as "ecParamName hashName"
@note NOT thread safe because setting global parameters of elliptic curve
ex1) "secp192k1 sha256" // 192bit security + sha256
ex2) "secp160k1 sha1" // 160bit security + sha1
hashName : sha1 sha224 sha256 sha384 sha512
*/
void SystemInit(const std::string& param) throw(std::exception)
{
std::istringstream iss(param);
std::string ecParamStr;
std::string hashNameStr;
if (iss >> ecParamStr >> hashNameStr) {
Param& p = Param::getParam();
p.ecParam = mcl::getEcParam(ecParamStr);
Zn::setModulo(p.ecParam->n);
Fp::setModulo(p.ecParam->p);
Ec::setParam(p.ecParam->a, p.ecParam->b);
p.hashName = cybozu::crypto::Hash::getName(hashNameStr);
return;
}
throw cybozu::Exception("SystemInit:bad param") << param;
}
class CipherText {
Elgamal::CipherText self_;
friend class PublicKey;
friend class PrivateKey;
public:
std::string toStr() const throw(std::exception) { return self_.toStr(); }
std::string toString() const throw(std::exception) { return toStr(); }
void fromStr(const std::string& str) throw(std::exception) { self_.fromStr(str); }
void add(const CipherText& c) throw(std::exception) { self_.add(c.self_); }
void mul(int m) throw(std::exception)
{
self_.mul(m);
}
void mul(const std::string& str) throw(std::exception)
{
Zn zn(str);
self_.mul(zn);
}
};
class PublicKey {
Elgamal::PublicKey self_;
friend class PrivateKey;
public:
std::string toStr() const throw(std::exception) { return self_.toStr(); }
std::string toString() const throw(std::exception) { return toStr(); }
void fromStr(const std::string& str) throw(std::exception) { self_.fromStr(str); }
void save(const std::string& fileName) const throw(std::exception)
{
std::ofstream ofs(fileName.c_str(), std::ios::binary);
if (!(ofs << self_)) throw cybozu::Exception("PublicKey:save") << fileName;
}
void load(const std::string& fileName) throw(std::exception)
{
std::ifstream ifs(fileName.c_str(), std::ios::binary);
if (!(ifs >> self_)) throw cybozu::Exception("PublicKey:load") << fileName;
}
void enc(CipherText& c, int m) const throw(std::exception)
{
self_.enc(c.self_, m, Param::getParam().rg);
}
void enc(CipherText& c, const std::string& str) const throw(std::exception)
{
Zn zn(str);
self_.enc(c.self_, zn, Param::getParam().rg);
}
void rerandomize(CipherText& c) const throw(std::exception)
{
self_.rerandomize(c.self_, Param::getParam().rg);
}
void add(CipherText& c, int m) const throw(std::exception)
{
self_.add(c.self_, m);
}
void add(CipherText& c, const std::string& str) const throw(std::exception)
{
Zn zn(str);
self_.add(c.self_, zn);
}
};
class PrivateKey {
Elgamal::PrivateKey self_;
public:
std::string toStr() const throw(std::exception) { return self_.toStr(); }
std::string toString() const throw(std::exception) { return toStr(); }
void fromStr(const std::string& str) throw(std::exception) { self_.fromStr(str); }
void save(const std::string& fileName) const throw(std::exception)
{
std::ofstream ofs(fileName.c_str(), std::ios::binary);
if (!(ofs << self_)) throw cybozu::Exception("PrivateKey:save") << fileName;
}
void load(const std::string& fileName) throw(std::exception)
{
std::ifstream ifs(fileName.c_str(), std::ios::binary);
if (!(ifs >> self_)) throw cybozu::Exception("PrivateKey:load") << fileName;
}
void init() throw(std::exception)
{
Param& p = Param::getParam();
const Fp x0(p.ecParam->gx);
const Fp y0(p.ecParam->gy);
Ec P(x0, y0);
self_.init(P, Zn::getBitSize(), p.rg);
}
PublicKey getPublicKey() const throw(std::exception)
{
PublicKey ret;
ret.self_ = self_.getPublicKey();
return ret;
}
int dec(const CipherText& c, bool *b = 0) const throw(std::exception)
{
return self_.dec(c.self_, b);
}
void setCache(int rangeMin, int rangeMax) throw(std::exception)
{
self_.setCache(rangeMin, rangeMax);
}
void clearCache() throw(std::exception)
{
self_.clearCache();
}
};

@ -0,0 +1,27 @@
%module Mcl
%include "std_string.i"
%include "std_except.i"
%{
#include <cybozu/random_generator.hpp>
#include <cybozu/crypto.hpp>
#include <mcl/ecparam.hpp>
struct Param {
const mcl::EcParam *ecParam;
cybozu::RandomGenerator rg;
cybozu::crypto::Hash::Name hashName;
static inline Param& getParam()
{
static Param p;
return p;
}
};
#include "mcl_if.hpp"
%}
%include cpointer.i
%pointer_functions(bool, p_bool);
%include "mcl_if.hpp"

@ -1,10 +1,9 @@
#include <cybozu/test.hpp>
#include <mcl/fp.hpp>
#include <mcl/gmp_util.hpp>
#include <mcl/elgamal.hpp>
#include <cybozu/random_generator.hpp>
#include <mcl/ecparam.hpp>
#include <cybozu/crypto.hpp>
#include <mcl/fp.hpp>
#include <mcl/ecparam.hpp>
#include <mcl/elgamal.hpp>
struct TagZn;
typedef mcl::FpT<> Fp;

Loading…
Cancel
Save