expo-updates 58.0.19 → 58.0.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 58.0.20
4
+
5
+ ### Patch Changes
6
+
7
+ - Remove the BouncyCastle dependency on Android. ([#52379](https://github.com/expo/expo/pull/52379) by [@lukmccall](https://github.com/lukmccall))
8
+
3
9
  ## 58.0.19
4
10
 
5
11
  ### Patch Changes
@@ -42,7 +42,7 @@ expoModule {
42
42
  }
43
43
 
44
44
  group = 'host.exp.exponent'
45
- version = '58.0.19'
45
+ version = '58.0.20'
46
46
 
47
47
  // Utility method to derive boolean values from the environment or from Java properties,
48
48
  // and return them as strings to be used in BuildConfig fields
@@ -103,7 +103,7 @@ android {
103
103
  namespace "expo.modules.updates"
104
104
  defaultConfig {
105
105
  versionCode 31
106
- versionName '58.0.19'
106
+ versionName '58.0.20'
107
107
  consumerProguardFiles("proguard-rules.pro")
108
108
  testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
109
109
 
@@ -176,7 +176,6 @@ dependencies {
176
176
  implementation("com.squareup.okhttp3:okhttp-urlconnection:4.9.2")
177
177
  implementation("com.squareup.zstd:zstd-kmp-okio:0.4.0")
178
178
  implementation("org.brotli:dec:0.1.2")
179
- implementation("org.bouncycastle:bcutil-jdk15to18:1.81")
180
179
 
181
180
  compileOnly 'com.facebook.fbjni:fbjni:0.3.0'
182
181
 
@@ -1,7 +1,5 @@
1
1
  package expo.modules.updates.codesigning
2
2
 
3
- import org.bouncycastle.asn1.ASN1Primitive
4
- import org.bouncycastle.asn1.DEROctetString
5
3
  import java.security.cert.CertificateException
6
4
  import java.security.cert.CertificateFactory
7
5
  import java.security.cert.X509Certificate
@@ -13,6 +11,8 @@ private const val CODE_SIGNING_OID = "1.3.6.1.5.5.7.3.3"
13
11
  // OID of expo project info, stored as `<projectId>,<scopeKey>`
14
12
  private const val EXPO_PROJECT_INFORMATION_OID = "1.2.840.113556.1.8000.2554.43437.254.128.102.157.7894389.20439.2.1"
15
13
 
14
+ private const val DER_OCTET_STRING_TAG = 0x04
15
+
16
16
  data class ExpoProjectInformation(val projectId: String, val scopeKey: String)
17
17
 
18
18
  /**
@@ -60,13 +60,7 @@ class CertificateChain(private val certificateStrings: List<String>) {
60
60
 
61
61
  fun X509Certificate.expoProjectInformation(): ExpoProjectInformation? {
62
62
  return getExtensionValue(EXPO_PROJECT_INFORMATION_OID)?.let {
63
- ASN1Primitive.fromByteArray(it)
64
- }?.let {
65
- if (it is DEROctetString) {
66
- it.octets.decodeToString()
67
- } else {
68
- null
69
- }
63
+ decodeDerOctetString(it).decodeToString()
70
64
  }?.let {
71
65
  val components = it.split(',').map { component -> component.trim() }
72
66
  if (components.size != 2) {
@@ -76,6 +70,38 @@ class CertificateChain(private val certificateStrings: List<String>) {
76
70
  }
77
71
  }
78
72
 
73
+ /**
74
+ * Returns the contents of the DER-encoded OCTET STRING.
75
+ * Throws for any other input, so that a malformed extension never reads as a missing one.
76
+ */
77
+ private fun decodeDerOctetString(der: ByteArray): ByteArray {
78
+ val invalid = { throw CertificateException("Invalid Expo project information extension value") }
79
+
80
+ val input = der.inputStream()
81
+ if (input.read() != DER_OCTET_STRING_TAG) {
82
+ invalid()
83
+ }
84
+ var length = input.read()
85
+ // Long form: 0x81-0x83 means that the next 1-3 bytes hold the length.
86
+ if (length >= 0x80) {
87
+ val lengthByteCount = length - 0x80
88
+ if (lengthByteCount !in 1..3 || input.available() < lengthByteCount) {
89
+ invalid()
90
+ }
91
+
92
+ length = 0
93
+ repeat(lengthByteCount) {
94
+ length = (length shl 8) or input.read()
95
+ }
96
+ }
97
+
98
+ if (length != input.available()) {
99
+ invalid()
100
+ }
101
+
102
+ return input.readBytes()
103
+ }
104
+
79
105
  private fun X509Certificate.isCACertificate(): Boolean {
80
106
  return basicConstraints > -1 && keyUsage != null && keyUsage.isNotEmpty() && keyUsage[5]
81
107
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "expo-updates",
3
- "version": "58.0.19",
3
+ "version": "58.0.20",
4
4
  "description": "Fetches and manages remotely-hosted assets and updates to your app's JS bundle.",
5
5
  "keywords": [
6
6
  "expo",
@@ -65,7 +65,7 @@
65
65
  },
66
66
  "devDependencies": {
67
67
  "@expo/internal-scripts": "58.0.5",
68
- "@expo/metro-config": "58.0.19",
68
+ "@expo/metro-config": "58.0.20",
69
69
  "@testing-library/react-native": "^14.0.1",
70
70
  "@types/debug": "^4.1.7",
71
71
  "@types/getenv": "^1.0.3",
@@ -75,7 +75,7 @@
75
75
  "@types/picomatch": "^4.0.0",
76
76
  "@types/react": "~19.3.0",
77
77
  "@vercel/ncc": "^0.38.4",
78
- "expo-dev-client": "58.0.17",
78
+ "expo-dev-client": "58.0.18",
79
79
  "express": "^5.1.0",
80
80
  "form-data": "^4.0.4",
81
81
  "memfs": "^3.6.0",