Skip to content

Harden native crypto bridge with security, correctness, and architecture improvements#25

Merged
jaredperreault-okta merged 1 commit into
okta:jp-rn-webcryptofrom
AlexNachbaur:an-rn-webcrypto
Apr 2, 2026
Merged

Harden native crypto bridge with security, correctness, and architecture improvements#25
jaredperreault-okta merged 1 commit into
okta:jp-rn-webcryptofrom
AlexNachbaur:an-rn-webcrypto

Conversation

@AlexNachbaur
Copy link
Copy Markdown

Critical fixes:

  • Fix Android exportKey compilation error (undefined keyPair variable)
  • Fix Android importKey type mismatch (KeyPair vs KeyPairEntry)
  • Fix iOS silent failure in getRandomValues (now calls fatalError on CSPRNG failure)
  • Fix iOS importKey key size calculation (derive from modulus, not DER blob)
  • Fix iOS ASN.1 DER parsing with proper length decoding (replaces hardcoded offsets)
  • Fix iOS hardcoded exponent with parsed value from key data

Security & safety:

  • Eliminate all force-unwrap (as!) casts in iOS via typed KeyEntry struct
  • Add synchronized blocks to all Android keyStore accesses for thread safety
  • Add key usage validation in JS verify() to match WebCrypto spec
  • JS getRandomValues validates returned length matches requested length

Architecture:

  • Migrate bridge serialization from number[]/[NSNumber]/ReadableArray to Base64 strings across all layers (iOS, Android, TypeScript spec, JS polyfill), reducing serialization overhead from ~400% to ~33%
  • Extract iOS RSA DER parsing/construction into standalone RSAKeyUtils.swift for testability
  • Replace Android hand-rolled X.509 DER construction (~60 lines) with platform RSAPublicKeySpec
  • Remove dead code (getCryptoAlg), fix typos, clean up unused parameters

Infrastructure:

  • Fix Jest config (testMatch pattern, setupFiles path, test import paths)
  • Add unit tests for digest, getRandomValues, importKey, verify, and polyfill installation
  • Update mocks to match Base64 bridge interface
  • Remove private:true flag, remove nonexistent ./cpp from files array
  • Update Android SDK defaults to 35

…rectness, and architecture improvements

Critical fixes:
- Fix Android exportKey compilation error (undefined keyPair variable)
- Fix Android importKey type mismatch (KeyPair vs KeyPairEntry)
- Fix iOS silent failure in getRandomValues (now calls fatalError on CSPRNG failure)
- Fix iOS importKey key size calculation (derive from modulus, not DER blob)
- Fix iOS ASN.1 DER parsing with proper length decoding (replaces hardcoded offsets)
- Fix iOS hardcoded exponent with parsed value from key data

Security & safety:
- Eliminate all force-unwrap (as!) casts in iOS via typed KeyEntry struct
- Add synchronized blocks to all Android keyStore accesses for thread safety
- Add key usage validation in JS verify() to match WebCrypto spec
- JS getRandomValues validates returned length matches requested length

Architecture:
- Migrate bridge serialization from number[]/[NSNumber]/ReadableArray to Base64 strings
  across all layers (iOS, Android, TypeScript spec, JS polyfill), reducing serialization
  overhead from ~400% to ~33%
- Extract iOS RSA DER parsing/construction into standalone RSAKeyUtils.swift for testability
- Replace Android hand-rolled X.509 DER construction (~60 lines) with platform RSAPublicKeySpec
- Remove dead code (getCryptoAlg), fix typos, clean up unused parameters

Infrastructure:
- Fix Jest config (testMatch pattern, setupFiles path, test import paths)
- Add unit tests for digest, getRandomValues, importKey, verify, and polyfill installation
- Update mocks to match Base64 bridge interface
- Remove private:true flag, remove nonexistent ./cpp from files array
- Update Android SDK defaults to 35
@jaredperreault-okta jaredperreault-okta merged commit 2fd97ee into okta:jp-rn-webcrypto Apr 2, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants