Skip to content

Commit 32fdf4f

Browse files
authored
Merge pull request #15007 from geoffw0/sensitivekeytests
Swift: Add some tests and model SecKeyCopyExternalRepresentation
2 parents 3431fcf + 028326a commit 32fdf4f

File tree

9 files changed

+221
-46
lines changed

9 files changed

+221
-46
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
category: minorAnalysis
3+
---
4+
* Added a sensitive data model for `SecKeyCopyExternalRepresentation`.
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
/**
2+
* Provides models for standard library Swift classses related to security
3+
* (certificate, key and trust services).
4+
*/
5+
6+
import swift
7+
private import codeql.swift.dataflow.ExternalFlow
8+
9+
private class SensitiveSources extends SourceModelCsv {
10+
override predicate row(string row) {
11+
row = ";;false;SecKeyCopyExternalRepresentation(_:_:);;;ReturnValue;sensitive-credential"
12+
}
13+
}

swift/ql/lib/codeql/swift/frameworks/StandardLibrary/StandardLibrary.qll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ private import NsUrl
1919
private import Numeric
2020
private import RawRepresentable
2121
private import PointerTypes
22+
private import Security
2223
private import Sequence
2324
private import Set
2425
private import Stream

swift/ql/lib/codeql/swift/security/SensitiveExprs.qll

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
import swift
88
import internal.SensitiveDataHeuristics
9+
private import codeql.swift.dataflow.DataFlow
10+
private import codeql.swift.dataflow.ExternalFlow
911

1012
private newtype TSensitiveDataType =
1113
TCredential() or
@@ -172,6 +174,18 @@ class SensitiveExpr extends Expr {
172174
) and
173175
// do not mark as sensitive it if it is probably safe
174176
not label.regexpMatch(regexpProbablySafe())
177+
or
178+
(
179+
// modeled sensitive credential
180+
sourceNode(DataFlow::exprNode(this), "sensitive-credential") and
181+
sensitiveType = TCredential() and
182+
label = "credential"
183+
or
184+
// modeled sensitive private information
185+
sourceNode(DataFlow::exprNode(this), "sensitive-private-info") and
186+
sensitiveType = TPrivateInfo() and
187+
label = "private information"
188+
)
175189
}
176190

