[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[libeufin] branch master updated: Crockford's base32 decoder, EdDSA publ
From: |
gnunet |
Subject: |
[libeufin] branch master updated: Crockford's base32 decoder, EdDSA public key import. |
Date: |
Sat, 28 Mar 2020 10:49:52 +0100 |
This is an automated email from the git hooks/post-receive script.
marcello pushed a commit to branch master
in repository libeufin.
The following commit(s) were added to refs/heads/master by this push:
new 45d1133 Crockford's base32 decoder, EdDSA public key import.
45d1133 is described below
commit 45d11337f6ae92c592eb4ad96422a5fa9b2a76f2
Author: Marcello Stanisci <address@hidden>
AuthorDate: Sat Mar 28 10:43:19 2020 +0100
Crockford's base32 decoder, EdDSA public key import.
---
util/build.gradle | 3 ++-
util/src/main/kotlin/strings.kt | 24 +++++++++++++++++++++++-
util/src/test/kotlin/CryptoUtilTest.kt | 29 ++++++++++++++++++++++++-----
3 files changed, 49 insertions(+), 7 deletions(-)
diff --git a/util/build.gradle b/util/build.gradle
index 6205339..394342b 100644
--- a/util/build.gradle
+++ b/util/build.gradle
@@ -38,9 +38,10 @@ dependencies {
implementation "javax.activation:activation:1.1"
implementation "org.glassfish.jaxb:jaxb-runtime:2.3.1"
implementation 'org.apache.santuario:xmlsec:2.1.4'
- implementation group: 'org.bouncycastle', name: 'bcprov-jdk16', version:
'1.45'
+ implementation group: 'org.bouncycastle', name: 'bcprov-jdk15on', version:
'1.64'
implementation group: 'org.xerial', name: 'sqlite-jdbc', version: '3.28.0'
implementation group: 'org.apache.commons', name: 'commons-compress',
version: '1.20'
+ implementation("com.msiops.ground:ground-crockford32:0.1")
testImplementation group: 'junit', name: 'junit', version: '4.12'
testImplementation 'org.jetbrains.kotlin:kotlin-test-junit:1.3.50'
diff --git a/util/src/main/kotlin/strings.kt b/util/src/main/kotlin/strings.kt
index d8d5b8d..0092e63 100644
--- a/util/src/main/kotlin/strings.kt
+++ b/util/src/main/kotlin/strings.kt
@@ -1,6 +1,8 @@
package tech.libeufin.util
+import org.apache.commons.codec.binary.Base32
import java.math.BigInteger
import java.util.*
+import com.msiops.ground.crockford32.Crockford32
fun ByteArray.toHexString() : String {
@@ -41,9 +43,29 @@ fun base64ToBytes(encoding: String): ByteArray {
return Base64.getDecoder().decode(encoding)
}
+/**
+ * Crockford's base32 decoding.
+ */
+fun base32ToBytes(encoding: String): ByteArray {
+ val i: BigInteger = Crockford32.decode(encoding)
+ if ((i.bitLength() % 4) != 0) {
+ logger.debug("No extra 4-bits element added (bitLength:
${i.bitLength()})")
+ return i.toByteArray()
+ }
+ val extraByteBlob = i.toByteArray()
+ return Arrays.copyOfRange(extraByteBlob, 1, extraByteBlob.size)
+}
+
+/**
+ * Crockford's base32 encoding.
+ */
+fun bytesToBase32(bytes: ByteArray): String {
+ return Crockford32.encode(BigInteger(bytes))
+}
+
fun BigInteger.toUnsignedHexString(): String {
val signedValue = this.toByteArray()
- require(this.signum() > 0) { "number must be positive"}
+ require(this.signum() > 0) { "number must be positive" }
val start = if (signedValue[0] == 0.toByte()) { 1 } else { 0 }
val bytes = Arrays.copyOfRange(signedValue, start, signedValue.size)
return bytes.toHexString()
diff --git a/util/src/test/kotlin/CryptoUtilTest.kt
b/util/src/test/kotlin/CryptoUtilTest.kt
index a64a942..e3d27ed 100644
--- a/util/src/test/kotlin/CryptoUtilTest.kt
+++ b/util/src/test/kotlin/CryptoUtilTest.kt
@@ -17,18 +17,21 @@
* <http://www.gnu.org/licenses/>
*/
+import org.bouncycastle.asn1.edec.EdECObjectIdentifiers
+import org.bouncycastle.asn1.x509.AlgorithmIdentifier
+import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo
import org.junit.Test
-import tech.libeufin.util.CryptoUtil
-import tech.libeufin.util.decodeHexString
-import tech.libeufin.util.toHexString
-import tech.libeufin.util.toUnsignedHexString
+import tech.libeufin.util.*
import java.math.BigInteger
+import java.security.KeyFactory
import java.security.KeyPairGenerator
+import java.security.Security
import java.security.interfaces.RSAPrivateCrtKey
+import java.security.spec.KeySpec
+import java.security.spec.X509EncodedKeySpec
import javax.crypto.EncryptedPrivateKeyInfo
import kotlin.test.assertEquals
import kotlin.test.assertTrue
-
class CryptoUtilTest {
@Test
@@ -140,4 +143,20 @@ class CryptoUtilTest {
assertEquals(expectedHash.toString(Charsets.UTF_8),
pubHash.toHexString())
}
+
+ @Test
+ fun importEdDSAPublicKeyTest() {
+ val givenEnc = "XZH3P6NF9DSG3BH0C082X38N2RVK1RV2H24KF76028QBKDM24BCG"
+ // import a public key
+ val spki = SubjectPublicKeyInfo(AlgorithmIdentifier(
+ EdECObjectIdentifiers.id_Ed25519),
+ base32ToBytes(givenEnc)
+ )
+ val ks: KeySpec = X509EncodedKeySpec(spki.encoded)
+ val kpg = KeyFactory.getInstance(
+ "EdDSA",
+ org.bouncycastle.jce.provider.BouncyCastleProvider()
+ )
+ kpg.generatePublic(ks)
+ }
}
\ No newline at end of file
--
To stop receiving notification emails like this one, please contact
address@hidden.
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [libeufin] branch master updated: Crockford's base32 decoder, EdDSA public key import.,
gnunet <=