Files
bsky-social-app/modules/expo-bluesky-oauth-client/ios/JWTUtil.swift
T
Hailey 13607edd43 squash
fix android module name

import fixes

fix some imports

use `@atproto/jwk` over local zod schema

preview oauth client

rename package

alignment

more alignment

database implementation

cleanup some types

alignment

switch implementation for es256

half of `verifyJwt` for android

half of `verifyJwt` for iOS

rm log

`createJwt` android

`createJwt` ios

rm print

cleanup native impl

silence some warnings

reorg, finish web impl

follow the `CryptoImplementation`

move some more things around

normalize some names

rename func

add generate on android

add android dep

rm bool

add alg

better implementation

ios jwk generation

fix index.ts

add `getRandomValues()` on native

web `getRandomValues`

silence ts error for missing crypto on web

add `digest` for web

add `digest`

add module
2024-04-11 22:04:51 -07:00

82 lines
2.5 KiB
Swift

import JOSESwift
class JWTUtil {
static func jsonToPrivateKey(_ jwkString: String) throws -> SecKey? {
guard let jsonData = jwkString.data(using: .utf8),
let jwk = try? JSONDecoder().decode(ECPrivateKey.self, from: jsonData),
let key = try? jwk.converted(to: SecKey.self)
else {
let jsonData = jwkString.data(using: .utf8)!
let jwk = try! JSONDecoder().decode(ECPrivateKey.self, from: jsonData)
// let key = try! jwk.converted(to: SecKey.self)
print("Error creating JWK from JWK string \(jwkString).")
return nil
}
return key
}
static func jsonToPublicKey(_ jwkString: String) throws -> SecKey? {
guard let jsonData = jwkString.data(using: .utf8),
let jwk = try? JSONDecoder().decode(ECPublicKey.self, from: jsonData),
let key = try? jwk.converted(to: SecKey.self)
else {
print("Error creating JWK from JWK string.")
return nil
}
return key
}
static func payloadStringToPayload(_ payloadString: String) -> Payload? {
guard let payloadData = payloadString.data(using: .utf8) else {
print("Error converting payload to data.")
return nil
}
return Payload(payloadData)
}
static func headerStringToPayload(_ headerString: String) -> JWSHeader? {
guard let headerData = headerString.data(using: .utf8) else {
print("Error converting header to data.")
return nil
}
return JWSHeader(headerData)
}
public static func createJwt(_ jwkString: String, header headerString: String, payload payloadString: String) -> String? {
guard let key = try? jsonToPrivateKey(jwkString),
let payload = payloadStringToPayload(payloadString),
let header = headerStringToPayload(headerString)
else
{
return nil
}
let signer = Signer(signingAlgorithm: .ES256, key: key)
guard let signer = signer,
let jws = try? JWS(header: header, payload: payload, signer: signer)
else {
print("Error creating JWS.")
return nil
}
return jws.compactSerializedString
}
public static func verifyJwt(_ jwkString: String, token tokenString: String, options optionsString: String?) -> Bool {
guard let key = try? jsonToPublicKey(jwkString),
let jws = try? JWS(compactSerialization: tokenString),
let verifier = Verifier(verifyingAlgorithm: .ES256, key: key),
let isVerified = try? jws.validate(using: verifier).isValid(for: verifier)
else {
return false
}
return isVerified
}
}