this repo has no description
1import Foundation 2import CryptoKit 3import JOSESwift 4 5class CryptoUtil: NSObject { 6 static func digest(data: Data) -> Data { 7 let hash = SHA256.hash(data: data) 8 return Data(hash) 9 } 10 11 public static func getRandomValues(byteLength: Int) -> Data { 12 let bytes = (0..<byteLength).map { _ in UInt8.random(in: UInt8.min...UInt8.max) } 13 return Data(bytes) 14 } 15 16 static func generateJwk() -> JWK { 17 let kid = UUID().uuidString 18 19 let privKey = P256.Signing.PrivateKey() 20 let pubKey = privKey.publicKey 21 22 let x = pubKey.x963Representation[1..<33].base64URLEncodedString() 23 let y = pubKey.x963Representation[33...].base64URLEncodedString() 24 let d = privKey.rawRepresentation.base64URLEncodedString() 25 26 let jwk = JWK() 27 jwk.kty = "EC" 28 jwk.use = "sig" 29 jwk.crv = "P-256" 30 jwk.kid = kid 31 jwk.x = x 32 jwk.y = y 33 jwk.d = d 34 jwk.alg = "ES256" 35 36 return jwk 37 } 38 39 static func importJwk(x: String, y: String, d: String) throws -> SecKey { 40 func base64UrlDecode(_ string: String) -> Data? { 41 var base64 = string 42 .replacingOccurrences(of: "-", with: "+") 43 .replacingOccurrences(of: "_", with: "/") 44 45 let remainder = base64.count % 4 46 if remainder > 0 { 47 base64 += String(repeating: "=", count: 4 - remainder) 48 } 49 50 return Data(base64Encoded: base64) 51 } 52 53 guard let xData = base64UrlDecode(x), 54 let yData = base64UrlDecode(y), 55 let dData = base64UrlDecode(d) else { 56 throw ExpoAtprotoAuthError.invalidJwk 57 } 58 59 var keyData = Data() 60 keyData.append(0x04) 61 keyData.append(xData) 62 keyData.append(yData) 63 keyData.append(dData) 64 65 let attributes: [String: Any] = [ 66 kSecAttrKeyType as String: kSecAttrKeyTypeEC, 67 kSecAttrKeyClass as String: kSecAttrKeyClassPrivate, 68 kSecAttrKeySizeInBits as String: 256 69 ] 70 71 var error: Unmanaged<CFError>? 72 73 let key = SecKeyCreateWithData(keyData as CFData, attributes as CFDictionary, &error) 74 if error != nil { 75 throw error!.takeUnretainedValue() 76 } 77 78 guard let key = key else { 79 throw ExpoAtprotoAuthError.invalidJwk 80 } 81 82 return key 83 } 84}