Attention une mise à jour du service Gitlab va être effectuée le mardi 30 novembre entre 17h30 et 18h00. Cette mise à jour va générer une interruption du service dont nous ne maîtrisons pas complètement la durée mais qui ne devrait pas excéder quelques minutes. Cette mise à jour intermédiaire en version 14.0.12 nous permettra de rapidement pouvoir mettre à votre disposition une version plus récente.

Commit 4eb201cb authored by stopcovid@lunabee.com's avatar stopcovid@lunabee.com
Browse files

Update to 3.0.2

- Fix signature verification
parent b7ca3f0e
...@@ -3,7 +3,11 @@ package com.lunabeestudio.framework.crypto ...@@ -3,7 +3,11 @@ package com.lunabeestudio.framework.crypto
import android.util.Base64 import android.util.Base64
import com.lunabeestudio.framework.extension.removePublicKeyDecoration import com.lunabeestudio.framework.extension.removePublicKeyDecoration
import org.apache.commons.codec.binary.Base32 import org.apache.commons.codec.binary.Base32
import org.bouncycastle.asn1.ASN1EncodableVector
import org.bouncycastle.asn1.ASN1Integer
import org.bouncycastle.asn1.DERSequence
import org.bouncycastle.jce.provider.BouncyCastleProvider import org.bouncycastle.jce.provider.BouncyCastleProvider
import java.math.BigInteger
import java.nio.charset.StandardCharsets import java.nio.charset.StandardCharsets
import java.security.KeyFactory import java.security.KeyFactory
import java.security.PublicKey import java.security.PublicKey
...@@ -40,25 +44,26 @@ object BouncyCastleSignatureVerifier { ...@@ -40,25 +44,26 @@ object BouncyCastleSignatureVerifier {
val ecdsaVerify: Signature = Signature.getInstance(signatureKeyAlgorithm) val ecdsaVerify: Signature = Signature.getInstance(signatureKeyAlgorithm)
val rawMessage = message.toByteArray(StandardCharsets.US_ASCII) val rawMessage = message.toByteArray(StandardCharsets.US_ASCII)
val decodedSignature = Base32().decode(rawSignature)
val derSequence = getDERSequenceFromSignature(decodedSignature)
ecdsaVerify.initVerify(publicKey) ecdsaVerify.initVerify(publicKey)
ecdsaVerify.update(rawMessage) ecdsaVerify.update(rawMessage)
val decodedSignature = Base32().decode(rawSignature) return ecdsaVerify.verify(derSequence.encoded)
}
private fun getDERSequenceFromSignature(decodedSignature: ByteArray): DERSequence {
val length = decodedSignature.size / 2
val bytes = ByteArray(length)
val asn1EncodableVector = ASN1EncodableVector()
var r = decodedSignature.take(decodedSignature.size / 2).toByteArray() System.arraycopy(decodedSignature, 0, bytes, 0, length)
var s = decodedSignature.takeLast(decodedSignature.size / 2).toByteArray() asn1EncodableVector.add(ASN1Integer(BigInteger(1, bytes)))
// DER encoding System.arraycopy(decodedSignature, length, bytes, 0, length)
if (r.first() < 0x00) { asn1EncodableVector.add(ASN1Integer(BigInteger(1, bytes)))
r = byteArrayOf(0x00) + r
}
if (s.first() < 0x00) {
s = byteArrayOf(0x00) + s
}
val rs = byteArrayOf(0x02, r.size.toByte()) + r + byteArrayOf(0x02, s.size.toByte()) + s
val derSignature = byteArrayOf(0x30, (rs.size).toByte()) + rs
return ecdsaVerify.verify(derSignature) return DERSequence(asn1EncodableVector)
} }
} }
\ No newline at end of file
...@@ -43,8 +43,8 @@ android { ...@@ -43,8 +43,8 @@ android {
applicationId "fr.gouv.android.stopcovid" applicationId "fr.gouv.android.stopcovid"
minSdkVersion 21 minSdkVersion 21
targetSdkVersion 30 targetSdkVersion 30
versionCode 230 versionCode 232
versionName "3.0.1" versionName "3.0.2"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment