@@ -26,9 +26,12 @@ cvmfs.fetcher.downloadCertificate = function(data_url, hash) {
26
26
return this . downloadChunk ( data_url , hash , 'X' ) ;
27
27
} ;
28
28
29
+ cvmfs . fetcher . downloadCatalog = function ( data_url , hash ) {
30
+ return this . downloadChunk ( data_url , hash , 'C' ) ;
31
+ } ;
32
+
29
33
cvmfs . fetcher . parseManifest = function ( data , repo_name ) {
30
34
const manifest = { } ;
31
- const metadata_digest = new KJUR . crypto . MessageDigest ( { alg : 'sha1' , prov : 'cryptojs' } ) ;
32
35
33
36
const lines = data . split ( '\n' ) ;
34
37
for ( const i in lines ) {
@@ -44,7 +47,7 @@ cvmfs.fetcher.parseManifest = function(data, repo_name) {
44
47
manifest . catalog_size = parseInt ( tail ) ;
45
48
break ;
46
49
case 'C' :
47
- manifest . catalog_hash = tail ;
50
+ manifest . catalog_hash = new cvmfs . util . hash ( tail ) ;
48
51
break ;
49
52
case 'D' :
50
53
manifest . ttl = parseInt ( tail ) ;
@@ -53,10 +56,10 @@ cvmfs.fetcher.parseManifest = function(data, repo_name) {
53
56
manifest . garbage_collectable = ( tail === 'yes' ) ;
54
57
break ;
55
58
case 'H' :
56
- manifest . history_hash = tail ;
59
+ manifest . history_hash = new cvmfs . util . hash ( tail ) ;
57
60
break ;
58
61
case 'M' :
59
- manifest . json_hash = tail ;
62
+ manifest . json_hash = new cvmfs . util . hash ( tail ) ;
60
63
break ;
61
64
case 'N' :
62
65
if ( tail !== repo_name ) return undefined ;
@@ -72,27 +75,28 @@ cvmfs.fetcher.parseManifest = function(data, repo_name) {
72
75
manifest . published_timestamp = parseInt ( tail ) ;
73
76
break ;
74
77
case 'X' :
75
- manifest . certificate_hash = tail ;
78
+ manifest . certificate_hash = new cvmfs . util . hash ( tail ) ;
76
79
break ;
77
80
}
78
81
79
82
if ( head === '-' ) {
80
83
const j = ( parseInt ( i ) + 1 ) . toString ( ) ;
81
- manifest . metadata_hash = lines [ j ] ;
84
+ manifest . metadata_hash = new cvmfs . util . hash ( lines [ j ] ) ;
82
85
break ;
83
86
}
84
-
85
- metadata_digest . updateString ( line + '\n' )
86
87
}
87
88
88
89
if ( manifest . catalog_hash === undefined ||
89
90
manifest . root_hash === undefined ||
90
91
manifest . ttl === undefined ||
91
92
manifest . revision === undefined ) return undefined ;
92
93
93
- if ( manifest . metadata_hash !== metadata_digest . digest ( ) ) return undefined ;
94
+ const metadata = data . substring ( 0 , data . search ( '--' ) ) ;
95
+ const computed_metadata_hash = cvmfs . util . digestString ( metadata , manifest . metadata_hash . alg ) ;
96
+ if ( manifest . metadata_hash . hex !== computed_metadata_hash ) return undefined ;
94
97
95
- const signature = data . substr ( data . search ( '-' ) + 3 /*(--\n)*/ + 40 /*(SHA1 hex len)*/ + 1 /*(\n)*/ ) ;
98
+ var signature = data . substr ( data . search ( '--' ) + 3 /*(--\n)*/ ) ;
99
+ signature = signature . substr ( signature . search ( '\n' ) + 1 /*\n*/ ) ;
96
100
manifest . signature_hex = cvmfs . util . stringToHex ( signature ) ;
97
101
98
102
return manifest ;
@@ -104,9 +108,13 @@ cvmfs.fetcher.fetchManifest = function(repo_url, repo_name) {
104
108
} ;
105
109
106
110
cvmfs . fetcher . parseWhitelist = function ( data , repo_name ) {
107
- const metadata = data . substr ( 0 , data . search ( '-' ) ) ;
108
- const metadata_hash = data . substr ( metadata . length + 3 /*(--\n)*/ , 40 /*(SHA1 hex len)*/ ) ;
109
- if ( metadata_hash !== KJUR . crypto . Util . sha1 ( metadata ) ) return undefined ;
111
+ const metadata = data . substr ( 0 , data . search ( '--' ) ) ;
112
+ var metadata_hash_str = data . substr ( metadata . length + 3 /*(--\n)*/ ) ;
113
+ metadata_hash_str = metadata_hash_str . substr ( 0 , metadata_hash_str . search ( '\n' ) ) ;
114
+
115
+ const metadata_hash = new cvmfs . util . hash ( metadata_hash_str ) ;
116
+ const computed_metadata_hash = cvmfs . util . digestString ( metadata , metadata_hash . alg ) ;
117
+ if ( metadata_hash . hex !== computed_metadata_hash ) return undefined ;
110
118
111
119
const whitelist = { metadata_hash : metadata_hash } ;
112
120
const lines = metadata . split ( '\n' ) ;
@@ -122,9 +130,10 @@ cvmfs.fetcher.parseWhitelist = function(data, repo_name) {
122
130
parseInt ( expiry_line . substr ( 9 , 2 ) )
123
131
) ;
124
132
125
- whitelist . certificate_fingerprint = lines [ 3 ] . replace ( / \: / g, '' ) . toLowerCase ( ) ;
133
+ whitelist . certificate_fingerprint = new cvmfs . util . hash ( lines [ 3 ] . replace ( / \: / g, '' ) . toLowerCase ( ) ) ;
126
134
127
- const signature = data . substr ( metadata . length + 3 /*(--\n)*/ + 40 /*(SHA1 hex len)*/ + 1 /*(\n)*/ ) ;
135
+ var signature = data . substr ( metadata . length + 3 /*(--\n)*/ ) ;
136
+ signature = signature . substr ( signature . search ( '\n' ) + 1 /*(\n)*/ ) ;
128
137
whitelist . signature_hex = cvmfs . util . stringToHex ( signature ) ;
129
138
130
139
return whitelist ;
@@ -136,11 +145,11 @@ cvmfs.fetcher.fetchWhitelist = function(repo_url, repo_name) {
136
145
} ;
137
146
138
147
cvmfs . fetcher . fetchCertificate = function ( data_url , cert_hash ) {
139
- const data = cvmfs . fetcher . downloadCertificate ( data_url , cert_hash ) ;
148
+ const data = cvmfs . fetcher . downloadCertificate ( data_url , cert_hash . download_handle ) ;
140
149
141
150
const data_hex = cvmfs . util . stringToHex ( data ) ;
142
- const data_hash = KJUR . crypto . Util . hashHex ( data_hex , 'sha1' ) ;
143
- if ( data_hash !== cert_hash ) return undefined ;
151
+ const data_hash = cvmfs . util . digestHex ( data_hex , cert_hash . alg ) ;
152
+ if ( data_hash !== cert_hash . hex ) return undefined ;
144
153
145
154
const data_deflated = pako . inflate ( data ) ;
146
155
const decoder = new TextDecoder ( "utf-8" ) ;
@@ -149,4 +158,15 @@ cvmfs.fetcher.fetchCertificate = function(data_url, cert_hash) {
149
158
const certificate = new X509 ( ) ;
150
159
certificate . readCertPEM ( pem ) ;
151
160
return certificate ;
161
+ } ;
162
+
163
+ cvmfs . fetcher . fetchCatalog = function ( data_url , catalog_hash ) {
164
+ const data = cvmfs . fetcher . downloadCatalog ( data_url , catalog_hash . download_handle ) ;
165
+
166
+ const data_hex = cvmfs . util . stringToHex ( data ) ;
167
+ const data_hash = cvmfs . util . digestHex ( data_hex , catalog_hash . alg ) ;
168
+ if ( data_hash !== catalog_hash . hex ) return undefined ;
169
+
170
+ const db_data = pako . inflate ( data ) ;
171
+ return new SQL . Database ( db_data ) ;
152
172
} ;
0 commit comments