177191
/**

swift/ql/test/query-tests/Security/CWE-311/CleartextStorageDatabase.expected

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -555,6 +555,8 @@ nodes
555555
| testCoreData.swift:95:15:95:15 | x | semmle.label | x |
556556
| testCoreData.swift:96:15:96:15 | y | semmle.label | y |
557557
| testCoreData.swift:97:15:97:15 | z | semmle.label | z |
558+
| testCoreData.swift:128:15:128:33 | call to generateSecretKey() | semmle.label | call to generateSecretKey() |
559+
| testCoreData.swift:129:15:129:30 | call to getCertificate() | semmle.label | call to getCertificate() |
558560
| testGRDB.swift:73:56:73:65 | [...] | semmle.label | [...] |
559561
| testGRDB.swift:73:56:73:65 | [...] [Collection element] | semmle.label | [...] [Collection element] |
560562
| testGRDB.swift:73:57:73:57 | password | semmle.label | password |
@@ -825,6 +827,8 @@ subpaths
825827
| testCoreData.swift:95:15:95:15 | x | testCoreData.swift:91:10:91:10 | passwd | testCoreData.swift:95:15:95:15 | x | This operation stores 'x' in a database. It may contain unencrypted sensitive data from $@. | testCoreData.swift:91:10:91:10 | passwd | passwd |
826828
| testCoreData.swift:96:15:96:15 | y | testCoreData.swift:92:10:92:10 | passwd | testCoreData.swift:96:15:96:15 | y | This operation stores 'y' in a database. It may contain unencrypted sensitive data from $@. | testCoreData.swift:92:10:92:10 | passwd | passwd |
827829
| testCoreData.swift:97:15:97:15 | z | testCoreData.swift:93:10:93:10 | passwd | testCoreData.swift:97:15:97:15 | z | This operation stores 'z' in a database. It may contain unencrypted sensitive data from $@. | testCoreData.swift:93:10:93:10 | passwd | passwd |
830+
| testCoreData.swift:128:15:128:33 | call to generateSecretKey() | testCoreData.swift:128:15:128:33 | call to generateSecretKey() | testCoreData.swift:128:15:128:33 | call to generateSecretKey() | This operation stores 'call to generateSecretKey()' in a database. It may contain unencrypted sensitive data from $@. | testCoreData.swift:128:15:128:33 | call to generateSecretKey() | call to generateSecretKey() |
831+
| testCoreData.swift:129:15:129:30 | call to getCertificate() | testCoreData.swift:129:15:129:30 | call to getCertificate() | testCoreData.swift:129:15:129:30 | call to getCertificate() | This operation stores 'call to getCertificate()' in a database. It may contain unencrypted sensitive data from $@. | testCoreData.swift:129:15:129:30 | call to getCertificate() | call to getCertificate() |
828832
| testGRDB.swift:73:56:73:65 | [...] | testGRDB.swift:73:57:73:57 | password | testGRDB.swift:73:56:73:65 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:73:57:73:57 | password | password |
829833
| testGRDB.swift:76:42:76:51 | [...] | testGRDB.swift:76:43:76:43 | password | testGRDB.swift:76:42:76:51 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:76:43:76:43 | password | password |
830834
| testGRDB.swift:81:44:81:53 | [...] | testGRDB.swift:81:45:81:45 | password | testGRDB.swift:81:44:81:53 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:81:45:81:45 | password | password |

swift/ql/test/query-tests/Security/CWE-311/CleartextTransmission.expected

Lines changed: 50 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,20 @@ edges
1414
| testSend.swift:86:7:86:7 | self | file://:0:0:0:0 | self |
1515
| testSend.swift:94:27:94:30 | .password | testSend.swift:86:7:86:7 | self |
1616
| testSend.swift:94:27:94:30 | .password | testSend.swift:94:27:94:39 | .value |
17-
| testURL.swift:17:54:17:54 | passwd | testURL.swift:17:22:17:54 | ... .+(_:_:) ... |
18-
| testURL.swift:19:55:19:55 | account_no | testURL.swift:19:22:19:55 | ... .+(_:_:) ... |
19-
| testURL.swift:20:55:20:55 | credit_card_no | testURL.swift:20:22:20:55 | ... .+(_:_:) ... |
20-
| testURL.swift:28:55:28:55 | e_mail | testURL.swift:28:22:28:55 | ... .+(_:_:) ... |
21-
| testURL.swift:30:57:30:57 | a_homeaddr_z | testURL.swift:30:22:30:57 | ... .+(_:_:) ... |
22-
| testURL.swift:32:55:32:55 | resident_ID | testURL.swift:32:22:32:55 | ... .+(_:_:) ... |
17+
| testURL.swift:39:50:39:50 | passwd | testURL.swift:39:18:39:50 | ... .+(_:_:) ... |
18+
| testURL.swift:41:51:41:51 | account_no | testURL.swift:41:18:41:51 | ... .+(_:_:) ... |
19+
| testURL.swift:42:51:42:51 | credit_card_no | testURL.swift:42:18:42:51 | ... .+(_:_:) ... |
20+
| testURL.swift:50:51:50:51 | e_mail | testURL.swift:50:18:50:51 | ... .+(_:_:) ... |
21+
| testURL.swift:52:53:52:53 | a_homeaddr_z | testURL.swift:52:18:52:53 | ... .+(_:_:) ... |
22+
| testURL.swift:54:51:54:51 | resident_ID | testURL.swift:54:18:54:51 | ... .+(_:_:) ... |
23+
| testURL.swift:73:52:73:67 | call to get_secret_key() | testURL.swift:73:18:73:67 | ... .+(_:_:) ... |
24+
| testURL.swift:75:53:75:69 | call to get_cert_string() | testURL.swift:75:18:75:69 | ... .+(_:_:) ... |
25+
| testURL.swift:96:51:96:51 | certificate | testURL.swift:96:18:96:18 | "..." |
26+
| testURL.swift:104:16:104:57 | call to SecKeyCopyExternalRepresentation(_:_:) | testURL.swift:105:32:105:32 | data |
27+
| testURL.swift:105:6:105:10 | let ...? [some:0] | testURL.swift:105:10:105:10 | string |
28+
| testURL.swift:105:10:105:10 | string | testURL.swift:106:20:106:20 | "..." |
29+
| testURL.swift:105:19:105:53 | call to String.init(data:encoding:) [some:0] | testURL.swift:105:6:105:10 | let ...? [some:0] |
30+
| testURL.swift:105:32:105:32 | data | testURL.swift:105:19:105:53 | call to String.init(data:encoding:) [some:0] |
2331
nodes
2432
| file://:0:0:0:0 | .value | semmle.label | .value |
2533
| file://:0:0:0:0 | self | semmle.label | self |
@@ -52,19 +60,31 @@ nodes
5260
| testSend.swift:86:7:86:7 | self | semmle.label | self |
5361
| testSend.swift:94:27:94:30 | .password | semmle.label | .password |
5462
| testSend.swift:94:27:94:39 | .value | semmle.label | .value |
55-
| testURL.swift:17:22:17:54 | ... .+(_:_:) ... | semmle.label | ... .+(_:_:) ... |
56-
| testURL.swift:17:54:17:54 | passwd | semmle.label | passwd |
57-
| testURL.swift:19:22:19:55 | ... .+(_:_:) ... | semmle.label | ... .+(_:_:) ... |
58-
| testURL.swift:19:55:19:55 | account_no | semmle.label | account_no |
59-
| testURL.swift:20:22:20:55 | ... .+(_:_:) ... | semmle.label | ... .+(_:_:) ... |
60-
| testURL.swift:20:55:20:55 | credit_card_no | semmle.label | credit_card_no |
61-
| testURL.swift:24:22:24:22 | passwd | semmle.label | passwd |
62-
| testURL.swift:28:22:28:55 | ... .+(_:_:) ... | semmle.label | ... .+(_:_:) ... |
63-
| testURL.swift:28:55:28:55 | e_mail | semmle.label | e_mail |
64-
| testURL.swift:30:22:30:57 | ... .+(_:_:) ... | semmle.label | ... .+(_:_:) ... |
65-
| testURL.swift:30:57:30:57 | a_homeaddr_z | semmle.label | a_homeaddr_z |
66-
| testURL.swift:32:22:32:55 | ... .+(_:_:) ... | semmle.label | ... .+(_:_:) ... |
67-
| testURL.swift:32:55:32:55 | resident_ID | semmle.label | resident_ID |
63+
| testURL.swift:39:18:39:50 | ... .+(_:_:) ... | semmle.label | ... .+(_:_:) ... |
64+
| testURL.swift:39:50:39:50 | passwd | semmle.label | passwd |
65+
| testURL.swift:41:18:41:51 | ... .+(_:_:) ... | semmle.label | ... .+(_:_:) ... |
66+
| testURL.swift:41:51:41:51 | account_no | semmle.label | account_no |
67+
| testURL.swift:42:18:42:51 | ... .+(_:_:) ... | semmle.label | ... .+(_:_:) ... |
68+
| testURL.swift:42:51:42:51 | credit_card_no | semmle.label | credit_card_no |
69+
| testURL.swift:46:22:46:22 | passwd | semmle.label | passwd |
70+
| testURL.swift:50:18:50:51 | ... .+(_:_:) ... | semmle.label | ... .+(_:_:) ... |
71+
| testURL.swift:50:51:50:51 | e_mail | semmle.label | e_mail |
72+
| testURL.swift:52:18:52:53 | ... .+(_:_:) ... | semmle.label | ... .+(_:_:) ... |
73+
| testURL.swift:52:53:52:53 | a_homeaddr_z | semmle.label | a_homeaddr_z |
74+
| testURL.swift:54:18:54:51 | ... .+(_:_:) ... | semmle.label | ... .+(_:_:) ... |
75+
| testURL.swift:54:51:54:51 | resident_ID | semmle.label | resident_ID |
76+
| testURL.swift:73:18:73:67 | ... .+(_:_:) ... | semmle.label | ... .+(_:_:) ... |
77+
| testURL.swift:73:52:73:67 | call to get_secret_key() | semmle.label | call to get_secret_key() |
78+
| testURL.swift:75:18:75:69 | ... .+(_:_:) ... | semmle.label | ... .+(_:_:) ... |
79+
| testURL.swift:75:53:75:69 | call to get_cert_string() | semmle.label | call to get_cert_string() |
80+
| testURL.swift:96:18:96:18 | "..." | semmle.label | "..." |
81+
| testURL.swift:96:51:96:51 | certificate | semmle.label | certificate |
82+
| testURL.swift:104:16:104:57 | call to SecKeyCopyExternalRepresentation(_:_:) | semmle.label | call to SecKeyCopyExternalRepresentation(_:_:) |
83+
| testURL.swift:105:6:105:10 | let ...? [some:0] | semmle.label | let ...? [some:0] |
84+
| testURL.swift:105:10:105:10 | string | semmle.label | string |
85+
| testURL.swift:105:19:105:53 | call to String.init(data:encoding:) [some:0] | semmle.label | call to String.init(data:encoding:) [some:0] |
86+
| testURL.swift:105:32:105:32 | data | semmle.label | data |
87+
| testURL.swift:106:20:106:20 | "..." | semmle.label | "..." |
6888
subpaths
6989
| testSend.swift:60:17:60:17 | password | testSend.swift:41:10:41:18 | data | testSend.swift:41:45:41:45 | data | testSend.swift:60:13:60:25 | call to pad(_:) |
7090
| testSend.swift:94:27:94:30 | .password | testSend.swift:86:7:86:7 | self | file://:0:0:0:0 | .value | testSend.swift:94:27:94:39 | .value |
@@ -85,10 +105,14 @@ subpaths
85105
| testSend.swift:79:27:79:30 | .BankCardNo | testSend.swift:79:27:79:30 | .BankCardNo | testSend.swift:79:27:79:30 | .BankCardNo | This operation transmits '.BankCardNo', which may contain unencrypted sensitive data from $@. | testSend.swift:79:27:79:30 | .BankCardNo | .BankCardNo |
86106
| testSend.swift:80:27:80:30 | .MyCreditRating | testSend.swift:80:27:80:30 | .MyCreditRating | testSend.swift:80:27:80:30 | .MyCreditRating | This operation transmits '.MyCreditRating', which may contain unencrypted sensitive data from $@. | testSend.swift:80:27:80:30 | .MyCreditRating | .MyCreditRating |
87107
| testSend.swift:94:27:94:39 | .value | testSend.swift:94:27:94:30 | .password | testSend.swift:94:27:94:39 | .value | This operation transmits '.value', which may contain unencrypted sensitive data from $@. | testSend.swift:94:27:94:30 | .password | .password |
88-
| testURL.swift:17:22:17:54 | ... .+(_:_:) ... | testURL.swift:17:54:17:54 | passwd | testURL.swift:17:22:17:54 | ... .+(_:_:) ... | This operation transmits '... .+(_:_:) ...', which may contain unencrypted sensitive data from $@. | testURL.swift:17:54:17:54 | passwd | passwd |
89-
| testURL.swift:19:22:19:55 | ... .+(_:_:) ... | testURL.swift:19:55:19:55 | account_no | testURL.swift:19:22:19:55 | ... .+(_:_:) ... | This operation transmits '... .+(_:_:) ...', which may contain unencrypted sensitive data from $@. | testURL.swift:19:55:19:55 | account_no | account_no |
90-
| testURL.swift:20:22:20:55 | ... .+(_:_:) ... | testURL.swift:20:55:20:55 | credit_card_no | testURL.swift:20:22:20:55 | ... .+(_:_:) ... | This operation transmits '... .+(_:_:) ...', which may contain unencrypted sensitive data from $@. | testURL.swift:20:55:20:55 | credit_card_no | credit_card_no |
91-
| testURL.swift:24:22:24:22 | passwd | testURL.swift:24:22:24:22 | passwd | testURL.swift:24:22:24:22 | passwd | This operation transmits 'passwd', which may contain unencrypted sensitive data from $@. | testURL.swift:24:22:24:22 | passwd | passwd |
92-
| testURL.swift:28:22:28:55 | ... .+(_:_:) ... | testURL.swift:28:55:28:55 | e_mail | testURL.swift:28:22:28:55 | ... .+(_:_:) ... | This operation transmits '... .+(_:_:) ...', which may contain unencrypted sensitive data from $@. | testURL.swift:28:55:28:55 | e_mail | e_mail |
93-
| testURL.swift:30:22:30:57 | ... .+(_:_:) ... | testURL.swift:30:57:30:57 | a_homeaddr_z | testURL.swift:30:22:30:57 | ... .+(_:_:) ... | This operation transmits '... .+(_:_:) ...', which may contain unencrypted sensitive data from $@. | testURL.swift:30:57:30:57 | a_homeaddr_z | a_homeaddr_z |
94-
| testURL.swift:32:22:32:55 | ... .+(_:_:) ... | testURL.swift:32:55:32:55 | resident_ID | testURL.swift:32:22:32:55 | ... .+(_:_:) ... | This operation transmits '... .+(_:_:) ...', which may contain unencrypted sensitive data from $@. | testURL.swift:32:55:32:55 | resident_ID | resident_ID |
108+
| testURL.swift:39:18:39:50 | ... .+(_:_:) ... | testURL.swift:39:50:39:50 | passwd | testURL.swift:39:18:39:50 | ... .+(_:_:) ... | This operation transmits '... .+(_:_:) ...', which may contain unencrypted sensitive data from $@. | testURL.swift:39:50:39:50 | passwd | passwd |
109+
| testURL.swift:41:18:41:51 | ... .+(_:_:) ... | testURL.swift:41:51:41:51 | account_no | testURL.swift:41:18:41:51 | ... .+(_:_:) ... | This operation transmits '... .+(_:_:) ...', which may contain unencrypted sensitive data from $@. | testURL.swift:41:51:41:51 | account_no | account_no |
110+
| testURL.swift:42:18:42:51 | ... .+(_:_:) ... | testURL.swift:42:51:42:51 | credit_card_no | testURL.swift:42:18:42:51 | ... .+(_:_:) ... | This operation transmits '... .+(_:_:) ...', which may contain unencrypted sensitive data from $@. | testURL.swift:42:51:42:51 | credit_card_no | credit_card_no |
111+
| testURL.swift:46:22:46:22 | passwd | testURL.swift:46:22:46:22 | passwd | testURL.swift:46:22:46:22 | passwd | This operation transmits 'passwd', which may contain unencrypted sensitive data from $@. | testURL.swift:46:22:46:22 | passwd | passwd |
112+
| testURL.swift:50:18:50:51 | ... .+(_:_:) ... | testURL.swift:50:51:50:51 | e_mail | testURL.swift:50:18:50:51 | ... .+(_:_:) ... | This operation transmits '... .+(_:_:) ...', which may contain unencrypted sensitive data from $@. | testURL.swift:50:51:50:51 | e_mail | e_mail |
113+
| testURL.swift:52:18:52:53 | ... .+(_:_:) ... | testURL.swift:52:53:52:53 | a_homeaddr_z | testURL.swift:52:18:52:53 | ... .+(_:_:) ... | This operation transmits '... .+(_:_:) ...', which may contain unencrypted sensitive data from $@. | testURL.swift:52:53:52:53 | a_homeaddr_z | a_homeaddr_z |
114+
| testURL.swift:54:18:54:51 | ... .+(_:_:) ... | testURL.swift:54:51:54:51 | resident_ID | testURL.swift:54:18:54:51 | ... .+(_:_:) ... | This operation transmits '... .+(_:_:) ...', which may contain unencrypted sensitive data from $@. | testURL.swift:54:51:54:51 | resident_ID | resident_ID |
115+
| testURL.swift:73:18:73:67 | ... .+(_:_:) ... | testURL.swift:73:52:73:67 | call to get_secret_key() | testURL.swift:73:18:73:67 | ... .+(_:_:) ... | This operation transmits '... .+(_:_:) ...', which may contain unencrypted sensitive data from $@. | testURL.swift:73:52:73:67 | call to get_secret_key() | call to get_secret_key() |
116+
| testURL.swift:75:18:75:69 | ... .+(_:_:) ... | testURL.swift:75:53:75:69 | call to get_cert_string() | testURL.swift:75:18:75:69 | ... .+(_:_:) ... | This operation transmits '... .+(_:_:) ...', which may contain unencrypted sensitive data from $@. | testURL.swift:75:53:75:69 | call to get_cert_string() | call to get_cert_string() |
117+
| testURL.swift:96:18:96:18 | "..." | testURL.swift:96:51:96:51 | certificate | testURL.swift:96:18:96:18 | "..." | This operation transmits '"..."', which may contain unencrypted sensitive data from $@. | testURL.swift:96:51:96:51 | certificate | certificate |
118+
| testURL.swift:106:20:106:20 | "..." | testURL.swift:104:16:104:57 | call to SecKeyCopyExternalRepresentation(_:_:) | testURL.swift:106:20:106:20 | "..." | This operation transmits '"..."', which may contain unencrypted sensitive data from $@. | testURL.swift:104:16:104:57 | call to SecKeyCopyExternalRepresentation(_:_:) | call to SecKeyCopyExternalRepresentation(_:_:) |

swift/ql/test/query-tests/Security/CWE-311/SensitiveExprs.expected

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,8 @@
8787
| testCoreData.swift:91:10:91:10 | passwd | label:passwd, type:credential |
8888
| testCoreData.swift:92:10:92:10 | passwd | label:passwd, type:credential |
8989
| testCoreData.swift:93:10:93:10 | passwd | label:passwd, type:credential |
90+
| testCoreData.swift:128:15:128:33 | call to generateSecretKey() | label:generateSecretKey, type:credential |
91+
| testCoreData.swift:129:15:129:30 | call to getCertificate() | label:getCertificate, type:credential |
9092
| testGRDB.swift:73:57:73:57 | password | label:password, type:credential |
9193
| testGRDB.swift:76:43:76:43 | password | label:password, type:credential |
9294
| testGRDB.swift:81:45:81:45 | password | label:password, type:credential |
@@ -163,10 +165,14 @@
163165
| testSend.swift:79:27:79:30 | .BankCardNo | label:BankCardNo, type:private information |
164166
| testSend.swift:80:27:80:30 | .MyCreditRating | label:MyCreditRating, type:private information |
165167
| testSend.swift:94:27:94:30 | .password | label:password, type:credential |
166-
| testURL.swift:17:54:17:54 | passwd | label:passwd, type:credential |
167-
| testURL.swift:19:55:19:55 | account_no | label:account_no, type:private information |
168-
| testURL.swift:20:55:20:55 | credit_card_no | label:credit_card_no, type:private information |
169-
| testURL.swift:24:22:24:22 | passwd | label:passwd, type:credential |
170-
| testURL.swift:28:55:28:55 | e_mail | label:e_mail, type:private information |
171-
| testURL.swift:30:57:30:57 | a_homeaddr_z | label:a_homeaddr_z, type:private information |
172-
| testURL.swift:32:55:32:55 | resident_ID | label:resident_ID, type:private information |
168+
| testURL.swift:39:50:39:50 | passwd | label:passwd, type:credential |
169+
| testURL.swift:41:51:41:51 | account_no | label:account_no, type:private information |
170+
| testURL.swift:42:51:42:51 | credit_card_no | label:credit_card_no, type:private information |
171+
| testURL.swift:46:22:46:22 | passwd | label:passwd, type:credential |
172+
| testURL.swift:50:51:50:51 | e_mail | label:e_mail, type:private information |
173+
| testURL.swift:52:53:52:53 | a_homeaddr_z | label:a_homeaddr_z, type:private information |
174+
| testURL.swift:54:51:54:51 | resident_ID | label:resident_ID, type:private information |
175+
| testURL.swift:73:52:73:67 | call to get_secret_key() | label:get_secret_key, type:credential |
176+
| testURL.swift:75:53:75:69 | call to get_cert_string() | label:get_cert_string, type:credential |
177+
| testURL.swift:96:51:96:51 | certificate | label:certificate, type:credential |
178+
| testURL.swift:104:16:104:57 | call to SecKeyCopyExternalRepresentation(_:_:) | label:credential, type:credential |

0 commit comments

Comments
 (0)